RNN的基础知识

146 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Introduction to RNN

在传统的前馈神经网络中,我们假定所有的输入(和输出)相互之间都是独立的。因此,前馈神经网络不能记住最近的历史训练信息,于是在处理序列模型时效果不佳。循环神经网络的提出就是为了解决这个问题的(Jordan et al. 1986, Elman et al. 1990)。RNN可以通过在隐藏层维护一个“状态向量”来充分利用序列的信息,状态向量可以隐式地包含序列中的所有元素。 RNN模型的输入是一个序列,这个模型一步处理序列中的一个元素。在计算完每一步后,更新的状态向量会传递给下一步的计算过程。下图是一个典型的RNN模型: 这里写图片描述

一个隐藏层单元数为1的RNN模型(左)以及它的在时间上的展开形式(右) tt时刻隐藏层的状态sts_t 的输入来自tt时刻的输入值xtx_tt1t-1时刻的状态 st1s_{t-1}。 通过这种方式,RNN模型可将输入序列 {xt}\left\{ x_t \right\} 映射到输出序列 {ot}\left\{ o_t \right\}, 其中每个输出 oto_t 取决于所有的输入 xtx_{t'}(ttt'\leq t)

然而,理论和实践都表明RNN很难学习到长期的依赖关系(Bengio et al, 1994),因为当你利用基于梯度的方法来训练时,梯度会消失或爆炸。为了解决这个问题,一种更复杂的RNN模型——LSTM网络被提出来了.

Introduction to LSTM

所有的RNN都具有包含重复模块的链式结构网络。在RNN中,这种重复模块比较简单,例如通常为一个tanh函数。 这里写图片描述 LSTM也有这种链式结构, 但是它的重复模块的结构比标准的RNN要复杂许多,有4个小的结构。 这里写图片描述 通过合理地组织和开启一种称为“门”的结构,LSTM可以学习到它应该学习多久的信息, 什么时候开始遗忘, 什么时候学习新的信息, 以及如何将旧的信息和新的输入合理地结合起来。

forget gate:ft=σ(Wf[ht1,xt]+bf)input gate:it=σ(Wi[ht1,xt]+bi)candidate cell state:C~t=tanh(WC[ht1,xt]+bC)new cell state:Ct=ftCt1+itC~toutput gate:ot=σ(Wo[ht1,xt]+b0)new hiddenvalue:ht=ottanh(Ct)\begin{aligned} forget\ gate: f_t&= \sigma\left(W_f\cdot \left[h_{t-1},x_t\right]+b_f\right) \\ input\ gate: i_t&= \sigma\left(W_i\cdot \left[h_{t-1},x_t\right]+b_i\right) \\ candidate\ cell\ state: \tilde C_t&=\tanh\left(W_C\cdot \left[h_{t-1},x_t\right]+b_C\right) \\ new\ cell\ state: C_t&=f_t*C_{t-1}+i_t*\tilde C_t\\ output\ gate: o_t&= \sigma\left(W_o\cdot \left[h_{t-1},x_t\right]+b_0\right) \\ new\ hidden value: h_t&=o_t*\tanh \left(C_t\right)\\ \end{aligned}

关于上图中LSTM结构的详细介绍见 Understanding LSTM Networks.

LSTM Variants

LSTM有许多变种,其中一种就是将输入门和遗忘门结合起来。 Gated Recurrent Unit(GRU) 就是这样的一个例子。它将输入门和遗忘门合并成一个更新门,并且它把隐藏层状态和细胞状态合并起来。 这里写图片描述