当前位置:   article > 正文

深度学习之循环神经网络(8)长短时记忆网络(LSTM)_深度学习 长短时记忆

深度学习 长短时记忆

深度学习之循环神经网络(8)长短时记忆网络(LSTM)


 循环神经网络除了训练困难,还有一个更严重的问题,那就是 短时记忆(Short-term memory)。考虑一个长句子:

今天天气太美好了,尽管路上发生了一件不愉快的事,…,我马上调整好状态,开开心心地准备迎接美好的一天。

根据我们的理解,之所以能够“ 开开心心地准备迎接美好的一天”,在于句子最开始处点明了“ 今天天气太美好了”。可见人类是能够很好地理解长句子的,但是循环神经网络却不一定。研究人员发现,循环神经网络在处理较长的句子时,往往只能够理解有限长度内的信息,而对于位于较长范围内的有用信息往往不能很好地利用起来。我们把这种现象叫做短时记忆。

 那么,能不能够延长这种短时记忆,使得循环神经网络可以有效利用较大范围内的训练数据,从而提升性能呢?1997年,瑞士人工智能科学家J u ¨ \ddot{\text{u}} u¨rgen Schmidhuber 提出了 长短时记忆网络(Long Short-Term Memory,简称LSTM)。LSTM相对于基础的RNN网络来说,记忆能力更强,更擅长处理较长的序列信号数据,LSTM提出后,被广泛应用在序列预测、自然语言处理等任务中,几乎取代了基础的RNN模型。

 接下来,我们将介绍更加流行、更加强大的LSTM网络。


0. LSTM原理

 基础的RNN网络结构如下图所示,上一个时间戳的状态向量 h t − 1 \boldsymbol h_{t-1} ht1与当前时间戳的输入 x t \boldsymbol x_t xt经过线性变换后,通过激活函数 tanh \text{tanh} tanh后得到新的状态向量 h t \boldsymbol h_t ht

在这里插入图片描述

基础RNN结构框图


相对于基础的RNN网络只有一个状态向量 h t \boldsymbol h_t ht,LSTM新增了一个状态向量 c t \boldsymbol c_t ct,同时引入了门控(Gate)机制,通过门控单元来控制信息的遗忘和刷新,如下图所示:

在这里插入图片描述

LSTM结构框图


 在LSTM中,有两个状态向量 c \boldsymbol c c h \boldsymbol h h,其中 c \boldsymbol c c作为LSTM的内部状态向量,可以理解为LSTM的内部状态向量Memory,而 h \boldsymbol h h表示LSTM的输出向量。相对于基础的RNN来说,LSTM把内部Memory和输出分开为两个变量,同时利用三个门控:输入门(Input Gate)遗忘门(Forget Gate)输出门(Output Gate)来控制内部信息的流动。

 门控机制可以理解为控制数据流通量的一种手段,类比于水阀门:当水阀门全部打开时,水流畅通无阻地通过;当水阀门全部关闭时,水流完全被隔断。在LSTM中,阀门开合程度利用门控值向量 g \boldsymbol g g表示,如下图所示,通过 σ ( g ) σ(\boldsymbol g) σ(g)激活函数将门控制压缩到 [ 0 , 1 ] [0,1] [0,1]之间的区间,当 σ ( g ) = 0 σ(\boldsymbol g)=0 σ(g)=0时,门控全部关闭,输出 o = 0 \boldsymbol o=0 o=0;当 σ ( g ) = 1 σ(\boldsymbol g)=1 σ(g)=1时,门控全部打开,输出 o = x \boldsymbol o=\boldsymbol x o=x。通过门控机制可以较好地控制数据的流量程度。

在这里插入图片描述

门控机制


 下面我们分别来介绍三个门控的原理及其作用。


1. 遗忘门

 遗忘门作用于LSTM状态向量 c \boldsymbol c c上面,用于控制上一个时间戳的记忆 c t − 1 \boldsymbol c_{t-1} ct1对当前时间戳的影响。遗忘门的控制变量 g f \boldsymbol g_f gf
g f = σ ( W f [ h t − 1 , x t ] + b f ) \boldsymbol g_f=σ(\boldsymbol W_f [\boldsymbol h_{t-1},\boldsymbol x_t ]+\boldsymbol b_f) gf=σ(Wf[ht1,xt]+bf)
产生,如下图所示:

在这里插入图片描述

遗忘门


 其中 W f \boldsymbol W_f Wf b f \boldsymbol b_f bf为遗忘门的参数张量,可由反向传播算法自动优化, σ σ σ激活函数,一般使用Sigmoid函数。当门控 g f = 1 \boldsymbol g_f=1 gf=1时,遗忘门全部打开,LSTM接受上一个状态 c t − 1 \boldsymbol c_{t-1} ct1,输出为0的向量。这也是遗忘门的名字由来。

 经过遗忘门后,LSTM的状态向量变为 g f c t − 1 \boldsymbol g_f \boldsymbol c_{t-1} gfct1


2. 输入门

 输入门用于控制LSTM对输入的接收程度。首先通过对当前时间戳的输入 x t \boldsymbol x_t xt和上一个时间戳的输出 h t − 1 \boldsymbol h_{t-1} ht1做非线性变换得到新的输入向量 c ~ t \tilde{\boldsymbol c}_t c~t
