深度学习笔记(八)LSTM长短期记忆网络
上一个章节(RNN)最后的时候分析,
当t-k远大于0的时候,如果小于零,将会变成一个很小值,如果大于零,将会变成一个很多的数,前者就是梯度消失,后者就是梯度爆炸,LSTM主要是解决这个问题。梯度消失图如下:
其实,长短时记忆网络的思路比较简单。原始RNN的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。那么,假如我们再增加一个状态,即c,让它来保存长期的状态,那么问题不就解决了么?如下图所示:
新增加的状态c,称为单元状态(cell state)。我们把上图按照时间维度展开:
LSTM的关键,就是怎样控制长期状态c。在这里,LSTM的思路是使用三个控制开关。第一个开关,负责控制继续保存长期状态c;第二个开关,负责控制把即时状态输入到长期状态c;第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出。三个开关的作用如下图所示:
接下来,我们要描述一下,输出h和单元状态c的具体计算方法。
长短时记忆网络的前向计算
前面描述的开关是怎样在算法中实现的呢?这就用到了门(gate)的概念。门实际上就是一层全连接层,它的输入是一个向量,输出是一个0到1之间的实数向量。假设W是门的权重向量,是偏置项,那么门可以表示为:
门的使用,就是用门的输出向量按元素乘以我们需要控制的那个向量。因为门的输出是0到1之间的实数向量,那么,当门输出为0时,任何向量与之相乘都会得到0向量,这就相当于啥都不能通过;输出为1时,任何向量与之相乘都不会有任何改变,这就相当于啥都可以通过。因为(也就是sigmoid函数)的值域是(0,1),所以门的状态都是半开半闭的。
结果图和分析如下:
遗忘门:
最左边的遗忘门,遗忘们决定有多少重Ct-1 传播到Ct。
输入门:
输入门决定当前输入有多少保存到Ct
新的保存信息:
所以最终的保存信息为:符号*表示按元素乘
输出:
LSTM 的变体
1)其中一个流形的 LSTM 变体,就是由 Gers
& Schmidhuber (2000) 提出的,增加了 “peephole connection”。是说,我们让 门层 也会接受细胞状态的输入。
上面的图例中,我们增加了 peephole 到每个门上,但是许多论文会加入部分的 peephole 而非所有都加。
另一个变体是通过使用 coupled 忘记和输入门。不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态 。
另一个改动较大的变体是 Gated Recurrent Unit (GRU),这是由 Cho,
et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。
训练:
我们设定gate的**函数为sigmoid函数,输出的**函数为tanh函数。 训练:
其中:
参考文档: