在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全链接的,每层之间的节点是无链接的。可是这种普通的神经网络对于不少问题却无能无力。例如,你要预测句子的下一个单词是什么,通常须要用到前面的单词,由于一个句子中先后单词并非独立的。RNN(Recurrent Neuron Network)是一种对序列数据建模的神经网络,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点再也不无链接而是有链接的,而且隐藏层的输入不只包括输入层的输出还包括上一时刻隐藏层的输出。下面是一个RNN模型的示例图,其中:html
普通神经网络和卷积神经网络的一个显而易见的局限就是他们接收一个固定尺寸的向量做为输入(好比一张图像),而且产生一个固定尺寸的向量做为输出(好比针对不一样分类的几率)。不只如此,这些模型甚至对于上述映射的演算操做的步骤也是固定的(好比模型中的层数)。RNN的不一样之处在于其容许咱们对向量的序列进行操做:输入能够是序列,输出也能够是序列,在最通常化的状况下输入输出均可以是序列。下面是一些直观的例子:git
上图中每一个正方形表明一个向量,箭头表明函数(好比矩阵乘法)。输入向量是红色,输出向量是蓝色,绿色向量装的是RNN的状态。从左至右为:github
经过一个有趣的应用来更深刻地加以体会:咱们将利用RNN训练一个字母级别的语言模型。也就是说,给RNN输入巨量的文本,而后让其建模并根据一个序列中的前一个字母,给出下一个字母的几率分布。在下面的例子中,假设咱们的字母表只由4个字母组成“helo”,而后利用训练序列“hello”训练RNN。该训练序列其实是由4个训练样本组成:1.当h为上文时,下文字母选择的几率应该是e最高。2.l应该是he的下文。3.l应该是hel文本的下文。4.o应该是hell文本的下文。web
具体来讲,该RNN的输入输出是4维,表示字典长度,隐层神经元数量是3个。咱们将会把每一个字母编码进一个1到k的向量(除对应字母为1外其他为0),而后利用 step 方法一次一个地将其输入给RNN。随后将观察到4维向量的序列(一个字母一个维度),咱们但愿绿色数字大,红色数字小。咱们将这些输出向量理解为RNN关于序列下一个字母预测的信心程度。算法
循环神经网络的参数训练能够经过随时间进行反向传播(Backpropagation Through Time,BPTT)算法,BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是同样的,也包含一样的三个步骤:网络
咱们假设输入向量x的维度是m,输出向量s的维度是n,则矩阵U的维度是n×m,矩阵W的维度是n×n。下面是前向计算展开成矩阵的样子,在这里咱们用手写体字母表示向量的一个元素,它的下标表示它是这个向量的第几个元素,它的上标表示第几个时刻:svg
式3就是将偏差项沿时间反向传播的算法,循环层将偏差项反向传递到上一层网络,与普通的全链接层是彻底同样的
函数
式3中令
Long Short-Term Memory Neural Network—— 通常就叫作 LSTM ,是一种 RNN 特殊的类型,能够学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在不少问题,LSTM 都取得至关巨大的成功,并获得了普遍的使用。LSTM 经过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非须要付出很大代价才能得到的能力!
全部 RNN 都具备一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个很是简单的结构,例如一个 tanh 层。编码
LSTM 一样是这样的结构,可是重复的模块拥有一个不一样的结构。不一样于 单一神经网络层,这里是有四个,以一种很是特殊的方式进行交互。
咱们先来熟悉一下图中使用的各类元素的图标:在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其余节点的输入。粉色的圈表明 pointwise 的操做,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一块儿的线表示向量的链接,分开的线表示内容被复制,而后分发到不一样的位置。
LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。
细胞状态相似于传送带。直接在整个链上运行,只有一些少许的线性交互。信息在上面流传保持不变会很容易。
LSTM 有经过精心设计的称做为“门”的结构来去除或者增长信息到细胞状态的能力。门是一种让信息选择式经过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操做。
Sigmoid 层输出 0 到 1 之间的数值,描述每一个部分有多少许能够经过。0 表明“不准任何量经过”,1 就指“容许任意量经过”!
LSTM 拥有三个门(输入门,遗忘门,输出门),来保护和控制细胞状态。
在咱们 LSTM 中的第一步是决定咱们会从细胞状态中丢弃什么信息。这个决定经过遗忘层完成。该门会读取
让咱们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,所以正确的代词能够被选择出来。当咱们看到新的主语,咱们但愿忘记旧的主语。
下一步是肯定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值咱们将要更新。而后,一个 tanh 层建立一个新的候选值向量,
在咱们语言模型的例子中,咱们但愿增长新的主语的性别到细胞状态中,来替代旧的须要忘记的主语。
如今是更新旧细胞状态的时间了,
咱们把旧状态与
在语言模型的例子中,这就是咱们实际根据前面肯定的目标,丢弃旧代词的性别信息并添加新的信息的地方。
最终,咱们须要肯定输出什么值。这个输出将会基于咱们的细胞状态,可是也是一个过滤后的版本。首先,咱们运行一个 sigmoid 层来肯定细胞状态的哪一个部分将输出出去。接着,咱们把细胞状态经过 tanh 进行处理(获得一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终咱们仅仅会输出咱们肯定输出的那部分。
在语言模型的例子中,由于他就看到了一个 代词,可能须要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数仍是负数,这样若是是动词的话,咱们也知道动词须要进行的词形变化。