前言
LSTM是对Simple RNN的改进,可以避免梯度消失的问题,能够有更长的记忆力。
LSTM
1. LSTM:Conveyor Belt
过去的信息
C
t
−
1
C_{t-1}
Ct−1 通过一个传输带直接输送到下一个状态
C
t
C_t
Ct,不会发生太大的变化,由此来避免梯度消失的问题。
2. LSTM:Forget Gate
- 上一次的特征向量
h
t
−
1
h_{t-1}
ht−1 和 本次输入的向量
x
t
x_t
xt 经过与
W
f
W_f
Wf 的变换后输入sigmoid函数进行激活(输出在0到1)得到
f
t
f_t
ft,
f
t
f_t
ft 即为遗忘门的向量。其中
W
t
W_t
Wt 是需要被训练的参数
- 遗忘门向量再与上一个
c
t
−
1
c_{t-1}
ct−1 进行点乘,其中遗忘门向量为0表示彻底遗忘,遗忘门向量为1则为完全保留
3. LSTM:Input Gate
-
i
t
:
i_t:
it:
i
t
i_t
it 的计算方法和
f
t
f_t
ft 一样,但是参数矩阵
W
i
W_i
Wi 不一样,这个参数矩阵也是需要被训练的,
i
t
i_t
it 决定了下面的
C
t
~
\tilde{C_t}
Ct~ 有多少会被作用到传送带
-
c
t
~
:
\tilde{c_t}:
ct~: 把上面的激活函数换成了 tanh,输出范围变为
[
−
1
,
1
]
[-1,1]
[−1,1] ,其中
W
c
W_c
Wc 是需要被训练的矩阵,
c
t
~
\tilde{c_t}
ct~ 是在和
i
t
i_t
it 点乘后加到传送带的向量
4. LSTM:Update the Conveyor Belt
将上面算出的三个向量都用来更新
c
t
c_t
ct
5. LSTM:Output Gate
-
o
t
o_t
ot:决定
c
t
c_{t}
ct 有多少作用到
h
t
h_t
ht 上
6. LSTM: Update State
将
c
t
c_t
ct 丢进双曲正切函数进行激活,将元素的数值压到
[
−
1
,
1
]
[-1,1]
[−1,1],将激活过的数值与
o
t
o_t
ot 点乘得到
h
t
h_t
ht
这里有两份
h
t
h_t
ht ,一份传到了下一步,另一份作为输出
7. LSTM:Number of Parameters
一共有4个参数据矩阵,其中参数矩阵的计算方法和上节课 Simple RNN 一样。
- 行数:状态向量 h 的维度
- 列数:状态向量 h 的维度 + 输入 x 的维度
- 总参数:4 * (状态向量 h 的维度 + 输入 x 的维度)* 状态向量 h 的维度
LSTM for IMDB Review
代码与上节课的 Simple RNN 几乎完全一致,只需要把 RNN 的模型改成 LSTM即可:
结构和参数量如下:
模型的效果:比 Simple RNN 有提升
使用Dropout 并不能提升准确率,为什么?
- 虽然过拟合在LSTM中存在,但是LSTM只有八千多个参数
- 而Embedding层有32W个参数,固在这里对LSTM用Dropout没啥用,应该对Embedding层用Dropout