RNN
简单循环神经网络是一个很简单,只有一个隐藏层的神经网络。
假设在时刻t,输入为$x_{t}$,隐藏层状态(又称隐层神经元激活值)为$h_{t}$,$h_{t}$不仅和当前输入相关,还和上一个时刻的隐藏层状态$h_{t-1}$相关。
其中$c_{t}$为隐藏层的净输入,$f(·)$是非线性激活函数,通常是Logistic函数或Tanh,U为状态-状态权重矩阵,W为状态-输入矩阵,b为偏置。上面两个式子也可以合并为一个式子
假设句子长度为$T$,一般的分类问题都是利用最后输出的$h_{T}$去做分类,因为它包含了整个句子的语义信息。
LSTM
长短期记忆(Long Short-Term Memory,LSTM)网络是循环神经网络的一个变体,可以有效地解决简单RNN的梯度爆炸或消失问题。
改进主要有两方面:
- 新的内部状态 LSTM网络引入一个新的内部状态(internal state)$c$专门进行线性的循环信息传递。
- 同时(非线性)输出信息给隐藏层的外部状态 $h_{t}$。
$\odot$为element-wise相乘;$c_{t-1}$为上一时刻的记忆单元;$\tilde{c}_{t}$是通过非线性函数得到的候选状态
$f_{t}, i_{t}, o_{t}$分别为遗忘门,输入门和输出门(gate),用来控制信息传递的路径,它的值越大,表示门开的越大,允许通过的信息越多,1表示完全通过,0表示完全不通过,
- 遗忘门$f_{t}$控制上一个时刻的内部状态$c_{t-1}$需要遗忘多少信息。
- 输入门$i_{t}$控制当前时刻的候选状态$\tilde{c}_{t}$有多少信息需要保存。
- 输出门$o_{t}$控制当前时刻的内部状态有$c_{t}$多少信息需要输出给外部状态$h_{t}$。
三个门的计算方式为
其中$\sigma(·)$为Logistic函数。
注意
一般在深度网络参数学习时,参数初始化的值一般都比较小。但是在训练 LSTM 网络时,过小的值会使得遗忘门的值比较小。这意味着前一时刻的信息大部分都丢失了,这样网络很难捕捉到长距离的依赖信息。并且相邻时间间隔的梯度会非常小,这会导致梯度弥散问题。因此遗忘的参数初始值一般都设得比较大,其偏置向量$b_{f}$设为1或2。
GRU
门控循环单元(Gated Recurrent Unit, GRU)网络是一种比LSTM更简单的循环神经网络。
和LSTM不同的地方在于,GRU不引入额外的记忆单元,而是引入了一个更新门来控制当前状态需要从历史状态中保留多少信息(不经过非线性变换),以及需要从候选状态中接受多少信息。
其中$z_{t}\in[0, 1]$为更新门
在GRU中,函数$\tilde{h}_{t}$的定义为
其中$\tilde{h}_{t}$表示当前时刻的候选状态,$r_{t}\in[0, 1]$为重置门,用来控制候选状态是否依赖上一个时刻的状态。
GRU一共有个两个门:更新门和重置门
LSTM一共有三个门:遗忘门、输入门和输出门
门的计算都是类似的。