LSTM思想解析—论文精读(Learning to Forget: Continual Prediction with LSTM)

        本文对LSTM的另一篇论文进行解析:Learning to Forget: Continual Prediction with LSTM(Felix A. Gers,1999)。该论文是在论文Long Short-term Memory (Sepp Hochreiter,1997)的基础上提出了遗忘门(forget gate)。

一、为什么要提出遗忘门

       Sepp Hochreiter在1999年提出了LSTM算法,该算法是对RNN的改进,论文具体解析详见LSTM思想解析—论文精读(Long Short-Term Memery)Long Short-Term MemeryLSTM思想解析—论文精读(Long Short-Term Memery)。当输入到LSTM中的数据为连续的流数据,这些数据并未预先分割成一个个具有明确起点和终点的子训练集,LSTM就无法自行判断什么时候将记忆单元的状态进行重置,这就会导致状态一直无限地增长,最后导致LSTM无法工作了。

       下面通过数学公式来说明LSTM存在的不足:

图1
图1

       上图为论文Long Short-term Memory 提出的LSTM架构。net_{c}表示记忆单元的输入,net_{in}表示输入门,net_{out}表示输出门,s_{c}表示记忆单元状态。那么:

 net_{out_{j}}=\sum_{m}^{}w_{out_{j}m}y^{m}(t-1);y^{out_{j}}(t)=f_{out_{j}}(net_{out_{j}}(t))                             (1)

 net_{in_{j}}=\sum_{m}^{}w_{in_{j}m}y^{m}(t-1);y^{in_{j}}(t)=f_{in_{j}}(net_{in_{j}}(t))                                     (2)

       其中,下标j代表记忆单元块的索引(即第j个记忆单元块),下标v表示记忆单元块中的第v个记忆单元。因此,c_{j}^{v}就表示第j个记忆单元块中的第v个记忆单元。w_{lm}表示从神经元m到神经元l的权重。

 激活函数f是sigmoid函数:f(x)=\frac{1}{1+e^{-x}}                                                                    (3)

       该记忆单元自身的输入(t-1时刻的输出,变为t时刻该记忆单元的输入):

  net_{c_{j}^{v}}(t)=\sum_{m}^{}w_{c_{j}^{v}m}y^{m}(t-1)                                                                               (4)

  激活函数g是sigmoid函数的变种:g(x)=\frac{4}{1+e^{-x}}-2                                                 (5)

  记忆单元状态:  s_{c_{j}^{v}}(0)=0;s_{c_{j}^{v}}(t)=s_{c_{j}^{v}}(t-1)+y^{in_{j}}(t)g(net_{c_{j}^{v}}(t))   对于t>0 (6)

  记忆单元输出:y^{c_{j}^{v}}(t)=y^{out_{j}}(t)h(s_{c_{j}^{v}}(t))                                                                (7)

   h为激活函数h(x)=\frac{2}{1+e^{-x}}-1                                                                                   (8)

        假定LSTM网络有一个输入层、一个隐藏层(由记忆单元组成)和一个输出层,那输出层的第k个神经元输出为:net_{k}(t)=\sum_{m}^{}w_{km}y^m(t-1),y^{k}(t)=f_{k}(net_{k}(t))                     (9)

激活函数f_{k}为sigmoid函数。

       当记忆细胞状态s_{c}随着连续输入流无限增大时,那么经过激活函数h时:

       由于h(x)=\frac{2}{1+e^{-x}}-1 ,那么随着x的无限增大,h(x)的值就趋近于1,从而饱和了。饱和会带来两个问题:(1)当h(x)的值趋近于1时,{h}'(x)就趋近于0({h}'(x)=\frac{-2e^{-x}}{(1+e^{-x})^{2} }),带来梯度消失问题。(2)记忆单元的输出值为y^{c_{j}^{v}}(t)=y^{out_{j}}(t)h(s_{c_{j}^{v}}(t))当h(x)的值为1时,那么记忆单元的输出值就等于输出门的输出值,此时记忆单元就退化为一个普通的BPTT了(本来输出门的作用就是确定是否访问记忆单元的内容,现在h为1了,那么就必然会访问记忆单元的内容了,和BPTT没啥区别了)。

       上述问题没有在论文Long Short-Term Memery中出现。为什么呢?在Long Short-Term Memery论文实验中,输入序列都有明确的开头和结尾标志,每当新的序列输入时,就会人为重置记忆细胞状态为0。

