RNN

简介

前馈神经网络的两个局限

  • 难以捕捉到数据之间长距离的依赖关系,即使CNN也只能捕捉到局部或短距离的关系
  • 当训练样本输入是连续序列且长短不一时,不好处理,如一段段连续的语音、连续的文本

为了解决上述局限,提出了循环神经网络RNN的结构如下,右侧是左侧的图按照时间序列展开的结果。

RNN可以做到学习数据间长距离的关系。比如在文本分类中,它模拟了人阅读一篇文章的顺序,从前到后阅读文章中的每一个单词,将前面阅读到的有用信息编码到状态变量中去,从而拥有了一定的记忆能力,可以更好地理解之后的文本。

从图上可以看到,RNN本质上还是一个全连接网络,区别在于全连接网络对一整个样本往前传递,前向传递一次,而RNN对一个样本按照时间序列一部分一部分地往前传递,前向传递多次

RNN与LSTM模型

基本架构

上图为RNN的经典结构,网络的传递过程如下:

  • 输入:在文本处理中,一个样本是一个句子 xx,划分为单词 (x1,x2,...,xn)(x_1,x_2,...,x_n),输入到隐层节点

  • 隐层:接收当前轮的单词 xix_i 与上一轮的隐层输出 hi1h_{i-1},计算 hih_i,输出至下一轮的隐层和当前轮的输出节点
    (1)hi=Whi1+Uxi h_i=Wh_{i-1}+Ux_i\tag{1}

  • 输出:接收当前轮隐层的输出 hih_i,计算输出 oio_i
    (2)oi=Vhi o_i=Vh_i\tag{2}

可以看到:

  • 每一轮的权值是共享的
  • 每一轮的隐层都包含了前面所有轮的信息,即记忆能力

RNN的一些变体

  1. 经典的RNN的结构可以理解为多个输入神经元,单个输出神经元,如输入是一串文字,输出是类别。
RNN与LSTM模型
  1. 有时需要单个输入神经元,多个输出神经元的情况,则可以是如下结构。
RNN与LSTM模型
  1. 有时需要多个输入神经元、多个输出神经元的情况,如机器翻译,则需要两个RNN结构,又称为Seq2Seq。
RNN与LSTM模型

根据输入输出的不同,RNN可以有多种变体,本质上任何涉及循环的函数都可以被认为是一个循环神经网络

RNN的BP:BPTT

RNN使用基于时间的反向传播(Back-Propagation Through Time)进行训练,本质上还是BP算法。

RNN与LSTM模型

仍以该结构为例,需要更新的参数有 VWUV、W、U​,损失函数为
(3)L=t=1TL(t) L = \sum_{t=1}^T L^{(t)}\tag{3}
对于VV,每次只用到当前轮的信息,即
(4)LV=t=1TL(t)V=t=1TL(t)o(t)o(t)V \frac{\partial L}{\partial V}=\sum_{t=1}^T \frac{\partial L^{(t)}}{\partial V}=\sum_{t=1}^T \frac{\partial L^{(t)}}{\partial o^{(t)}}\frac{\partial o^{(t)}}{\partial V}\tag{4}
对于 WW​,需要用到历史信息,以 L(t)L^{(t)}​WW​ 求导为例,有
(5)L(t)W=L(t)o(t)o(t)h(t)h(t)W  h(t)W=h(t1)+Wh(t1)W, \frac{\partial L^{(t)}}{\partial W}=\frac{\partial L^{(t)}}{\partial o^{(t)}}\frac{\partial o^{(t)}}{\partial h^{(t)}}\frac{\partial h^{(t)}}{\partial W}\tag{5}\\ \\\ \ \\ \\ 其中,\frac{\partial h^{(t)}}{\partial W}=h^{(t-1)}+W\frac{\partial h^{(t-1)}}{\partial W},此处省略了**函数的求导\\
比如当 t=3t=3​ 时,有

RNN与LSTM模型

(注意这里不考虑**函数时, h(3)W=h(2)\frac{\partial h^{(3)}}{\partial W}=h^{(2)},与上述符号表示有区别)

