RNN

循环神经网络(Recurrent Neural Network, RNN)为了处理数据,设计了循环/重复的结构,$t$时刻的定义及计算,需要参考$t-1$时刻的定义和计算。

循环神经网络可以将同等长度的输入序列,映射为同等长度的输出序列。

$x_1,x_2,...,x_n$是输入序列,$x_t$是第$t$个输入。输出的状态分别是$h_t,o_t$。

  • $h_t$:隐藏状态,由输入$x_t$和上一时刻的隐藏状态$h_{t-1}$共同决定:

$$ h_t=\sigma(Ux_t+Wh_{t-1}+b) $$

  • $o_t$:输出状态,由$h_t$决定:

$$ o_t=g(Vh_t+c) $$

  • 在训练时,网络的整个序列上的损失可以定义为不同时刻的损失之和:

$$ L=\sum_tL_t=\sum_tLoss(o_t,y_t) $$

一般Loss是交叉熵损失函数

RNN网络中,每个时间步的权重矩阵$U, W, V$都是共享的,这种共享可以减少参数量,还让网络能够支持任意长度的输入。

RNN在训练时,也可以用BP算法跑梯度下降:

$$ \frac{\partial L}{\partial U}=\sum_t\frac{\partial L}{\partial h_t}\frac{\partial h_t}{\partial U} \\ \frac{\partial L}{\partial W}=\sum_t\frac{\partial L}{\partial h_t}\frac{\partial h_t}{\partial W} \\ \frac{\partial L}{\partial V}=\sum_t\frac{\partial L}{\partial h_t}\frac{\partial h_t}{\partial V} $$

其中,符号$\frac{\partial Y}{\partial X}$是Jacobian matrix,尺寸是$d_y\times d_x$,其中$d_y$是向量$y$的维度,$d_x$是向量$x$的维度,矩阵的第$i$行第$j$列的元素是$\frac{\partial y_i}{\partial x_j}$。上面矩阵,$\frac{\partial L}{\partial h_t}$的计算公式略微复杂:

$$ \frac{\partial L}{\partial h_t}=\frac{\partial L}{\partial h_{t+1}}\frac{\partial h_{t+1}}{\partial h_t}+\frac{\partial L}{\partial o_t}\frac{\partial o_t}{\partial h_t} $$

也就是说,$\frac{\partial L}{\partial h_t}$是个递推公式,这就导致RNN无法并行计算,它的训练速度比较慢。

LSTM

由于RNN存在长期依赖问题,只对短期输入比较敏感,所以发明了长短期记忆网络(Long Short-Term Memory, LSTM)

LSTM是在普通的RNN上增加了一个cell state单元$c_i$,它在不同时刻有着可变的连接权重,以此解决RNN的梯度消失或者梯度爆炸问题。

在每个时刻$t$,LSTM中有3个门控单元:

  • 输入门$i_t=\sigma(W_tx_t+U_th_{t-1}+b_t)$
  • 遗忘门$f_t=\sigma(W_fx_t+U_fh_{t-1}+b_f)$
  • 输出门$o_t=\sigma(W_ox_t+U_oh_{t-1}+b_o)$

$\sigma$一般是Sigmoid函数$\frac{1}{1+e^{-x}}$,因为会把输出值压缩到$[0,1]$,因为门控单元是一个百分比。

所以输入门和遗忘门的意义是:

  • 输入门:当前时刻的输入信息$\widetilde{c_t}$有多少被吸收到$c_t$
  • 遗忘门:上一时刻的$c_{t-1}$有多少不被遗忘

公式:

$$ \begin{aligned} \widetilde{c_t}&= Tanh(W_cx_t+U_ch_{t-1}+b_c)\\ c_t&=f_t\odot c_{t-1} + i_t \odot \widetilde {c_t}) \end{aligned} $$

最后,LSTM的隐藏状态$h_t$是由输出门和$c_t$共同决定的:

$$ h_t=o_t\odot Tanh(c_t) $$

可以看到,$c_{t-1}$和$c_t$之间也具有线性自循环关系,当遗忘门大时,记住过去的消息,当遗忘门小时,忘记过去的消息。

每个门的重要性:

  • 输入门:不要遗忘门,之前的cell state不能很好的被抑制
  • 输出门:不要输出门,可能会出现非常大的输出状态

GRU

LSTM的初衷是捕捉长期记忆,所以输入门和遗忘门显然做了重复的工作,于是有人发明了一个LSTM的变体(Gated Recurrent Unit, GRU),把3个门换成了两个门:

  • 重置门:$r_t=\sigma(W_rx_t+U_rh_{t-1})$
  • 更新门:$z_t=\sigma(W_z x_t+U_z h_{t-1})$

他们的用处:

  • 重置门:决定之前的隐藏状态单元$h_{t-1}$是否被忽略
  • 更新门:当前隐藏状态是否被新的隐藏状态$\widetilde {h_t}$更新

公式如下:

$$ \begin{aligned} \widetilde {h_t}&=Tanh(W_hx_t+U_h(r_t\odot h_{t-1}))\\ h_t&=(1-z_t)h_{t-1}+z_t\widetilde {h_t} \end{aligned} $$

可以看到,GRU用$z_t$和$1-z_t$来决定遗忘多少上个时刻的权重,用一个$z_t$实现了LSTM遗忘门$f_t$和输入门$i_t$。

GRU论文的作者的实验表明,GRU可以取得比LSTM更好或相当的成绩。

最后修改:2021 年 06 月 08 日 03 : 52 PM
如果觉得我的文章对你有用,请随意赞赏