李飞飞徒弟Karpathy的著名博文The Unreasonable Effectiveness of Recurrent Neural Networks阐述了RNN(LSTM)的各种magic之处,并提供code实现简单的词生成。

原文地址;http://karpathy.github.io/2015/05/21/rnn-effectiveness/

Recurrent Neural Networks

  • sequence

Vanilla Neural Networks (and also Convolutional Networks)经常受限于使用fixed-size的输入和输出,同时由于layer的数量固定,所以也必然是fixed-sized computational steps。RNN令人振奋的核心之处就在于提供了over sequences of vectors的操作,无论是input output还是最常见的both of them。

RNNs combine the input vector with their state vector with a fixed (but learned) function to produce a new state vector. This can in programming terms be interpreted as running a fixed program with certain inputs and some internal variables.(大师的归纳能力就是强悍)。对于非序列化的数据(如图片)也可以使用RNN控制状态来进行训练。For instance, the figure below shows results from two very nice papers from DeepMind. On the left, an algorithm learns a recurrent network policy that steers its attention around an image; In particular, it learns to read out house numbers from left to right (Ba et al.). On the right, a recurrent network generates images of digits by learning to sequentially add color to a canvas (Gregor et al.)。

  • Computation

相对来说,RNN的API非常简单

output vector’s contents are influenced not only by the input you just fed in, but also on the entire history of inputs you’ve fed in in the past.

对于一个简单的RNN class来说,其实现如下:

h是仅有的hidden vector(初始化为0),待学习参数W_hh, W_xh,W_hy

  • Going Deep

RNN也可以像寻常神经网络一样进行层的堆叠

In other words we have two separate RNNs: One RNN is receiving the input vectors and the second RNN is receiving the output of the first RNN as its input. Except neither of these RNNs know or care - it’s all just vectors coming in and going out, and some gradients flowing through each module during backpropagation.

  • Getting fancy

对于改进版的LSTM,作者不过多的做解释说明,差别就在计算self.h时,采用了更多的门控制来进行更新操作,后续的网络默认都使用LSTM。

Character-Level Language Models

了解了 how RNN work后,这章我们训练一个RNN character-level language models。一个例程,假定我们有了字母表“helo”包含四个字母,training sequence是单词“hello”,则可以划分出4个训练用例:1. The probability of “e” should be likely given the context of “h”, 2. “l” should be likely in the context of “he”, 3. “l” should also be likely given the context of “hel”, and finally 4. “o” should be likely given the context of “hell”.每个字母被编码成one-hot形式被送入RNN网络(每个字母调用一次step),每次输出一个代表概率的4维向量

对于输出的四维向量来说,我们的目标是将其中正确表达的字母所在维度的值(图中绿色的值)通过BP调整3个参数来提高,并且降低其他维度的值。

Fun with RNNs

接下来是代码秀时间,作者秀了一下用简单的RNN/LSTM生成的Paul Graham ,莎士比亚,维基百科(html),latex,Linux source code等等产物。

由于Ka大神没有对LSTM做过多的阐述,以下LSTM相关的笔记来自简书《理解 LSTM 网络》

地址:https://www.jianshu.com/p/9dc9f41f0b29

将RNN展开

这个图其实不太好,不太直观的地方在于没有清晰地展示出循环传递的到底是什么数据(水平箭头方向),实则就是$h_t$

RNN尝试解决每一步的输出和之前输入信息(隐含以前每一步的输出信息)的依赖关系,但是当时间轴被拉得很长时,问题就出来了,网络会逐渐丧失长期记忆的依赖关系(梯度消失 无法更新)。Long Short Term正是RNN的改良品种。

LSTM中细胞状态$C_t$的传递与更新,经过了下面的3个门单元(每个门单元包含一个 sigmoid 神经网络层和一个 pointwise 乘法)运算,更新到下一步

  • 忘记门

输入:&h_{t-1}& 、$x_t$

输出:一个0到1的数值,表示记忆$c_{t-1}$保留的程度

  • 输入层门

决定哪些新信息需要被存放在cell中

输入:&h_{t-1}& 、$x_t$

输出:$i_t$(决定我们需要更新什么值)

同时输出一个(加入到状态中)

  • 细胞更新

将$c_{t-1}$更新为$c_t$ 前面遗忘门和输入门准备好的数据,派上用场了

  • 输出

最终输出的结果$h_t$依赖于前面计算好的$C_t$

各种变种LTSM:

让各个门层也接受细胞状态输入的peephole connection:

coupled 忘记和输入门:

Gated Recurrent Unit (GRU):

将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。

《The Unreasonable Effectiveness of Recurrent Neural Networks》阅读笔记的更多相关文章

  1. 阅读《RobHess的SIFT源码分析:综述》笔记

    今天总算是机缘巧合的找到了照样一篇纲要性质的文章. 如是能早一些找到就好了.不过“在你认为为时已晚的时候,其实还为时未晚”倒是也能聊以自慰,不过不能经常这样迷惑自己,毕竟我需要开始跑了! 就照着这个大 ...

  2. RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件

    SIFT源码分析系列文章的索引在这里:RobHess的SIFT源码分析:综述 imgfeatures.h中有SIFT特征点结构struct feature的定义,除此之外还有一些特征点的导入导出以及特 ...

  3. RobHess的SIFT源码分析:综述

    最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究. 使用OpenCV中自带的Stitc ...

  4. 阅读《RobHess的SIFT源码分析:综述》笔记2

    今天开始磕代码部分. part1: 1. sift特征提取. img1_Feat = cvCloneImage(img1);//复制图1,深拷贝,用来画特征点 img2_Feat = cvCloneI ...

  5. element-ui button组件 radio组件源码分析整理笔记(一)

    Button组件 button.vue <template> <button class="el-button" @click="handleClick ...

  6. element-ui 组件源码分析整理笔记目录

    element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...

  7. element-ui Carousel 走马灯源码分析整理笔记(十一)

    Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...

  8. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  9. element-ui MessageBox组件源码分析整理笔记(十二)

    MessageBox组件源码,有添加部分注释 main.vue <template> <transition name="msgbox-fade"> < ...

  10. element-ui switch组件源码分析整理笔记(二)

    源码如下: <template> <div class="el-switch" :class="{ 'is-disabled': switchDisab ...

随机推荐

  1. 数列分段Section II(二分)

    洛谷传送门 输入时处理出最小的答案和最大的答案,然后二分答案即可. 其余细节看代码 #include <iostream> #include <cstdio> using na ...

  2. 子串(codevs 4560)

    题目描述 Description 有两个仅包含小写英文字母的字符串A和B.现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,请问 ...

  3. [NOIP2002] 提高组 洛谷P1031 均分纸牌

    题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...

  4. ***iOS学习之Table View的简单使用和DEMO示例(共Plain普通+Grouped分组两种)

    Table View简单描述: 在iPhone和其他iOS的很多程序中都会看到Table View的出现,除了一般的表格资料展示之外,设置的属性资料往往也用到Table View,Table View ...

  5. Visual Studio 2017 RC的坑

    ASP.NET Core Project add Docker Project Support的问题 执行上面操作以后,如果本机没有装好docker,就会一直报错,无法build通过,无论你在Proj ...

  6. SpringDataJPA入门2

    SpringDataJPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系型数据库的映射,此类Java对象成为JPA实体或简称实体.实体通常与底层数据库中的单个关系表相关联 ...

  7. [转] SQL SERVER 2008 R2 安装中的账户设置问题

    故纸堆 原文:SQL SERVER 2008安装中设置账户的问题,2013-7 在安装SQL Server 2008数据库服务器的时候,服务器有可能处于以下几种环境中: ①工作组环境下的服务器 (Wo ...

  8. 学习LaTex

    MarkDown+Latex 本来想学习latex编辑公式的,在博客园内置的MarkDown编辑器已经支持Latex公式解析了,如下: $$x=\frac{-b\pm\sqrt{b^2-4ac}}{2 ...

  9. linux用户列表

    centos上面不知道添加了多少个账户,今天想清理一下,但是以前还未查看过linux用户列表, 一般情况下是 cat /etc/passwd 可以查看所有用户的列表 w 可以查看当前活跃的用户列表 c ...

  10. win7右下角无线网图标显示未连接,但是实际上已连接上,也能上网

    首先,要确实是不是服务启动的问题,方法很简单,重新启动电脑就可以. 如果问题依旧,那么按下Win+R快捷键,输入“services.msc”,打开服务界面. 然后会看到右侧窗口出现好多设置项,找到“R ...