二、什么是遗忘门

        遗忘门的提出是为了解决:输入数据是连续的数据流,造成激活函数h(x)饱和,从而出现梯度消失或记忆细胞退化为普通BPTT的问题。遗忘门的作用就是让记忆单元可以在适当的时间将状态进行重置,从而丢弃那些内容过时且无用的信息。

图2

       上图为添加遗忘门后的LSTM结构。在图中,y^{\varphi}表示遗忘门。与其他门的计算方式一样,遗忘门的计算公式为:

net_{\varphi_{j}}=\sum_{m}^{}w_{\varphi_{j}m}y^{m}(t-1);y^{\varphi_{j}}(t)=f_{\varphi_{j}}(net_{\varphi_{j}}(t))                                 (10)

        激活函数f_{\varphi_{j}}为sigmoid函数,因此y^{\varphi_{j}}(t)的取值范围为0~1。

        根据上图红框中的公式,公式(6)变为了:

       s_{c_{j}^{v}}(0)=0;s_{c_{j}^{v}}(t)=y^{\varphi_{j}}(t)s_{c_{j}^{v}}(t-1)+y^{in_{j}}(t)g(net_{c_{j}^{v}}(t))                          (11)

        输入门和输出门的初始化偏置为负数(为了解决记忆单元滥用问题),遗忘门的初始化偏置为正数。遗忘门在初期时不起作用的,整个记忆单元就像论文Long Short-term Memory 提出的一样。

三、带遗忘门的LSTM反向传播算法

       LSTM的反向传播算法融合了截断BPTT和RTRL,并稍加修改:在输出层和输出门使用截断的BPTT;在到记忆单元的权重、输入门、遗忘门使用了截断的RTRL。截断意味着误差只在记忆单元或各种门内传播。CEC的存在,使得LSTM的误差更新并未受到指数级衰减。作者采用\doteq表示截断。为了简单,每个记忆单元块中只有一个记忆单元。

       误差反向传播,是将误差从输出反向传播至输入的过程。根据图2,在误差反向传播时,首先需要计算输出层的误差,然后是输出门、记忆单元状态S_{c}、输入门和遗忘门。

        采用均方误差作为损失函数,用t^{k}表示目标值:E(t)=\frac{1}{2} \sum_{k}^{}e_{k}(t)^{2}; e_{k}(t)=t^{k}(t)-y^{k}(t)   (12)

        假设权重更新时使用的学习率为\alpha,那么从神经元m到神经元l的权重值更新为:

\bigtriangleup w_{lm}(t)=-\alpha \frac{\partial E(t)}{\partial w_{lm}}=-\alpha \frac{\partial E(t)}{\partial y^{k}(t)} \frac{\partial y^{k}(t)}{\partial w_{lm}} =\alpha \sum_{k}^{} e_{k}(t)\frac{\partial y^{k}(t)}{\partial w_{lm}}

\doteq\alpha \sum_{k}^{}e_{k}(t)\frac{\partial y^{k}(t)}{\partial y^{l}(t)} \frac{\partial y^{l}(t)}{\partial net_{l}(t)}\frac{\partial net_{l}(t)}{\partial w_{lm}}

其中,\frac{\partial net_{l}(t)}{\partial w_{lm}}=y^{m}(t-1),那么\bigtriangleup w_{lm}(t)=\alpha \frac{\partial y^{l}(t)}{\partial net_{l}(t)} (\sum_{k}^{} e_{k}(t)\frac{\partial y^{k}(t)}{\partial y^{l}(t)})y^{m}(t-1)      (13)

\delta _{l}(t)=\frac{\partial y^{l}(t)}{\partial net_{l}(t)} (\sum_{k}^{} e_{k}(t)\frac{\partial y^{k}(t)}{\partial y^{l}(t)}),那么

1、对于输出层:

此时l=k。对公式(9)求导,可得:\frac{\partial y^{k}(t)}{\partial net_{k}(t)}=f{}'_{k}(net_{k}(t))   那么,\delta _{k}(t)=f{}'_{k}(net_{k}(t))e_{k}(t)  (14)

2、对于输出门:

