目录

  • RNN
  • LSTM



参考一个很全的总结:


预训练语言模型的前世今生 - 从Word Embedding到BERT


RNN部分参考了这个:


循环神经网络


LSTM部分参考了这两个:


LSTM以及三重门,遗忘门,输入门,输出门


LSTM如何解决梯度消失与梯度爆炸



这儿对预训练模型又有了一点理解,也是之前在做VGG实验时在困惑的点,预训练模型在使用时可以有两种做法:一种是Frozen,将参数锁住,在下游应用时不再改变;另一种就是Fine-Tuning,即将参数初始化为预训练模型的参数,下游应用时这里的参数仍然可以改变。


好了进入正题:

RNN

RNN结构最大的特点就是融入了时序信息,其结构如下图所示:

faster rcnn预训练模型 lstm预训练模型_lstm


左侧部分称为RNN的一个timestep,对于每一个时刻 faster rcnn预训练模型 lstm预训练模型_rnn_02 ,输入的 faster rcnn预训练模型 lstm预训练模型_语言模型_03 都可以计算出一个 faster rcnn预训练模型 lstm预训练模型_rnn_04 ,将该信息传入下一个时刻 faster rcnn预训练模型 lstm预训练模型_lstm_05 ,这个过程是一个前馈神经网络;接收完一个序列中所有时刻的数据之后从 faster rcnn预训练模型 lstm预训练模型_语言模型_03 时刻沿时间反向传播(BPTT)计算loss。

RNN的主体结构是 faster rcnn预训练模型 lstm预训练模型_语言模型_07faster rcnn预训练模型 lstm预训练模型_语言模型_07 的结构如下图所示,输入为 faster rcnn预训练模型 lstm预训练模型_语言模型_09 ,两个权重矩阵 faster rcnn预训练模型 lstm预训练模型_rnn_10faster rcnn预训练模型 lstm预训练模型_lstm_11 可以分开,也可以合并在一起是一个 faster rcnn预训练模型 lstm预训练模型_rnn_12

faster rcnn预训练模型 lstm预训练模型_激活函数_13

可以看到,RNN解决了时序依赖问题,但这里的时序一般是短距离的,短距离依赖影响较大,长距离依赖影响很小(一般超过10步就无能为力了)。
导致长期依赖的原因,在于RNN训练时容易发生梯度爆炸和梯度消失。
梯度爆炸相对友好,因为这时程序会收到NaN错误,同时处理上也可以设置一个梯度阈值,当梯度超过这个阈值时进行截断。
对于梯度消失,主要采用以下三种方式:

  1. 合理地初始化权重值,使每个神经元尽可能不要取极大或极小值,以避开梯度消失的区域。
  2. 用ReLU代替sigmoid和tanh作为激活函数。
  3. 采用其它结构的RNNs,比如LTSM和GRU,这也是最流行的方法。

梯度消失原因:

faster rcnn预训练模型 lstm预训练模型_faster rcnn预训练模型_14

前向传播过程包括:

  1. 隐藏状态:faster rcnn预训练模型 lstm预训练模型_rnn_15 , 此处激活函数一般为 faster rcnn预训练模型 lstm预训练模型_rnn_16
  2. 模型输出:faster rcnn预训练模型 lstm预训练模型_语言模型_17
  3. 预测输出:faster rcnn预训练模型 lstm预训练模型_lstm_18 ,此处激活函数一般为 faster rcnn预训练模型 lstm预训练模型_语言模型_19
  4. 模型损失:faster rcnn预训练模型 lstm预训练模型_语言模型_20

RNN所有的timestep共享一套参数 faster rcnn预训练模型 lstm预训练模型_激活函数_21 ,在RNN反向传播的过程中,需要计算 faster rcnn预训练模型 lstm预训练模型_激活函数_21 的梯度,以 faster rcnn预训练模型 lstm预训练模型_rnn_12 为例,如下(这是一个链式求导…微积分全不会了好无语…):
faster rcnn预训练模型 lstm预训练模型_faster rcnn预训练模型_24
对于公式中的 faster rcnn预训练模型 lstm预训练模型_rnn_25 ,tanh的导数总是小于1的,又因为是 faster rcnn预训练模型 lstm预训练模型_lstm_26 个timestep参数的连乘,所以如果 faster rcnn预训练模型 lstm预训练模型_rnn_12 小于1,梯度就会消失;如果 faster rcnn预训练模型 lstm预训练模型_rnn_12 的特征值大于1,梯度就会爆炸。
所以,RNN梯度消失的真正含义是,梯度被近距离(当 faster rcnn预训练模型 lstm预训练模型_激活函数_29 趋向于 faster rcnn预训练模型 lstm预训练模型_语言模型_30)的梯度主导,远距离会发生爆炸或消失,导致模型难以学到远距离的信息。
值得强调的是,RNN的这一缺陷并非理论上的,而是技术实践上的。换言之,RNN在理论上是一个优秀的模型,前提是我们能够找到一组合适的参数,然而实践上这组参数并不好找。

LSTM

先来大致看看LSTM相比RNN的结构改变是什么,多了一个传输状态:


faster rcnn预训练模型 lstm预训练模型_faster rcnn预训练模型_31

这个图是LSTM的timestep:

faster rcnn预训练模型 lstm预训练模型_lstm_32

根据这个图,LSTM的前向传播过程包括:

  1. 遗忘门:接收 faster rcnn预训练模型 lstm预训练模型_激活函数_33 时刻的状态 faster rcnn预训练模型 lstm预训练模型_语言模型_34 以及当前的输入 faster rcnn预训练模型 lstm预训练模型_rnn_35,经过sigmoid函数之后输出一个0到1之间的值,输出为: faster rcnn预训练模型 lstm预训练模型_faster rcnn预训练模型_36
  2. 输入门:这里进行了两个操作,输出分别为: faster rcnn预训练模型 lstm预训练模型_lstm_37faster rcnn预训练模型 lstm预训练模型_rnn_38
  3. 当前状态:输出为:faster rcnn预训练模型 lstm预训练模型_faster rcnn预训练模型_39
  4. 输出门:输出为:faster rcnn预训练模型 lstm预训练模型_lstm_40faster rcnn预训练模型 lstm预训练模型_rnn_41
  5. 预测输出:faster rcnn预训练模型 lstm预训练模型_faster rcnn预训练模型_42

对于三个门的作用如下图所示:

faster rcnn预训练模型 lstm预训练模型_faster rcnn预训练模型_43

关于LSTM如何RNN中解决梯度消失或爆炸:

如上文中所述,RNN中引起梯度消失或爆炸的点在于:

faster rcnn预训练模型 lstm预训练模型_rnn_44

在LSTM中这个公式是这样的:

faster rcnn预训练模型 lstm预训练模型_rnn_45

如果设 faster rcnn预训练模型 lstm预训练模型_rnn_46,其函数图像如下所示:

faster rcnn预训练模型 lstm预训练模型_激活函数_47


可以看到这个函数的值基本可以近似为0或1,这样就可以解决多个小于1或多个大于1的数相乘导致的梯度消失或梯度爆炸问题。

通过LSTM这种方式,除了在结构上天然地克服了梯度消失的问题,更重要的是能够具有更多的参数来控制模型;其参数量是RNN的四倍,能够更加精细地预测时间序列变量。