循环神经网络与LSTM

1. 循环神经网络

①基本结构

在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全链接的,每层之间的节点是无链接的。可是这种普通的神经网络对于不少问题却无能无力。例如,你要预测句子的下一个单词是什么,通常须要用到前面的单词,由于一个句子中先后单词并非独立的。RNN(Recurrent Neuron Network)是一种对序列数据建模的神经网络,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点再也不无链接而是有链接的,而且隐藏层的输入不只包括输入层的输出还包括上一时刻隐藏层的输出。下面是一个RNN模型的示例图,其中:html

  • xt 是t时刻的输入,例如单词中相应的one-hot向量
  • st 是t时刻的隐状态(memory),基于上一时刻的隐状态和当前输入获得: st=f(Uxt+Wst1) ,其中 f 通常是非线性的激活函数,在计算 s0 时,即第一个单词的隐藏层状态,须要用到 s1 ,可是其并不存在,在实现中通常置为0
  • ot 表示t时刻的输出,以下个单词的向量表示, ot=softmax(Vst)
  • 须要注意的是:在传统神经网络中,每个网络层的参数是不共享的。而在RNN中,全部层次均共享一样的参数(例如上例中的 U,V,W )。其反应出RNN中的每一步都在作相同的事,只是输入不一样,所以大大地下降了网络中须要学习的参数。

图片名称

普通神经网络和卷积神经网络的一个显而易见的局限就是他们接收一个固定尺寸的向量做为输入(好比一张图像),而且产生一个固定尺寸的向量做为输出(好比针对不一样分类的几率)。不只如此,这些模型甚至对于上述映射的演算操做的步骤也是固定的(好比模型中的层数)。RNN的不一样之处在于其容许咱们对向量的序列进行操做:输入能够是序列,输出也能够是序列,在最通常化的状况下输入输出均可以是序列。下面是一些直观的例子:git

图片名称

上图中每一个正方形表明一个向量,箭头表明函数(好比矩阵乘法)。输入向量是红色,输出向量是蓝色,绿色向量装的是RNN的状态。从左至右为:github

  1. 非RNN的普经过程,从固定尺寸的输入到固定尺寸的输出(好比图像分类)。
  2. 输出是序列(例如图像标注:输入是一张图像,输出是单词的序列)。
  3. 输入是序列(例如情绪分析:输入是一个句子,输出是对句子属于正面仍是负面情绪的分类)。
  4. 输入输出都是序列(好比机器翻译:RNN输入一个英文句子输出一个法文句子)。
  5. 同步的输入输出序列(好比视频分类中,咱们将对视频的每一帧都打标签)。

经过一个有趣的应用来更深刻地加以体会:咱们将利用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算法是同样的,也包含一样的三个步骤:网络

  1. 前向计算每一个神经元的输出值;
  2. 反向计算每一个神经元的偏差项值,它是偏差函数E对神经元j的加权输入的偏导数;
  3. 计算每一个权重的梯度,最后再用随机梯度降低算法更新权重。

(1)前向计算

咱们假设输入向量x的维度是m,输出向量s的维度是n,则矩阵U的维度是n×m,矩阵W的维度是n×n。下面是前向计算展开成矩阵的样子,在这里咱们用手写体字母表示向量的一个元素,它的下标表示它是这个向量的第几个元素,它的上标表示第几个时刻:svg

(2)偏差项的计算



同理,上式第二项也是一个Jacobian矩阵:

其中,diag[a]表示根据向量a建立一个对角矩阵。最后,将两项合在一块儿,可得:

式3就是将偏差项沿时间反向传播的算法,循环层将偏差项反向传递到上一层网络,与普通的全链接层是彻底同样的
函数


式4就是将偏差项传递到上一层算法

(3)权重梯度的计算


按照上面的规律就能够生成式5里面的矩阵。

式6就是计算循环层权重矩阵W的梯度的公式。

③梯度爆炸与梯度消失

式3中令 γ=||Wdiag[f(neti)]|| ,若是 γ>1 ,当 kt+1 会形成梯度爆炸问题;相反,若是 γ<1 ,当 kt+1 时会出现和深度前馈神经网络相似的梯度消失问题。换而言之,导数的链式法则致使了连乘的形式,从而形成梯度消失与梯度爆炸。而LSTM能避免RNN的梯度消失问题,其使用“累加”的形式计算状态,这种累加形式致使导数也是累加形式,所以避免了梯度消失。学习

2. 长短时记忆神经网络(LSTM)

①LSTM 的核心思想

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

在咱们 LSTM 中的第一步是决定咱们会从细胞状态中丢弃什么信息。这个决定经过遗忘层完成。该门会读取 ht1 xt ,输出一个在 0 到 1 之间的数值给每一个在细胞状态 Ct1 中的数字。1 表示“彻底保留”,0 表示“彻底舍弃”。
让咱们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,所以正确的代词能够被选择出来。当咱们看到新的主语,咱们但愿忘记旧的主语。

下一步是肯定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值咱们将要更新。而后,一个 tanh 层建立一个新的候选值向量, C~t ,会被加入到状态中。下一步,咱们会讲这两个信息来产生对状态的更新。
在咱们语言模型的例子中,咱们但愿增长新的主语的性别到细胞状态中,来替代旧的须要忘记的主语。

如今是更新旧细胞状态的时间了, Ct1 更新为 Ct 。前面的步骤已经决定了将会作什么,咱们如今就是实际去完成。
咱们把旧状态与 ft 相乘,丢弃掉咱们肯定须要丢弃的信息。接着加上 itC~t 。这就是新的候选值,根据咱们决定更新每一个状态的程度进行变化。
在语言模型的例子中,这就是咱们实际根据前面肯定的目标,丢弃旧代词的性别信息并添加新的信息的地方。

最终,咱们须要肯定输出什么值。这个输出将会基于咱们的细胞状态,可是也是一个过滤后的版本。首先,咱们运行一个 sigmoid 层来肯定细胞状态的哪一个部分将输出出去。接着,咱们把细胞状态经过 tanh 进行处理(获得一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终咱们仅仅会输出咱们肯定输出的那部分。
在语言模型的例子中,由于他就看到了一个 代词,可能须要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数仍是负数,这样若是是动词的话,咱们也知道动词须要进行的词形变化。

3. 参考资料