由于隐藏层神经元是直接和输出层直接相连的,根据\frac{\partial y^{k}(t)}{\partial y^{l}(t)}=\frac{\partial y^{k}(t)}{\partial net_{k}(t)} \frac{\partial net_{k}(t)}{\partial y^{l}(t)} ={f}'_{k}(net_{k}(t))w_{kl} 等式两边同乘以e_{k}(t),并根据公式(14)得:

\frac{\partial y^{k}(t)}{\partial y^{l}(t)}e_{k}(t)=w_{kl}{f}'_{k}(net_{k}(t))e_{k}(t)=w_{kl} \delta _{k}(t)

对公式(1)求导,可得:\frac{\partial y^{out_{j}}(t)}{\partial net_{out_{j}}(t)}=f{}'_{out_{j}}(net_{out_{j}}(t))

当l=out,有公式:\frac{\partial y^{k}(t)}{\partial y^{out_{j}(t)}} e_{k}(t)=\frac{\partial y^{c_{j}^{v} }}{\partial y_{out_{j}}(t)} \frac{\partial y^{k}(t)}{\partial y^{c_{j}^{v} }} e_{k}(t)=h(s_{c_{j}^{v}}(t))w_{kc_{j}^{v}}\delta_{k}(t)

\frac{\partial y^{out_{j}}(t)}{\partial net_{out_{j}}(t)}=f{}'_{out_{j}}(net_{out_{j}}(t))\frac{\partial y^{k}(t)}{\partial y^{out_{j}(t)}} e_{k}(t)=h(s_{c_{j}^{v}}(t))w_{kc_{j}^{v}}\delta_{k}(t)带入公式(13),可得(令l=out):\delta _{out_{j}}^{v}(t)= f{}'_{out_{j}}(net_{out_{j}}(t))h(s_{c_{j}^{v}}(t))(\sum_{k}^{} w_{kc_{j}^{v}}\delta_{k}(t))   (表示第v个记忆单元对\delta _{out_{j}}(t)的贡献)

       假设第j个记忆单元块中有S_{j}个记忆单元,因为同一个记忆单元块中的所有记忆单元共享一个输出门,那么\delta _{out_{j}}(t)=\sum_{v=1}^{S_{j}} \delta _{out_{j}}^{v}(t)。因此:

\delta _{out_{j}}(t)= f{}'_{out_{j}}(net_{out_{j}}(t))(\sum_{v=1}^{S_{j}} h(s_{c_{j}^{v}}(t))\sum_{k}^{} w_{kc_{j}^{v}}\delta_{k}(t))                                       (15)

      上述公式(14)和(15)分别是输出层神经元和输出门的误差公式,采用的是截断BPTT。若更新输出层和输出门的权重,可以根据公式\bigtriangleup w_{lm}(t)=\alpha \delta _{l}(t)y^{m}(t-1)进行更新。将公式中的l换成输出单元k或输出门out_{j}

3、对于细胞状态、输入门、遗忘门

      接下来计算输入门和遗忘门的误差更新公式,采用的是截断RTRL方法:

\bigtriangleup w_{lm}(t)=-\alpha \frac{\partial E(t)}{\partial w_{lm}} \doteq -\alpha \frac{\partial E(t)}{\partial s_{c_{j}^{v}}(t)} \frac{\partial s_{c_{j}^{v}}(t)}{\partial w_{lm}}= \alpha e_{s_{c_{j}^{v}}} *\frac{\partial s_{c_{j}^{v}}(t)}{\partial w_{lm}}                                              (16)

在公式(16),作者令\frac{\partial E(t)}{\partial s_{c_{j}^{v}}(t)}=-e_{s_{c_{j}^{v}}}(t),所有才有上面的公式(16)

下面计算公式(16)中的第一部分e_{s_{c_{j}^{v}}}(t)=-\frac{\partial E(t)}{\partial s_{c_{j}^{v}}(t)}\doteq-\frac{\partial E(t)}{\partial y^{k}(t)} \frac{\partial y^{k}(t)}{\partial y^{c_{j}^{v}}(t)} \frac{\partial y^{c_{j}^{v}}(t)}{\partial s_{c_{j}^{v}}(t)}

e_{s_{c_{j}^{v}}}(t)=\frac{\partial y^{c_{j}^{v}}(t)}{\partial s_{c_{j}^{v}}(t)}\left ( \sum_{k}^{}\frac{\partial y^{k}(t)}{\partial y^{c_{j}^{v}}(t)}e_{k}(t) \right )  其中,w_{c_{j}^{v}l} \delta_{k} (t)=\frac{\partial y^{k}(t)}{\partial y^{c_{j}^{v}}(t)}e_{k}(t)

