5.1 序列模型

5.1.1 RNN结构介绍

在CNN模型中一定是要求固定长度的输入和输出,而RNN单元的内部结构如下图所示。

rnn怎么处理不等长序列 序列模型rnn的结构包含_重置

 

RNN序列是可以有多种结构的,并且每种结构下又可以有多种变体。

One-to-n的结构如下,圆圈或是方块表示的是向量,一个箭头就表示对该向量做一次变换

rnn怎么处理不等长序列 序列模型rnn的结构包含_rnn怎么处理不等长序列_02


rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_03

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_04

 

one-to-n 的结构可以用来从图像生成文字(image caption),此时输入的X就是图像的特征,而输出的y序列就是一段句子,就像看图说话等。

N-to-n的结构如下,要求输入序列和输出序列是等长的。

 

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_05

而n-to-one的结构主要是用来做序列分类,如下所示。

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_06

RNN存在的问题:

  1. 当输入序列过长时,RNN后面序列的特征无法获得前面的特征,导致长期依赖(Long Term Dependency)问题。
  2. 梯度爆炸和梯度消失。梯度爆炸可以通过设定梯度阈值来解决。梯度消失是由于权值矩阵循环相乘导致在长期依赖中梯度过小。因为为了让h4依然能够获得h1时刻的特征,就要求梯度尽可能小,可能导致梯度消失(Vanishing Gradient)。

 

5.1.2 LSTM

LSTM是1997年第一次提出,在深度学习时代大放异彩,很好的抑制了原始RNN算法中的梯度消失问题。LSTM单元的内部结构如下图所示。每个黄色方框表示一个神经网络层,由权值,偏置以及激活函数组成;每个粉色圆圈表示元素级别操作。

rnn怎么处理不等长序列 序列模型rnn的结构包含_github_07

其中有几个特定称呼:

单元状态(cell state

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_08

rnn怎么处理不等长序列 序列模型rnn的结构包含_github_09

遗忘门

 

rnn怎么处理不等长序列 序列模型rnn的结构包含_rnn怎么处理不等长序列_10

,

表示Ct-1的哪些特征被用于计算Ct

 

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_11

输入门

rnn怎么处理不等长序列 序列模型rnn的结构包含_重置_12

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_13

rnn怎么处理不等长序列 序列模型rnn的结构包含_github_14叫作输入门,it用于控制rnn怎么处理不等长序列 序列模型rnn的结构包含_rnn怎么处理不等长序列_15的哪些特征用于更新Ct。类似ft

rnn怎么处理不等长序列 序列模型rnn的结构包含_rnn怎么处理不等长序列_16表示单元状态更新值。

rnn怎么处理不等长序列 序列模型rnn的结构包含_rnn怎么处理不等长序列_17

输出门

 

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_18

rnn怎么处理不等长序列 序列模型rnn的结构包含_rnn怎么处理不等长序列_19


Ot是输出门。其中ot的作用类似ftit,是用来控制一个比例的。

 

rnn怎么处理不等长序列 序列模型rnn的结构包含_rnn怎么处理不等长序列_20

 

5.1.3 GRU

GRU(Gate Recurrent Unit)在2014年提出,与LSTM功能一样,优势是计算简单快速。

 

 

rnn怎么处理不等长序列 序列模型rnn的结构包含_github_21

r是重置门控(reset gate),z是控制更新的门控(update gate

rnn怎么处理不等长序列 序列模型rnn的结构包含_github_22

 

GRU只有两个门控状态。rnn怎么处理不等长序列 序列模型rnn的结构包含_rnn怎么处理不等长序列_23使用了

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_24

,是经过重置门重置过的前一个隐藏状态

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_25

,表示是对之前状态的选择性记忆。计算rnn怎么处理不等长序列 序列模型rnn的结构包含_github_26的阶段包含了遗忘和记忆,门控z越接近1代表记忆越多,越接近0代表遗忘越多。

LSTMGRU的关系如下:(1)GRU,LSTM是表现最好的模型;(2)GRU的在除了语言模型的场景中表现均超过LSTM;(3)LSTM的输出门的偏置的均值初始化为1时,LSTM的性能接近GRU;(4)在LSTM中,门的重要性排序是遗忘门 > 输入门 > 输出门。

 

5.1.4 Multi-layer RNN

RNN也可以有多层结构,原理上没有什么特别之处,其中隐含层的输入输出可以是多种变体结构,下图是一个例子,且每一个cell unit可以是LSTM、GRU等。

rnn怎么处理不等长序列 序列模型rnn的结构包含_重置_27

 

5.1.5 Bi-LSTM

LSTM的直观问题就是无法编码从后向前的信息,比如文本情感分类任务中“这个餐厅脏的不行”,这里“不行”是对“餐厅”的形容,通过BiLSTM可以更好的捕捉双向语义关系。注意前向编码和后向编码的向量最终是要拼接在一起,形式可以有多种,比如以下两种形式。

rnn怎么处理不等长序列 序列模型rnn的结构包含_github_28

 

rnn怎么处理不等长序列 序列模型rnn的结构包含_建模_29

 

 

关于RNN及上面各种变体的tf代码示例参考

https://github.com/aymericdamien/TensorFlow-Examples/

其中RNN的TF cell介绍见:

https://github.com/weidong1/tf_ai_algorithm/blob/master/tf_examples/rnn_examples/tf_rnn_introduction.py

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建模见:

https://github.com/weidong1/tf_ai_algorithm/blob/master/tf_examples/rnn_examples/tf_multilayer_rnn.py