跳转到主要内容

长短时记忆网络(LSTM)

demi 提交于

<font style="line-height: 45px;" size="4" color="blue"><strong>长短时记忆网络</strong></font>

循环神经网络很难训练的原因导致它的实际应用中很处理长距离的依赖。本文将介绍改进后的循环神经网络:长短时记忆网络(Long Short Term Memory Network, LSTM),

原始RNN的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。那么如果我们再增加一个状态,即c,让它来保存长期的状态,这就是长短时记忆网络。

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

新增加的状态c,称为单元状态。我们把上图按照时间维度展开:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

可以看到在 t 时刻,LSTM的输入有三个:当前时刻网络的输出值 x<sub>t</sub> 、上一时刻LSTM的输出值 h<sub>t−1</sub>、以及上一时刻的单元状态 c<sub>t−1</sub>;LSTM的输出有两个:当前时刻LSTM输出值 h<sub>t</sub> 、和当前时刻的单元状态 x<sub>t</sub> 。注意 x、h、c 都是向量。

LSTM的关键,就是怎样控制长期状态c。在这里,LSTM的思路是使用三个控制开关。第一个开关,负责控制继续保存长期状态c;第二个开关,负责控制把即时状态输入到长期状态c;第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出。三个开关的作用如下图所示:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

接下来我们要描述一下,输出h和单元状态c的具体计算方法。

<font style="line-height: 45px;" size="4" color="blue"><strong>长短时记忆网络的前向计算</strong></font>

我们引入“门(gate)”的概念。门实际上就是一层全连接层,它的输入是一个向量,输出是一个0到1之间的实数向量。假设W是门的权重向量,b是偏置项,那么门可以表示为:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

门的输出是0到1之间的实数向量,用门向量的输出向量按元素乘以我们需要控制的那个向量,当门输出为0时,任何向量与之相乘都会得到0向量,这就相当于啥都不能通过;输出为1时,任何向量与之相乘都不会有任何改变,这就相当于啥都可以通过。因为σ(也就是sigmoid函数)的值域是(0,1),所以门的状态都是半开半闭的。

LSTM用两个门来控制单元状态 c 的内容,一个是遗忘门,它决定了上一时刻的单元状态 <sub>t−1</sub> 有多少保留到当前时刻 c<sub>t</sub> ;另外一个是输出门,他决定了当前时刻网络的输入 x<sub>t</sub> 有多少保存到单元状态 c<sub>t</sub> 。LSTM用输出门来控制单元状态 c<sub>t</sub> 有多少输出到LSTM的当前输出值 h<sub>t</sub> 。LSTM用输出门来控制单元状态 c<sub>t</sub> 有多少输出到LSTM的当前输出值ht。

遗忘门的表达式是:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

上式中,W<sub>f</sub> 是遗忘门的权重矩阵,h<sub>t−1</sub> , x<sub>t</sub> 表示把两个向量连接成一个更长的向量,b<sub>f</sub> 是遗忘门的偏置项,σ是sigmoid函数。如果输入的维度是d<sub>x</sub>,隐藏层的维度是 d<sub>h</sub>,单元状态的维度是 d<sub>c</sub>( d_c = d_h ),则遗忘门的权重矩阵 W<sub>f</sub>维度是 d<sub>c</sub>x(d<sub>h</sub> + d<sub>x</sub> ) 。事实上,权重矩阵 W<sub>f</sub> 都是两个矩阵拼接而成的:一个是Wfh,它对应着输入项 h<sub>t−1</sub> ,其维度为 d<sub>c</sub>xd<sub>h</sub>;一个是W<sub>fx</sub>,它对应着输入项 x<sub>t</sub> ,其维度为dcxdx。W<sub>f</sub> 可以写为:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

下图显示了遗忘门的计算:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

接下来看看输入门:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

上式中,W<sub>i</sub> 是输入门的权重矩阵,$b_i$是输入门的偏置项。下图表示了输入门的计算:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

接下来,我们计算用于描述当前输入的单元状态<img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt="">,它是根据上一次的输出和本次输入来计算的:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

下图是<img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt="">的计算:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

现在,我们计算当前时刻的单元状态 c<sub>t</sub>。它是由上一次的单元状态 c<sub>t−1</sub> 按元素乘以遗忘门 f<sub>t</sub> ,再用当前输入的单元状态<img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt="">按元素乘以输入门 i<sub>t</sub> ,再将两个积加和产生的:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

符号O表示按元素乘。下图是 c<sub>t</sub> 的计算:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

这样,我们就把LSTM关于当前的记忆<img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt="">和长期的记忆 c<sub>t−1</sub> 组合在一起,形成了新的单元状态 c<sub>t</sub> 。由于遗忘门的控制,它可以保存很久很久之前的信息,由于输入门的控制,它又可以避免当前无关紧要的内容进入记忆。下面,我们要看看输出门,它控制了长期记忆对当前输出的影响:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

下面表示输出门的计算:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

LSTM最终的输出,是由输出门和单元状态共同确定的:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

下图表示LSTM最终输出的计算:

<center><img src="http://imgtec.eetrend.com/files/2021-01/%E5%8D%9A%E5%AE%A2/100061034-11…; alt=""></center><br>

式1到式6就是LSTM前向计算的全部公式。至此,我们就把LSTM前向计算讲完了。

<font style="line-height: 45px;" size="4" color="blue"><strong>长短时记忆网络的训练</strong></font>

<strong>LSTM训练算法框架</strong>

LSTM的训练算法仍然是反向传播算法,对于这个算法,我们已经非常熟悉了。主要有下面三个步骤:

1、前向计算每个神经元的输出值,对于LSTM来说,即 f<sub>t</sub>、i<sub>t</sub>、c<sub>t</sub>、o<sub>t</sub>、h<sub>t</sub> 五个向量的值。计算方法已经在上一节中描述过了。

2、反向计算每个神经元的误差项δ值。与循环神经网络一样,LSTM误差项的反向传播也是包括两个方向:一个是沿时间的反向传播,即从当前t时刻开始,计算每个时刻的误差项;一个是将误差项向上一层传播。

3、根据相应的误差项,计算每个权重的梯度。

<font color="#9a9a9a">作者:凌逆战</font>
<font color="#9a9a9a">来源:博客园</font>
<font color="#9a9a9a">原文链接:https://www.cnblogs.com/LXP-Never/p/10398531.html</font&gt;
<pre>欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
本文章不做任何商业用途,仅作为自学所用,文章后面会有参考链接,我可能会复制原作者的话,如果介意,我会修改或者删除。</pre>