循环神经网络系列RNN、LSTM及变种

摘要

循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。

人脑记忆原理:

 对信息的预测和记忆功能
 语言模型对当前输入信息的先后顺序
人脑的存储方式
人脑的记忆算法功能

序列

自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。
语音处理。此时,每个元素是每帧的声音信号。
时间序列问题。例如每天的股票价格等。

RNN原理
1
运行过程:

其中每个圆圈可以看作是一个单元,而且每个单元做的事情也是一样的,
因此可以折叠呈左半图的样子。用一句话解释RNN,就是一个单元结构重复使用。 

2
RNN结构的变种

N 对 1

应用:

判断处理序列分类问题,如输入一段文字判别它所属的类别,
输入一个句子判断其情感倾向,输入一段视频并判断它的类别等。

结构图:
2

1 对 N

应用:

从类别生成语音或音乐,从图像生成文字(image caption),
此时输入的X就是图像的特征,而输出的y序列就是一段句子。

结构图:
1
N 对 M

同时也是一种Encoder-Decoder模型。

应用:

机器翻译:Encoder-Decoder的最经典应用,事实上这一结构就是在机器翻译领域最先提出的
文本摘要:输入是一段文本序列,输出是这段文本序列的摘要序列。
阅读理解:将输入的文章和问题分别编码,再对其进行解码得到问题的答案。
语音识别:输入是语音信号序列,输出是文字序列。

结构图:2
2

RNN的训练方法

CNN的训练过程是一个损失递减优化的过程而RNN不同于CNN。

BPTT (back-propagation through time)

沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。

sigmoid函数的缺点:

导数值范围为(0,0.25],反向传播时会导致“梯度消失“。
tanh函数导数值范围更大,相对好一点。
sigmoid函数不是0中心对称,tanh函数是,可以使网络收敛的更好。
激活函数问题用RELU函数解决。

LSTM

LSTM网络通过精妙的门控制将短期记忆与长期记忆结合起来,
并且一定程度上解决了梯度消失的问题。

解决长期依赖问题

例如在语言模型中,需要预测的词本应该在上下文位置较近时,
RNN可以使用先前的信息并正确预测,而位置较远时,反之。
举例:

1
2
LSTM网络结构

原始结构:

使用tanh激活函数对上层细胞和本层输入进行激活后更新细胞状态。
整体上除了h在随时间流动,细胞状态c也在随时间流动,细胞状态c就代表着长期记忆。

2
LSTM结构
2
2
上图中符合意义:

黄色的矩形是学习得到的神经网络层
粉色的圆形表示一些运算操作,诸如加法乘法
黑色的单箭头表示向量的传输
两个箭头合成一个表示向量的连接
一个箭头分开表示向量的复制

LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。

细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。
信息在上面流传保持不变会很容易。

2

下图这种结构表示一个 sigmoid 神经网络层和一个 pointwise 乘法操作。

Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。
0 代表“不许任何量通过”,1 就指“允许任意量通过”!

2
门的概念

遗忘门

第一步,从上层获得的细胞状态我们使用了一个遗忘门Sigmoid函数来读取ht-1和xt,输出0~1的值给每个在细胞状态Ct-1中的数字,1表示完全保留,0表示舍弃。
2
输入门

第二步,新的信息的确定:首先、使用Sigmoid层(输入门层)去决定更新什么值it;然后使用tanh层创建一个新的候选值向量Ct,这个Ct被加入到新的细胞状态中。
2
第三步,更新细胞状态,将Ct-1更新为真正的Ct,我们把旧状态Ct-1与ft相乘,丢弃掉我们确定需要丢弃的信息。接着加上 it*Ct。这就是新的候选值真正的Ct,根据我们决定更新每个状态的程度进行变化。

到此,我们已经根据输入ht-1和xt和Ct-1完成对细胞状态的一次更新。

在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。
2
输出门

完成了细胞状态更新的同时,还要基于本次更新的细胞状态给到下一个结构一个输出。这里用输出门来完成。
首先,ht-1和xt经过Sigmoid输出为ot,确定哪些输出。
新的细胞状态使用tanh激活后,乘以ot得到最终的输出ht。
2
LSTM的变体

第一个:窥视孔连接peephole connection

与LSTM不同处在于,每一个sigmoid的输入都增加了当前的细胞状态。
2
第二个:对偶coupled 忘记和输入门

不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态 。
2

第三个: Gated Recurrent Unit (GRU)

参考博客

它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。
emmm看起来要复杂多了,慢慢梳理一下也不是很复杂。
2

第四个:SRU

xt 代表 t 时刻的输入;
W、b 代表权重和偏置;
ft 代表 t 时刻的遗忘门(forget gate);
rt 代表 t 时刻的重置门(reset gate);
ct 和 ht 分别代表 t 时刻的状态和最终的输出;
σ 和 g 分别代表Sigmoid函数和激活函数(tanh、relu);
公式中的 ⊙ 代表矩阵对应元素间的操作.
2
Github链接:https://github.com/bamtercelboo/pytorch_SRU

双向RNN\LSTM\GRU\SRU

在经典的循环神经网络中,状态的传输是从前往后单向的。然而,在有些问题中,当前时刻的输出不仅和之前的状态有关系,也和之后的状态相关。这时就需要双向RNN(BiRNN)来解决这类问题。例如预测一个语句中缺失的单词不仅需要根据前文来判断,也需要根据后面的内容,这时双向RNN就可以发挥它的作用。
双向RNN的主题结构就是两个单向RNN的结合。在每一个时刻t,输入会同时提供给这两个方向相反的RNN,而输出则是由这两个单向RNN共同决定(可以拼接或者求和等)。
同样地,将双向RNN中的RNN替换成LSTM或者GRU结构,则组成了BiLSTM和BiGRU。
2
两个问题

RNN与CNN区别?

相同点:

都有参数共享
传统的神经网络的扩展
通过前向传播反向更新并参数共享

不同:

RNN的wuv参数共享,cnn参数共享多少跟卷积核大小有关
cnn是空间的扩展,rnn是序列的扩展
cnn没有记忆

RNN与LSTM区别?

lstm在rnn的结构上增加了对过去状态的过滤
rnn没有门的概念
lstm可以处理较长期的问题
rnn只能处理短期问题

本文参考:https://www.jianshu.com/p/9dc9f41f0b29