长短期记忆网络 LSTM
文章目录
一、概述
长短期记忆网络——通常被称为LSTM,是一种特殊的RNN,能够学习长期依赖性。由Hochreiter和Schmidhuber(1997)提出,并且在接下来的工作中被许多人改进和推广。LSTM 在各种各样的问题上表现非常出色,现在被广泛使用。LSTM被明确设计用来避免长期依赖性问题。LSTM单元由单元,输入门,输出门和忘记门组成。该单元记住任意时间间隔内的值,并且三个门控制进出单元的信息流。
LSTM网络非常适合基于时间序列数据进行分类,处理和预测,因为在时间序列中的重要事件之间可能存在未知持续时间的滞后。开发LSTM是为了处理在训练传统RNN时可能遇到的爆炸和消失的梯度问题。对于间隙长度的相对不敏感性是LSTM相对于RNN,隐马尔可夫模型和其他序列学习方法在许多应用中的优势。
二、背景
传统RNN的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。但是会有一些复杂的场景。上下文距离预测词较远,即相关信息和当前预测位置之间的间隔相当的大,在这个间隔不断增大时,传统RNN会丧失学习到连接如此远的信息的能力。
循环神经网络中的LSTM可以解决这种问题,即长短期记忆网络。LSTM引入了门(gate)机制用于控制特征的流通和损失,其中输入门用来接受近期有用的信息,遗忘门用来对久远的、无用的信息选择性的遗忘,输出门的输出为根据当前状态决定的输出。可以解决RNN无法处理长距离的依赖的问题。
三、LSTM原理
3.1 模型结构
原始RNN的隐藏层只有一个状态h,对于短期的输入非常敏感。LSTM再增加一个状态c,用来保存长期的状态,称为单元状态(cell state)。
在 t t t时刻,LSTM的输入有三个:
- 当前时刻网络的输入值 x t x_t xt
- 上一时刻LSTM的输出值 h t − 1 h_{t-1} ht−1
- 上一时刻的单元状态 c t − 1 c_{t-1} ct−1
LSTM的输出有两个:
- 当前时刻LSTM输出值 h t h_t ht
- 当前时刻的单元状态 c t c_t ct
在LSTM模型结构中,采用门(gate)来控制长期状态,在一层模型里有三个门,分别作用为:
- 负责控制继续保存长期状态 c c c
- 负责控制把即时状态输入到长期状态 c c c
- 负责控制是否把长期状态 c c c作为当前的LSTM的输出
gate实际上就是一层全连接层,输入是一个向量,输出是一个0到1之间的实数向量。公式为: g ( x ) = σ ( W x + b ) g(x) = \sigma(Wx+b) g(x)=σ(Wx+b)
3.2 前向传播
LSTM每个模块中的具体结构如下:
遗忘门(forget gate):决定了上一时刻的单元状态 c t − 1 c_{t-1} ct−1如何保留到当前时刻 c t c_t ct。
遗忘阶段是对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。
具体来说是通过计算得到的 f t f_t ft(f表示forget)来作为遗忘门控,来控制上一个状态的 c t − 1 c_{t-1} ct−1的忘记的概率。
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f·[h_{t-1},x_t]+b_f) ft=σ(Wf⋅[ht−1,xt]+bf)
输入门(input gate):决定了当前时刻网络的输入 x t x_t xt如何保存到单元状态 c t c_t ct。
这个阶段确定什么样的新信息被存放在细胞状态中。这里包含两个部分:1)sigmoid层为 “输入门层” ,主要对输入 x t x_t xt进行选择记忆。2)tanh层创建一个新的候选值向量 C ~ t \tilde{C}_t C~t,加入到状态中。
i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i·[h_{t-1},x_t]+b_i) it=σ(Wi⋅[ht−1,xt]+bi)
C ~ t = tanh ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C}_t = \tanh(W_C·[h_{t-1},x_t]+b_C) C~t=tanh(WC⋅[ht−1,xt]+bC)
细胞更新(Update Cell):决定了如何计算当前序列下的细胞值 C t C_t Ct。
新的细胞状态由两部分组成,1)旧细胞 C t − 1 C_{t-1} Ct−1与 f t f_t ft相乘,丢弃掉之前序列的信息;2)新的候选值 C ~ t \tilde{C}_t C~t与比例系数 i t i_t it的积,保留当前的输入信息。
C t = f t ⊙ C t − 1 + i t ⊙ C ~ t C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t Ct=ft⊙Ct−1+it⊙C~t
其中, ⊙ \odot ⊙为Hadamard积
输出门(output gate):控制单元状态 C t C_t Ct有多少输出到LSTM的当前输出值 h t h_t ht。
隐藏状态 h t h_t ht的更新由两部分组成:1) o t o_t ot, 它由上一序列的隐藏状态 h t − 1 h_{t−1} ht−1和输入数据 x t x_t xt构成,通过激活函数sigmoid进行过滤;2)由隐藏状态 C t C_t Ct和tanh函数构成,tanh将 C t C_t Ct处理得到一个在 ( − 1 , 1 ) (-1,1) (−1,1)之间的值,然后将其与sigmoid门相乘得到 h t h_t ht。
o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t = \sigma(W_o·[h_{t-1},x_t]+b_o) ot=σ(Wo⋅[ht−1,xt]+bo)
h t = o t ⊙ tanh ( C t ) h_t = o_t \odot \tanh(C_t) ht=ot⊙tanh(C