根据公式(7),我们可以得到\frac{\partial y^{c_{j}^{v}}}{\partial s_{c_{j}^{v}}(t)}=\frac{\partial y^{c_{j}^{v}}y}{\partial h(s_{c_{j}^{v}}(t))} \frac{\partial h(s_{c_{j}^{v}}(t))}{\partial s_{c_{j}^{v}}(t)} =y^{out_{j}}(t){h}'(s_{c_{j}^{v}}(t))

那么e_{s_{c_{j}^{v}}}(t)=y^{out_{j}}(t){h}'(s_{c_{j}^{v}}(t))\left ( \sum_{k}^{} w_{kc_{j}^{v}} \delta_{k} (t) \right )                                                          (17)

下面计算公式(16)中的第二部分\frac{\partial s_{c_{j}^{v}}(t)}{\partial w_{lm}}

将公式(11)带入公式(16)的第二部分中,可得:

\frac{\partial s_{c_{j}^{v}}(t)}{\partial w_{lm}}=\frac{\partial s_{c_{j}^{v}}(t-1)}{\partial w_{lm}}y^{\varphi _{j}}(t) +y^{in _{j}}(t) \frac{\partial g(net_{c_{j}^{v}})}{\partial w_{lm}} +g(net_{c_{j}^{v}})\frac{\partial y^{\varphi _{j}}(t)}{\partial w_{lm}} +s_{c_{j}^{v}}(t-1)\frac{\partial y^{\varphi _{j}}(t)}{\partial w_{lm}}                 (18)  

当l=c_{j}^{v},根据公式(4),公式(18)变为了:

\frac{\partial s_{c_{j}^{v}}(t)}{\partial w_{c_{j}^{v}m}}=\frac{\partial s_{c_{j}^{v}}(t-1)}{\partial w_{c_{j}^{v}m}}y^{\varphi _{j}}(t) + {g}' (net_{c_{j}^{v}}(t)y^{in_{j}}(t)y^{m}(t-1)                                          (19)

当l=in时,根据公式(2),公式(18)变为了:

\frac{\partial s_{c_{j}^{v}}(t)}{\partial w_{in_{j}m}}=\frac{\partial s_{c_{j}^{v}}(t-1)}{\partial w_{in_{j}m}}y^{\varphi _{j}}(t) + g(net_{c_{j}^{v}}(t){f}'_{in_{j}}(net_{in_{j}}(t))y^{m}(t-1)                             (20)

当l=\varphi,根据公式(10),公式(18)变为了:

\frac{\partial s_{c_{j}^{v}}(t)}{\partial w_{\varphi _{j}m}}=\frac{\partial s_{c_{j}^{v}}(t-1)}{\partial w_{\varphi _{j}m}}y^{\varphi _{j}}(t) + h(s_{c_{j}^{v}}(t)){f}'_{\varphi _{j}}(net_{\varphi_{j}}(t))y^{m}(t-1)                                   (21)

初始化:\frac{\partial s_{c_{j}^{v}}(t=0)}{\partial w_{lm}}=0 \; for \; l\in {\{\varphi ,in,c_{j}^{v}\}}                                                                      (22)

  • 记忆细胞状态权重参数更新:将公式(17)和(19)代入公式(16)中后,就可以求得记忆细胞状态权重参数的更新公式:

\bigtriangleup w_{c_{j}^{v}m}(t)=\alpha e_{s_{c_{j}^{v}}}(t)\frac{\partial s_{c_{j}^{v}}(t)}{\partial w_{c_{j}^{v}m}}                                                                                             (23)                                                                                                 

  • 输入门和遗忘门权重参数更新:将公式(17)和公式(20)/公式(21)带入公式(16)中后,就可以求得输入门/遗忘门的权重参数更新公式:

\bigtriangleup w_{lm}(t)=\alpha \sum_{v=1}^{S_{j}} e_{s_{c_{j}^{v}}}(t)\frac{\partial s_{c_{j}^{v}}(t)}{\partial w_{lm}} \;for \; l\in \{\varphi,in\}                                                     (24)

四、LSTM 正向传播与反向传播伪代码

      此部分直接摘取论文中的伪代码实现,是对本文第二部分和第三部分的综合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值