书籍简介
《Surpervised Sequence Labelling with Recurrent Neural Network》(《用循环神经网络进行序列标记》),RNN(Recurrent Neural Network,循环神经网络)经典教材,由多伦多大学Alexander Graves所著,详细叙述了各种RNN模型及其推导。本文介绍该书的LSTM部分。对于该书,想深入了解的朋友点这里获取资源。
LSTM理解
LSTM(Long Short-Term Memory Networks,长短时记忆网络),由Hochreiter和Schmidhuber于1997年提出,目的是解决一般循环神经网络中存在的梯度爆炸(输入信息激活后权重过小)及梯度消失(例如sigmoid、tanh的激活值在输入很大时其梯度趋于零)问题,主要通过引入门和Cell状态的概念来实现梯度的调整,已被大量应用于时间序列预测等深度学习领域。
下面的描述主要侧重公式推导,对LSTM来由更详细的讨论请见《Step-by-step to LSTM: 解析LSTM神经网络设计原理》。
LSTM流程简介
LSTM采用了门控输出的方式,即三门(输入门、遗忘门、输出门)两态(Cell State长时、Hidden State短时)。其核心即Cell State,指用于信息传播的Cell的状态,在结构示意图(图1,图源Understanding LSTMs,略改动)中是最上面的直链(从 C t − 1 C_{t-1} Ct−1到 C t C_t Ct)。
Memory Cell 接受两个输入,即上一时刻的输出值 h t − 1 h_{t-1} ht−1和本时刻的输入值 x t x_t xt,由这两个参数 先进入遗忘门,得到决定要舍弃的信息 f t f_t ft(即权重较小的信息)后,再进入输入门,得到决定要更新的信息 i t i_t it(即与上一Cell相比权重较大的信息)以及当前时刻的Cell状态 C ~ t \tilde{C}_t C~t(候选向量,可理解为中间变量,存储当前 Cell State 信息),最后由这两个门(遗忘门,输入门)的输出值(即 f t , i t , C t ~ f_t,i_t,\tilde{C_t} ft,it,Ct~)进行组合(上一Cell状态 C t − 1 × C^{t-1}\times Ct−1×要遗忘信息的激活值 f t f_t ft 与 当前时刻Cell状态 C t ~ × \tilde{C_t}\times Ct~×需要记忆信息的激活值 i t i_t it进行叠加,从图中可以更直观得到),得到分别的长时( C t C_t Ct)和短时( h t h_t ht)信息,最后进行存储操作及对下一个神经元的输入。下图2介绍了LSTM在网络中是如何工作的。
根据图1,可依次得到三个门的形式方程如下(符号与图中保持一致):
- 遗忘门:
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t=\sigma\left(W_f\cdot[h_{t-1}, x_t]+b_f\right) ft=σ(Wf⋅[ht−1,xt]+bf)
- 输入门:
i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t=\sigma\left(W_i\cdot[h_{t-1}, x_t]+b_i\right) it=σ(Wi⋅[ht−1,xt]+bi)
C t ~ = tanh ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C_t}=\tanh\left(W_C\cdot[h_{t-1}, x_t]+b_C\right) Ct~=tanh(WC⋅[ht−1,xt]+bC)
以及 t t t时刻的Cell 状态(长时)方程:
C t = f t ⋅ C t − 1 + i t ⋅ C t ~ C_t=f_t\cdot C_{t-1}+i_t\cdot \tilde{C_t} Ct=ft⋅Ct−1+it⋅Ct~
- 输出门:
o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t=\sigma\left(W_o\cdot[h_{t-1}, x_t]+b_o\right) ot=σ(Wo⋅[ht−1,xt]+bo)
h t = o t ⋅ tanh ( C t ) h_t=o_t\cdot\tanh{(C_t)} ht=ot⋅tanh(Ct)
算法及公式
根据上面的描述及图1,首先定义如下符号(符号为方便理解,与书中保持一致):
一些函数
- f f f :门的激活函数
- g g g :Cell输入的激活函数
- h h h :Cell输出的激活函数
- L \mathcal{L} L : 训练模型时的损失函数
- σ ( z ) \sigma(z) σ(z):Sigmoid激活函数
σ ( z ) = 1 1 + e − z = 1 + tanh ( z / 2 ) 2 , \sigma(z)=\frac{1}{1+\mathrm{e}^{-z}}=\frac{1+\tanh(z/2)}{2}, σ(z)=1+e−z1=21+tanh(z/2),
σ ′ ( z ) = σ ( z ) [ 1 − σ ( z ) ] . \sigma'(z)=\sigma(z)[1-\sigma(z)]. σ′(z)=σ(z)[1−σ(z)].
- tanh ( z ) \tanh(z) tanh(z):tanh激活函数
tanh ( z ) = e z − e − z e z + e − z , \tanh(z)=\frac{\mathrm{e}^z-\mathrm{e}^{-z}}{\mathrm{e}^z+\mathrm{e}^{-z}}, tanh(z)=ez+e−zez−e−z,
tanh ′ ( z ) = 1 − tanh 2 ( z ) . \tanh'(z)=1-\tanh^2(z). tanh′(z)=1−tanh2(z).
一些符号
- I I I :输入层 信息的数量
- K K K :输出层 信息的数量
- H H H :隐层 Cell状态的数量(注意这里的Cell与下面的Cell不同,代表短时记忆Cell),指图1中最下面的一条直链,即从 h t − 1 h_{t-1} ht−1到 h t h_t ht,处理短时记忆
- C C C :Cell状态信息(长时记忆状态)的数量
- T T T :总时间数(网络层总数),即 t = 0 , 1 , 2 , ⋯ , T t=0,1,2,\cdots,T t=0,1,2,⋯,T
- ϕ \phi ϕ :下标,指一个LSTM单元的遗忘门
- ι \iota ι :下标,指一个LSTM单元的输入门
- ω \omega ω :下标,指一个LSTM单元的输出门
- c c c :下标,指神经元中某一个 C C C 记忆元胞(Cell)
- w i j w_{ij} wij :从单元 i i i到单元 j j j的权重
- b j t b_j^t bjt : t t t时刻第 j j j个单元的激活值,在 t = 0 t=0 t=0时初始化为 0 0 0
- a j t a_j^t ajt : t t t时刻第 j j j个单元的带权输入,可作抽象定义如下
a j t = ∑ i w i j b i t − 1 . a_j^t=\sum_{i}{w_{ij}b_{i}^{t-1}}. ajt=i∑wijbit−1.
-
s c t s_c^t sct : t t t时刻记忆元胞 c c c 的状态(State),在 t = 0 t=0 t=0时初始化为 0 0 0
-
δ j t \delta_j^t δjt : t t t时刻第 j j j个单元的误差,在 t = T + 1 t=T+1 t=T+1时初始化为 0 0 0。一般化的定义为
δ j t = ∂ L ∂ a j t . \delta_j^t=\frac{\partial \mathcal{L}}{\partial a_j^t}. δjt=∂ajt∂L.
前向传播
由上述的形式方程,很容易得到下面的前向传播公式:
- 遗忘门。由图1可知,遗忘门的输出依赖三个变量(图1中表示为左下角的两个输入和左上角的一个输入),分别是:上一时刻 ( t − 1 ) (t-1) (t−1)神经元的短时记忆输出 h t − 1 h_{t-1} ht−1,本时刻 ( t ) (t) (t)神经元的输入 x t x_t xt以及上一时刻 ( t − 1 ) (t-1) (t−1)神经元的长时记忆输出Cell状态 s c t − 1 s_c^{t-1} sct−1,乘以权重因子后对层数求和即可得到遗忘门的输入值及激活值如下:
a ϕ t = ∑ i = 1 I w i ϕ x i t + ∑ h = 1 H w h ϕ b h t − 1 + ∑ c = 1 C w c ϕ s c t − 1 (1.1) a_\phi^t=\sum_{i=1}^Iw_{i\phi}x_i^t+\sum_{h=1}^{H}w_{h\phi}b_h^{t-1}+\sum_{c=1}^Cw_{c\phi}s_c^{t-1}\tag{1.1} aϕt=i=1∑Iwiϕxit+h=1∑Hwhϕbht−1+c=1∑Cwcϕsct−1(1.1)
b ϕ t = f (