c ~ t = tanh ⁡ ( W c [ h t − 1 , x t ] + b c ) \tilde{\boldsymbol c}_t=\text{tanh}⁡(\boldsymbol W_c [\boldsymbol h_{t-1},\boldsymbol x_t ]+\boldsymbol b_c) c~t=tanh(Wc[ht1,xt]+bc)
其中 W c \boldsymbol W_c Wc b c \boldsymbol b_c bc为输入门的参数,需要通过反向传播算法自动优化, tanh \text{tanh} tanh为激活函数,用于将输入标准化到 [ − 1 , 1 ] [-1,1] [1,1]区间。 c ~ t \tilde{\boldsymbol c}_t c~t并不会全部刷新进入LSTM的Memory,而是通过输入门控制接受输入的量。输入门的控制变量同样来自于输入 x t \boldsymbol x_t xt和输出 h t − 1 \boldsymbol h_{t-1} ht1
g i = σ ( W i [ h t − 1 , x t ] + b i ) \boldsymbol g_i=σ(\boldsymbol W_i [\boldsymbol h_{t-1},\boldsymbol x_t ]+\boldsymbol b_i) gi=σ(Wi[ht1,xt]+bi)
其中 W i \boldsymbol W_i Wi b i \boldsymbol b_i bi为输入门的参数,需要通过反向传播算法自动优化, σ σ σ为激活函数,一般使用Sigmoid函数。输入门控制变量 g i \boldsymbol g_i gi决定了LSTM对当前时间戳的新输入 c ~ t \tilde{\boldsymbol c}_t c~t的接受程度:当 g i \boldsymbol g_i gi=0时,LSTM不接受任何新的输入 c ~ t \tilde{\boldsymbol c}_t c~t;当 g i = 1 \boldsymbol g_i=1 gi=1时,LSTM全部接受新输入 c ~ t \tilde{\boldsymbol c}_t c~t,如下图所示:
在这里插入图片描述

输入门


 经过输入门后,待写入Memory的向量为 g i c ~ t \boldsymbol g_i \tilde{\boldsymbol c}_t gic~t


3. 刷新Memory

 在遗忘门和输入门的控制下,LSTM有选择地读取了上一个时间戳的记忆 c t − 1 \boldsymbol c_{t-1} ct1和当前时间戳的新输入 c ~ t \tilde{\boldsymbol c}_t c~t,状态向量 c t \boldsymbol c_t ct的刷新方式为:
c t = g i c ~ t + g f c t − 1 \boldsymbol c_t=\boldsymbol g_i \tilde{\boldsymbol c}_t+\boldsymbol g_f \boldsymbol c_{t-1} ct=gic~t+gfct1
得到的新状态向量 c t \boldsymbol c_t ct即为当前时间戳的状态向量。如下图所示:

在这里插入图片描述

刷新Memory

4. 输出门

 LSTM的内部状态向量 c t \boldsymbol c_t ct并不会直接用于输出,这一点和基础的RNN不一样。基础的RNN网络的状态向量 h \boldsymbol h h既用于记忆,又用于输出,所以基础的RNN可以理解为状态向量 c \boldsymbol c c和输出向量 h \boldsymbol h h是同一个对象。在LSTM内部,状态向量并不会全部输出,而是在输出门的作用下有选择地输出。输出门的门控变量 g o \boldsymbol g_o go为:
g o = σ ( W o [ h t − 1 , x t ] + b o ) \boldsymbol g_o=σ(\boldsymbol W_o [\boldsymbol h_{t-1},\boldsymbol x_t ]+\boldsymbol b_o) go=σ(Wo[ht1,xt]+bo)
其中 W o \boldsymbol W_o Wo b o \boldsymbol b_o bo为输出门的参数,同样需要通过反向传播算法自动优化, σ σ σ为激活函数,一般使用Sigmoid函数。当输出门 g o = 0 \boldsymbol g_o=0 go=0时,输出关闭,LSTM的内部记忆完全被隔断,无法用作输出,此时输出为0的向量;当输出门 g o = 1 \boldsymbol g_o=1 go=1时,输出完全打开,LSTM的状态向量 c t \boldsymbol c_t ct全部用于输出。LSTM的输出由:
h t = g o ⋅ tanh⁡ ( c t ) \boldsymbol h_t=\boldsymbol g_o\cdot \text{tanh⁡}(\boldsymbol c_t) ht=gotanh⁡(ct)
产生,即内存向量 c t \boldsymbol c_t ct经过 tanh \text{tanh} tanh激活函数后与输入门作用,得到LSTM的输出。由于 g o ∈ [ 0 , 1 ] \boldsymbol g_o\in[0,1] go[0,1] tanh ⁡ ( c t ) ∈ [ − 1 , 1 ] \text{tanh}⁡(\boldsymbol c_t )\in[-1,1] tanh(ct)[1,1],因此LSTM的输出 h t ∈ [ − 1 , 1 ] \boldsymbol h_t\in[-1,1] ht[1,1]

在这里插入图片描述

输出门

5. 小结

 LSTM虽然状态向量和门控数量较多,计算流程相对复杂。但是由于每个门控功能清晰明确,每个状态的作用也比较好理解。这里将典型的门控行为列举出来,并解释其代码的LSTM行为,如下表所示:

输入门和遗忘门的典型行为
输入门控遗忘门控LSTM行为
01只使用记忆
11综合输入和记忆
00清零记忆
10输入覆盖记忆
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/355722
推荐阅读
相关标签
  

闽ICP备14008679号