RNN序列模型介绍
5.1 序列模型
5.1.1 RNN结构介绍
在CNN模型中一定是要求固定长度的输入和输出,而RNN单元的内部结构如下图所示。
RNN序列是可以有多种结构的,并且每种结构下又可以有多种变体。
One-to-n的结构如下,圆圈或是方块表示的是向量,一个箭头就表示对该向量做一次变换。
|
|
one-to-n 的结构可以用来从图像生成文字(image caption),此时输入的X就是图像的特征,而输出的y序列就是一段句子,就像看图说话等。
N-to-n的结构如下,要求输入序列和输出序列是等长的。
而n-to-one的结构主要是用来做序列分类,如下所示。
RNN存在的问题:
- 当输入序列过长时,RNN后面序列的特征无法获得前面的特征,导致长期依赖(Long Term Dependency)问题。
- 梯度爆炸和梯度消失。梯度爆炸可以通过设定梯度阈值来解决。梯度消失是由于权值矩阵循环相乘导致在长期依赖中梯度过小。因为为了让h4依然能够获得h1时刻的特征,就要求梯度尽可能小,可能导致梯度消失(Vanishing Gradient)。
5.1.2 LSTM
LSTM是1997年第一次提出,在深度学习时代大放异彩,很好的抑制了原始RNN算法中的梯度消失问题。LSTM单元的内部结构如下图所示。每个黄色方框表示一个神经网络层,由权值,偏置以及**函数组成;每个粉色圆圈表示元素级别操作。
其中有几个特定称呼:
单元状态(cell state) |
|
遗忘门
表示Ct-1的哪些特征被用于计算Ct。 |
|
输入门
|
|
输出门
Ot是输出门。其中ot的作用类似ft和it,是用来控制一个比例的。
|
|
5.1.3 GRU
GRU(Gate Recurrent Unit)在2014年提出,与LSTM功能一样,优势是计算简单快速。
r是重置门控(reset gate),z是控制更新的门控(update gate) |
|
GRU只有两个门控状态。使用了
,是经过重置门重置过的前一个隐藏状态
,表示是对之前状态的选择性记忆。计算
的阶段包含了遗忘和记忆,门控z越接近1代表记忆越多,越接近0代表遗忘越多。
LSTM和GRU的关系如下:(1)GRU,LSTM是表现最好的模型;(2)GRU的在除了语言模型的场景中表现均超过LSTM;(3)LSTM的输出门的偏置的均值初始化为1时,LSTM的性能接近GRU;(4)在LSTM中,门的重要性排序是遗忘门 > 输入门 > 输出门。
5.1.4 Multi-layer RNN
RNN也可以有多层结构,原理上没有什么特别之处,其中隐含层的输入输出可以是多种变体结构,下图是一个例子,且每一个cell unit可以是LSTM、GRU等。
5.1.5 Bi-LSTM
LSTM的直观问题就是无法编码从后向前的信息,比如文本情感分类任务中“这个餐厅脏的不行”,这里“不行”是对“餐厅”的形容,通过BiLSTM可以更好的捕捉双向语义关系。注意前向编码和后向编码的向量最终是要拼接在一起,形式可以有多种,比如以下两种形式。
关于RNN及上面各种变体的tf代码示例参考
https://github.com/aymericdamien/TensorFlow-Examples/。
其中RNN的TF cell介绍见:
RNN建模见:
https://github.com/weidong1/tf_ai_algorithm/blob/master/tf_examples/rnn_examples/tf_rnn.py
BiLSTM建模见:
https://github.com/weidong1/tf_ai_algorithm/blob/master/tf_examples/rnn_examples/tf_bilstm.py
Multi-layer RNN建模见: