1997 年,Hochreiter 和 Schmidhuber 提出长短期记忆网络 (Long Short Term Memory, LSTM),这是一种特殊的循环神经网络,能够学习长期依赖性。由于梯度爆炸/消失的影响,RNN 只能学到短期依赖关系。如果一个序列过长,RNN 中梯度更新幅度小的网络层 (通常是较早的层) 将停止学习,很难把较早的信息传输到后面,造成了较早的信息的遗失。
LSTM 是 RNN 的升级版,是为了克服短期记忆问题而提出的解决方案。普通 RNN 隐层中只有单一的神经网络层 (如 tanh 层),但在 LSTM 中增加至 4 个。此外,LSTM 还引入了 “门” 机制来调节信息流。这些门结构可以保留/删除序列中的特定信息,沿着长链序列传递相关信息来实现预测。LSTM 网络结构如下
图中各模块定义为
- 黄色方块:神经网络层;
- 粉色圆圈:按位操作或逐点操作 (如向量加和、向量乘积等);
- 单箭头:信号传递;
- 合流箭头:信号的连接 (向量拼接);
- 分流箭头:信号的复制分流。
LSTM 有两个关键,其一是单元状态
C
t
C_t
Ct。LSTM 接收上一个时刻的单元状态
C
t
−
1
C_{t-1}
Ct−1,与当前信号作用 (信息的增/删与融合) 产生新的单元状态
C
t
C_{t}
Ct,最后传递至下一时刻。LSTM 中引入的“门”是另一关键,门用来控制
C
t
C_t
Ct 中信息的增/删。门是一种让信息选择性通过的方法,有的直接控制信号通过与否,有的则在信息通过的过程中对信息进行加工。LSTM 存在着遗忘门、记忆门和输出门三种门结构,使用了
S
i
g
m
o
i
d
Sigmoid
Sigmoid 和
t
a
n
h
tanh
tanh 两种神经网络层。
- tanh 层:由输入门与 t a n h tanh tanh 神经网络层和一个按位乘操作构成;
- Sigmoid 层:由一个 S i g m o i d Sigmoid Sigmoid 神经网络层和一个按位乘操作构成;
- 遗忘门:由一个 S i g m o i d Sigmoid Sigmoid 神经网络层和一个按位乘操作构成;
- 输入门:由输入门与 t a n h tanh tanh 神经网络层和一个按位乘操作构成;
- 输出门:与 t a n h tanh tanh 函数以及按位乘操作共同作用将细胞状态和输入信号传递到输出端。
Tanh 网络层的果与 Tanh 函数相同,其输出位于区间 (-1, 1) 内,用于调节流经网络的值。当向量流经网络时,向量经历了许多数学变换,其输出范围难以预料。使用 Tanh 层则能够将参数取值限制在一定范围内。
Sigmoid 网络层与 Tanh 网络层类似,其输出区间为 (0, 1),用于控制信息的保留/删除。其输出值介于 0~1 之间,可视作一个比例因子,控制信息通过的比例。
|
|
|---|---|
| Tanh 函数 | Sigmoid 函数 |
遗忘门结构如下图高亮部分所示。遗忘门用来“忘记”信息,用来实现上一时刻单元状态 C t − 1 C_{t-1} Ct−1 中信息的过滤选择。具体而言, S i g m o i d Sigmoid Sigmoid 层以当前输入 x t x_t xt 和上一时刻隐层状态 h t − 1 h_{t-1} ht−1 为输入,计算得到参数 f t f_t ft。最后通过 f t f_t ft 和 C t − 1 C_{t-1} Ct−1 的乘积,得到选择性遗忘后的输出 C t ′ C'_{t} Ct′。值得注意的是,遗忘门虽以 x t x_t xt 和 h t − 1 h_{t-1} ht−1 为输入,但输出 f t ∈ ( 0 , 1 ) f_t \in (0, 1) ft∈(0,1) 是个标量,所以在整个过程中并不存在新信息的流入。
此处给出遗忘门的动画演示
输入门结构如下图高亮部分所示。输入门的作用与遗忘门相反,它决定着
x
t
x_t
xt 和
h
t
h_t
ht 中哪些信息会被添加至
C
t
C_t
Ct 中。输入门中同时存在
S
i
g
m
o
i
d
Sigmoid
Sigmoid 层和
T
a
n
h
Tanh
Tanh 层。
i
t
i_t
it 为
S
i
g
m
o
i
d
Sigmoid
Sigmoid 层输出,与
f
t
f_t
ft 类似,
i
t
i_t
it 是个决定添加信息程度的标量。
S
i
g
m
o
i
d
Sigmoid
Sigmoid 分支不涉及信息的流动,新增信息通过
T
a
n
h
Tanh
Tanh 分支流入。
T
a
n
h
Tanh
Tanh 层输出
C
~
t
\tilde{C}_t
C~t 是个中间变量,被称作候选状态。
C
~
t
\tilde{C}_t
C~t 通过与
i
t
i_t
it 的乘积,最终确定被添加至
C
t
C_t
Ct 中的信息,这部分信息将被“记住”。
此处给出输入门的动画演示
观察下图,贯穿图片顶部的水平线代表传送带机制,上面是单元状态 C t C_t Ct。在向量贯穿过程中,仅有少量线性操作,这使得信息很容易以不变的方式流过。单元状态相当于传输信息的通路,让信息在序列链中传递下去,这部分可看作是网络的 “记忆”。理论上,在序列处理过程中,单元状态能够一直携带相关信息。因此,早先获得的信息也能够持续传输,达到长时间记忆的效果。
如果遗忘门和输入门都已掌握,那单元状态更新部分就很好理解了。遗忘门遗忘了 C t C_t Ct 中的部分信息,得到 f t ∗ C t f_t * C_t ft∗Ct;输入门从输入信息中挑选了部分信息进行记忆,得到 i t ∗ C ~ t i_t * \tilde{C}_t it∗C~t;用二者的加和完成 C t C_t Ct 的更新
此处,给出细胞状态更新的动画演示
输出门结构如下图高亮部分所示。输出门决定着隐藏状态 h t h_t ht 的值,而 h t h_t ht 中蕴含着先前输入的相关信息。与前文类似, o t o_t ot 是 S i g m o i d Sigmoid Sigmoid 层的输出标量, T a n h Tanh Tanh 层则完成 C t C_t Ct 的变换。最后,以二者的乘积确定 h t h_t ht 所携带的信息
此处,给出输出门动画演示
To be continue…
To be continue…
【参考】