RNN札记

基本RNN

$$
h_t = \sigma(W_{xh} \cdot x_t+W_{hh}h_{t-1}+b)
$$

其中,$h_t$表示当前时刻的隐状态;$h_{t-1}$表示上一时刻的隐状态;$x_t$表示当前时刻的输入;$W_{xh},W_{hh}$为要学习的参数,所有时刻的权重矩阵都是共享的。这是循环神经网络相对于前馈网络而言最为突出的优势。

梯度消失及梯度爆炸

RNN会存在梯度爆炸或消失的问题,尤其是当time_step越长的时候,建模的序列越长,它就越容易遗忘,就会出现梯度问题。本质上它每一时刻之间的梯度传递也是连乘的,激活函数和权值影响也是一样的。
一般在两种情况下可能出现梯度消失:(1)深层网络,网络层数多;(2)采用了不合适的激活函数,比如Sigmoid;梯度爆炸一般出现在深层网络和权值太大的情况下。出现梯度消失的现象后,接近输出层的参数会基本上收敛,收敛后基本上就结束了,但是前面接近input的参数基本上还是随机的,导致学习不充分。

一般的解决方案有如下几种方案:

  • 选择其他的激活函数,如ReLu;
  • 梯度剪切(针对梯度爆炸);
  • 正则化;
  • BatchNorm。

LSTM

LSTM网络是专门设计用来避免长期依赖的,它可以说是一种优化的RNN,它和RNN的区别在于隐藏层的设计。

LSTM在隐藏层引入:细胞单元(Cell)和门(Gate),细胞单元是利用先前状态$h_{t-1}$和当前的输入$x_t$产生新的信息;门其实就是一个开关,它决定哪些信息通过或通过多少,门并不提供额外的信息,门只是起到限制信息的量的作用,因为门起到的是过滤器的作用,所以用的激活函数是sigmoid,而不是tanh。
LSTM的各种门:

  • 输入门:$i_t=\sigma(W_{xi}x_t+W_{hi}h_{t-1} + b_i)$
  • 遗忘门:$f_t=\sigma(W_{xf}x_t+W_{hf}h_{t-1} + b_f)$
  • 输出门:$o_t=\sigma(W_{xo}x_t+W_{ho}h_{t-1} + b_o)$
  • cell记忆细胞更新:$c_t=f_t\circ c_{t-1}+i_t\circ tanh(W_{xc}x_t+W_{hc}h_{t-1}+b_c)$
  • 隐层更新:$h_t = o_t\cdot tanh(c_t)$

输入门,控制多少信息可以进入到memory cell;遗忘门,控制有多少上一时刻的mermory cell的信息可以累积到当前时刻的memory cell;输出门,控制多少当前时刻的memory cell中的信息可流入到当前隐藏状态;

GRU

GRU(Gated Recurrent Unit,GRU)是在2014年提出的,是一种更简单的变种模型,它不但可以有效避免梯度消失,而且有着比LSTM更简单的网络结构。它引入了更新门$z_t$和重置门$r_t$,隐藏层的状态更新如下:

  • 更新门:$z_t=\sigma(W_{xz}x_t+W_{hz}h_{t-1})$
  • 重置门:$r_t=\sigma(W_{xr}x_t+W_{hr}h_{t-1})$
  • 新的记忆单元:$\hat h_t= tanh(Wx_t+ U(r_t\circ h_{t-1}))$
  • 隐层更新:$h_t=(1-z_t)\circ\hat h_t + z_t \circ h_{t-1}$

更新门,决定先前的状态有多少会传输到新的状态,类似遗忘门的功能,决定擦除前一个时刻的多少信息;重置门,决定先前状态有多少会影响到新的记忆单元;

从直观上来说,重置门决定了如何将新的输入信息与前面的记忆相结合,更新门定义了前面记忆保存到当前时间步的量。如果将重置门设置为1,更新门设置为0,那么将再次获得标准RNN模型。重置门其实强制隐藏状态遗忘一些历史信息,并利用当前输入的信息。这可以令隐藏状态遗忘任何在未来发现与预测不相关的信息,同时也允许构建更加紧致的表征。而更新门将控制前面隐藏状态的信息有多少会传递到当前隐藏状态,这与 LSTM 网络中的记忆单元非常相似,它可以帮助 RNN 记住长期信息。由于每个单元都有独立的重置门与更新门,每个隐藏单元将学习不同尺度上的依赖关系。那些学习捕捉短期依赖关系的单元将趋向于激活重置门,而那些捕获长期依赖关系的单元将常常激活更新门。使用门控制机制学习长期依赖关系的基本思想和LSTM一致,但还是有一些关键区别:

  • GRU有两个门(重置门与更新门),而LSTM有三个门(输入门、遗忘门和输出门);
  • GRU并不会控制保留内部记忆($c_t$),且没有LSTM中的输出门;
  • LSTM中的输入与遗忘门对应于GRU的更新门,重置门直接作用于前面的隐藏状态。

尽管GRU简化了参数,但实际上和LSTM基本上是等价的,区别在于LSTM专门用了一个遗忘门来控制前一个时刻隐藏层的影响,输出门控制mermory cell传输到下一个状态,而GRU使用重置门进行控制前一个时刻的影响,而对new memory cell传输不做控制。在GRU中,只存在一个更新门来控制旧的信息和新的信息的组合,而在LSTM里使用遗忘门和输入门共同控制。LSTM里存在显式的memory cell,而GRU则没有显式的memory,隐层为旧的隐层状态和新的输入的线性组合。总体来说,LSTM和GRU表现相差不大,GRU在收敛速度上更具优势,这也是参数少的优势。

虽然LSTM和GRU的原始目的是为了解决长距离依赖的问题,但一定程度上两者都能优化梯度消失的现象。原因是由于引入了new memory,$h_t$由两部分做加法得到,那么在计算梯度的时候,梯度也会变大,从而缓解了梯度消失的问题。

坚持原创技术分享,您的支持将鼓励我继续创作!