这个视频是我学完北大曹健老师的TF课程后,觉得最绝妙的一段。
视频是北京大学曹健老师讲述的长短期记忆网络(LSTM,Long Short-Term Memory)计算过程,讲的通俗易懂,让人印象深刻。分享给大家 网易云课堂-人工智能实践:Tensorflow笔记。(https://www.icourse163.org/course/PKU-1002536002)
1. 循环神经网络(Recurrent Neural Network,RNN)
先简单介绍一下一般的RNN。借助循环核(cell)提取特征后,送入后续网络(如全连接网络Dense)进行预测等操作。RNN借助循环核从时间维度提取信息,循环核参数时间共享。
其主要形式如下图所示(图片来自台大李宏毅教授的PPT):
这里:
为当前状态下数据的输入,
表示接收到的上一个节点的输入。
为当前节点状态下的输出,而
为传递到下一个节点的输出。
通过上图的公式可以看到,输出 h' 与 x 和 h 的值都相关。
而 当前时刻循环核的输出特征y 其实就相当于一层全连接。
对这里的y如何通过 h' 计算得到往往看具体模型的使用方式。
通过序列形式的输入,我们能够得到如下形式的RNN。
循环神经网络就是借助循环核实现时间特征提取后把提取到的信息送入全连接网络,从而实现连续数据的预测。其实这和我们人类的预测是一致的:我们脑中的记忆体每个时刻都根据当前的输入而更新;当前的预测推理是根据我们以往的知识积累用固化下来的“参数矩阵”进行的推理判断。
2. 长短记忆网络(Long Short Term Memory,LSTM)
RNN面临的较大问题是无法解决长跨度依赖问题,即后面节点相对于跨度很大的前面时间节点的信息感知能力太弱。如图左上角的句子中sky可以由较短跨度的词预测出来,而右下角句子中的French与较长跨度之前的France有关系,即长跨度依赖,比较难预测。
(图片来源: https://www.jianshu.com/p/9dc9f41f0b29)
2.1 为什么需要LSTM
长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
LSTM结构(图右)和普通RNN的主要输入输出区别如下所示。
相比RNN只有一个传递状态
,LSTM有两个传输状态,一个
(cell state),和一个
(hidden state)。(Tips:RNN中的
对于LSTM中的
)其中对于传递下去的
改变得很慢,通常输出的
是上一个状态传过来的
加上一些数值。而
则在不同节点下往往会有很大的区别。
2.2 深入LSTM结构
下面具体对LSTM的内部结构来进行剖析。
首先使用LSTM的当前输入
和上一个状态传递下来的
拼接训练得到四个状态。
其中,
,
,
是由拼接向量乘以权重矩阵之后,再通过一个
激活函数转换成0到1之间的数值,来作为一种门控状态。而
则是将结果通过一个
激活函数将转换成-1到1之间的值(这里使用
是因为这里是将其做为输入数据,而不是门控信号)。
下面开始进一步介绍这四个状态在LSTM内部的使用。
是Hadamard Product,也就是操作矩阵中对应的元素相乘,因此要求两个相乘矩阵是同型的。
则代表进行矩阵加法。
LSTM内部主要有三个阶段:
1. 忘记阶段。这个阶段主要是对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。
具体来说是通过计算得到的
(f表示forget)来作为忘记门控,来控制上一个状态的
哪些需要留哪些需要忘。2. 选择记忆阶段。这个阶段将这个阶段的输入有选择性地进行“记忆”。主要是会对输入
进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一些。当前的输入内容由前面计算得到的
表示。而选择的门控信号则是由
(i代表information)来进行控制。
将上面两步得到的结果相加,即可得到传输给下一个状态的
。也就是上图中的第一个公式。
3. 输出阶段。这个阶段将决定哪些将会被当成当前状态的输出。主要是通过
来进行控制的。并且还对上一阶段得到的
进行了放缩(通过一个tanh激活函数进行变化)。与普通RNN类似,输出
往往最终也是通过
变化得到。
3. 总结
以上,就是LSTM的内部结构。通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息;而不像普通的RNN那样只能够“呆萌”地仅有一种记忆叠加方式。对很多需要“长期记忆”的任务来说,尤其好用。
我们到目前为止都还在介绍正常的 LSTM。但是不是所有的 LSTM 都长成一个样子的。实际上,几乎所有包含 LSTM 的论文都采用了微小的变体。差异非常小,但是也值得拿出来讲一下。
其中一个流形的 LSTM 变体,就是由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是说,我们让 门层 也会接受细胞状态的输入。
peephole 连接
上面的图例中,我们增加了 peephole 到每个门上,但是许多论文会加入部分的 peephole 而非所有都加。
另一个变体是通过使用 coupled 忘记和输入门。不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态 。
coupled 忘记门和输入门
另一个改动较大的变体是 Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。
GRU
这里只是部分流行的 LSTM 变体。当然还有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决长期依赖的问题,如Koutnik, et al. (2014) 提出的 Clockwork RNN。
要问哪个变体是最好的?其中的差异性真的重要吗?Greff, et al. (2015) 给出了流行变体的比较,结论是他们基本上是一样的。Jozefowicz, et al. (2015) 则在超过 1 万种 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。
Jozefowicz等人论文截图
人人都能看懂的LSTM
理解 LSTM 网络
Understanding LSTM Networks