主要是自己学习Recurrent Neural Network过程中的知识梳理。
涉及到的资料来源:
- CS224n: Natural Language Processing with Deep Learning (Lecture 8, Lecture 9, Lecture 12)
- CS231n: Convolutional Neural Networks for Visual Recognition (Lecture 10)
- Understanding LSTM Networks-colah
- NTU李宏毅的ML课程:https://www.youtube.com/watch?v=xCGidAeyS4M (Lecture 25)
Primary RNN
传统的神经网络往往只关注于当前结点,不能处理时序信息。例如在任务型问答系统的slot filling任务中,要识别出某一词对应于哪个slot:
a: 帮我订明天晚上到北京的机票。
b: 帮我订明天晚上从北京出发的机票。
a、b两句话都包含两个slot,其中“明天晚上”均为”Time“,而a中的”北京“应识别为”Destination“,b中的”北京“应识别为”Place of departure“。
因此需要一种能保留时序信息的模型,判断当前词的类别时考虑前面的信息,这样就能根据”到“或”从“来判断出到底是出发地还是目的地了。
简单RNN的网络结构如下图所示。RNN允许信息的持久化,对当前的状态保留记忆(以隐变量的方式存在,即图中的h_t)。
X_t 表示当前词的输入word vector,当前时刻的输出 y_t 由 X_t 和上一时刻的状态 h_{t-1} 共同决定。
需要注意的是,
- 每一时刻的参数W是相同的。
- 在时刻t0,状态h0由随机初始化得到。
- 设
的word vector维度为d,隐藏层的维度为
,预测类别的个数为C,即
,
,
,那么
,
,
另一个更为直观的图示:
更为通用的情况下,RNN的输入和输出个数并不是固定的,可以随特定的任务而变化,满足不同任务的需求。例如,在情感分类任务中,输入是很多的词序列,而输出只有一个;在机器翻译任务中,输入是一系列的词,输出也是一系列词,而它们之间并不是一一对应的;在词性标注任务中,每一个词对应一个分类结果,输入和输出是一一对应的。如下图:
以上我们讨论的是最简单的情况,RNN内部只有一层隐藏层,且只考虑正向的序列信息。很多情况下当前词之后的信息对当前词的预测也会产生影响,此时可以扩展为双向RNN:
而类似于传统神经网络,RNN同样也可以增加隐藏层的个数,扩展为多层:
简单RNN存在的最大问题就是梯度消失和梯度爆炸。解决梯度爆炸问题很简单,可以用较为trick的方法:clipping gradient,即如果梯度的范数大于某个给定的阈值,将梯度同比收缩。而解决梯度消失问题,就要用到下面的LSTM了。