LSTM :Long short-term memory
这也是RNN的一个变种网络,在之后大家都可以见到各类变种网络,其本质就是为了解决某个领域问题而设计出来的,LSTM是为了解决RNN模型存在的问题而提出来的,RNN模型存在长序列训练过程中梯度爆炸和梯度消失的问题,无法长久的保存历史信息,而LSTM就可以解决梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
网络结构
LSTM的RNN的更新模块具有4个不同的层相互作用,这四个层分别是:
-
遗忘门
σ \sigma σ是指sigmoid函数,对于状态 C t − 1 C_{t-1} Ct−1矩阵当中每个输入的值,都会乘以一个乘子,乘子的值在[0, 1]之间,相当于是决定了遗忘多少部分。如果乘子值为1,说明全部保留,不删除原本的记忆,如果是0,说明状态 C t − 1 C_{t-1} Ct−1矩阵对应的这个值全部删除,全部遗忘。场景:比如文本中的转折语句,前一个句子主语“He”,名字叫“Peter”,国籍是“America”。下一句新出现了一群人,因此这个时候状态矩阵对应主语的这一栏就会删除“He”,以保证接下来的动词的形式不是第三人称单数。 -
输入门
这里有两部分同时进行:一个是 σ \sigma σ函数决定添加多少部分的新信息到前一个状态矩阵当中(类似于权重),tanh层则根据前一个的输入值 h t − 1 h_{t-1} ht−1和当前的输入值 x t − 1 x_{t-1} xt−1产生一个新的当前状态(也就是一个新的候选值向量,这个向量之后要加入到已有的状态矩阵当中)。最后根据前面 σ \sigma σ函数输出的权重和新的候选值向量两个共同更新原有的矩阵。其实是构建一个权重、一个输入,权重是对输入做一个过滤判断。
最后跟历史的输入做加法作为 C t C_t Ct。 -
输出门
输出层也有一个权重,这个权重也是 σ \sigma σ函数对输入值 h t − 1 h_{t-1} ht−1和当前的输入值 x t − 1 x_{t-1} xt−1的作用,对应图中的 o t o_t ot,然后对 C t C_t Ct做乘法,保证对输出的一个过滤。其实最后一个输出 y y y还要经过转换:
y ^ ( t ) = δ ( V h t + c ) \hat{y}^{(t)}=\delta(Vh_{t}+c) y^(t)=δ(Vht+c)
反向传播
通过上节,我们可以知道误差来自两个地方: l t l_{t} lt和 l t + 1 l_{t+1} lt+1,一个是 t t t时刻的神经单元的误差,一个是 t t t时刻之后的神经单元的误差
L = l t + l t + 1 L=l_t+l_{t+1} L=lt+lt+1
其中有两个隐藏变量: δ h ( t ) \delta_{h}^{(t)} δh(t) 和 δ c ( t ) \delta_{c}^{(t)} δc(t)。
δ h ( t ) = ∂ L ∂ h t = ∂ l t ∂ h t + ∂ l t + 1 ∂ h t = V T ( y ^ t − y t ) + ∂ l t + 1 ∂ h t + 1 ∂ h t + 1 ∂ h t