可写成连乘的形式如下,
(6)L(t)W=k=1tL(t)o(t)o(t)h(t)(j=k+1th(j)h(j1))h(k)W \frac{\partial L^{(t)}}{\partial W}=\sum_{k=1}^t\frac{\partial L^{(t)}}{\partial o^{(t)}}\frac{\partial o^{(t)}}{\partial h^{(t)}}(\prod_{j=k+1}^t\frac{\partial h^{(j)}}{\partial h^{(j-1)}})\frac{\partial h^{(k)}}{\partial W}\tag{6}
所以对于 WW 的求导同样对各个 L(t)L^{(t)} 求导的结果求和即可,即
(7)LW=t=1TL(t)W \frac{L}{W}=\sum_{t=1}^T\frac{\partial L^{(t)}}{\partial W}\tag{7}
对于 UU 的求导与 WW​ 类似。

梯度消失

对于求导公式中间部分的累乘,当**函数是 tanhtanhsigmoidsigmoid 时,由于两者的导数绝对值小于1,累乘后容易导致梯度消失,从而无法学习长距离的依赖关系(距离长的梯度消失了)。针对这个问题,有2种思路——

  1. 选择更合适的**函数。如ReLU,有较大的**区域,且导数为1,避免梯度消失的发生
  2. 改变网络结构。使用LSTM可以解决

LSTM

LSTM,long short-term memory,长短期记忆,是RNN的一种改进。RNN由于梯度消失,只能维持短期记忆,LSTM通过引入记忆单元和门控制单元(将短期记忆与长期记忆结合),在一定程度上解决了梯度消失的问题。

具体地,RNN是一个循环的网络结构,在原来的RNN中,循环的结构如下:

RNN与LSTM模型

LSTM在这个结构的基础上引入了记忆单元和门控制单元,如下:

RNN与LSTM模型

在结构中的横线传播的称为记忆单元 CtC_t​。LSTM的上述结构中包含了遗忘门、输入门、输出门。

  • 遗忘门控制前一步记忆单元中的信息有多大程度被遗忘掉
    (8)Ct1=Ct1σ(f1(ht1,xt)) C_{t-1}=C_{t-1}*\sigma(f_1(h_{t-1},x_t))\tag{8}

  • 输入门控制当前计算的新状态以多大程度更新到记忆单元
    (9)Ct=Ct1+σ(f2(ht1,xt))tanh(f3(ht1,xt)) C_t=C_{t-1}+\sigma(f_2(h_{t-1},x_t))*tanh(f_3(h_{t-1},x_t))\tag{9}

  • 输出门控制当前的输出有多大程度上取决于当前的记忆单元
    (10)ht=tanh(Ct)σ(f4(ht1,xt)) h_t=tanh(C_t)*\sigma(f_4(h_{t-1},x_t))\tag{10}

对于**函数的选择——

sigmoid的输出是0-1,符合遗忘和记忆的物理意义,当输入较大或较小时,其输出会非常接近1或0,从而保证该门开或关。在生成候选记忆时,使用Tanh函数,是因为其输出在-1~1之间,这与大多数场景下特征分布是0中心的吻合。此外,Tanh函数在输入为0附近相比Sigmoid函数有更大的梯度,通常使模型收敛更快。

GRU

GRU是LSTM的一个变体,将遗忘门和输入门合并为单一的更新门,同时混合了记忆单元和隐藏状态,结构如下:

RNN与LSTM模型
  • 重置门,reset gate,控制候选(candidate)状态多大程度取决于旧状态
    (11)rt=σ(f1(ht1,xt)) r_t=\sigma(f_1(h_{t-1},x_t)\tag{11})

    (12)htc=tanh(f2(rtht1,xt)) h_t^c=tanh(f_2(r_t*h_{t-1},x_t))\tag{12}

  • 更新门,update gate,控制新状态由旧状态候选状态相加的权重
    (13)zt=σ(f3(ht1,xt)) z_t=\sigma(f_3(h_{t-1},x_t))\tag{13}

    (14)ht=(1zt)ht1+zthtc h_t=(1-z_t)h_{t-1}+z_th^c_t\tag{14}

Reference

[1] https://blog.csdn.net/zhaojc1995/article/details/80572098

[2] 《百面机器学习》

相关文章: