Self-Attention和RNN、LSTM的区别
RNN(循环神经网络)
- RNN,当前的输出 o t o_t ot取决于上一个的输出 o t − 1 o_{t-1} ot−1(作为当前的输入 x t − 1 x_{t-1} xt−1)和当前状态下前一时间的隐变量 h t h_t ht,隐变量和隐变量的权重 W h h W_hh Whh存储当前状态下前一段时间的历史信息,如果我们去掉 W h h ∗ h t − 1 W_{hh} * h_{t-1} Whh∗ht−1,RNN就退化为MLP
- 在RNN中,我们根据前一个的输出和当前的隐变量,就可以预测当前的输出。当前的隐变量也是由上一个隐变量和前一个输出
(即当前的输入)所决定的
- 所以RNN其实就是MLP多了一个时间轴,能存储前一段时间的历史信息,并根据这个历史信息来更新层的参数
- 同时由于RNN会不加选择的存储前一段时间的历史信息,所以如果序列太长,即句子太长,隐变量会存储太多信息,那么RNN就不容易提取很早之前的信。
- 同时由于RNN会不加选择的存储前一段时间的历史信息,所以如果序列太长,即句子太长,隐变量会存储太多信息,那么RNN就不容易提取很早之前的信。
GRU(门控神经网络)
- 为了解决RNN处理不了很长的序列,我们可以有选择的存储历史信息,通过更新门和重置门,来只关注有变化的重点信息
- GRU引入了
R
t
R_t
Rt、
Z
t
Z_t
Zt、
H
~
t
\widetilde{H}_t
H
t
- 其中
R
t
R_t
Rt、
Z
t
Z_t
Zt为控制单元,是可以学习的参数,由于最后用了sigmoid函数,所以范围在(0,1),表示要不要进行Reset和Update操作
- 其中
H
~
t
\widetilde{H}_t
H
t为候选隐变量,跟
R
t
R_t
Rt有关,
R
t
∗
H
t
−
1
R_t * H_{t-1}
Rt∗Ht−1表示:候选隐变量要使用多少过去隐变量的信息
- 而 H t H_t Ht为真正的新的隐变量,跟 Z t Z_t Zt有关, ( 1 − Z t ) ⊙ H ~ t (1 - Z_t)\odot\widetilde{H}_t (1−Zt)⊙H t表示:新的隐变量要使用多少当前输入的信息
- 通常情况下:GRU会在以下极端情况中,进行可学习的调整,来决定是多去看当前的输入信息,还是多去看前一次的隐变量
- 极端情况如下:
- 其中
R
t
R_t
Rt、
Z
t
Z_t
Zt为控制单元,是可以学习的参数,由于最后用了sigmoid函数,所以范围在(0,1),表示要不要进行Reset和Update操作
- 当 Z t Z_t Zt为0, R t R_t Rt为1时: H t H_t Ht = H ~ t \widetilde{H}_t H t,不遗忘前一次的隐变量,GRU就退化为RNN
- 当 Z t Z_t Zt为1时:不考虑候选隐变量, H t H_t Ht = H t − 1 H_{t-1} Ht−1,即不使用 X t X_t Xt更新隐变量
- 当
R
t
R_t
Rt为0,
Z
t
Z_t
Zt为0时:
H
t
H_t
Ht =
H
~
t
\widetilde{H}_t
H
t,不使用前一次的隐变量,GRU就退化为MLP
LSTM(长短期记忆网络)
- LSTM和GRU都是实现这个效果:是要多去看现在的输入信息,还是要多去看前一次的隐变量,即过去的信息
- 但是LSTM可以多实现一个效果:什么都不看,直接重置清零
- 但是LSTM中的状态有两个:
C
t
C_t
Ct记忆单元、
H
t
H_t
Ht隐变量
- 注意:LSTM额外引入的 C t C_t Ct记忆单元, C t C_t Ct的范围在(-2,2)之间,来增加模型复杂度,多存储信息,并且让 H t H_t Ht的范围仍在(-1,1)之间,防止梯度爆炸。
- 注意:LSTM中的忘记门、输入门、输出门的具体公式和GRU的更新门、重置门一样
-
C
~
t
\widetilde{C}_t
C
t候选记忆单元:LSTM中的候选记忆单元和RNN中的
H
t
H_t
Ht的计算公式一样,没有用到任何门,但是由于最后用了tanh(),所以范围在(-1,1)之间
-
C
t
C_t
Ct记忆单元:LSTM中的记忆单元和GRU中的
H
t
H_t
Ht不一样,记忆单元可以既多看上一个的记忆单元,又多看当前的候选记忆单元(当前的输入信息
X
t
X_t
Xt)。记忆单元也可以即不要上一个的记忆单元,又不要当前的候选记忆单元。但是GRU中的
H
t
H_t
Ht为
Z
T
Z_T
ZT和
1
−
Z
t
1-Z_t
1−Zt,所以要么多看上一个的隐变量,要么多看当前的候选隐变量
-
H
t
H_t
Ht隐变量:由于
F
t
F_t
Ft和
I
t
I_t
It都是(0,1),而
C
~
t
\widetilde{C}_t
C
t在(-1,1),但是
C
t
−
1
C_{t-1}
Ct−1可以特别大(跟
C
C
C的初始值有关),所以上一步的
C
t
C_t
Ct的范围无法保证,那么为了防止梯度爆炸,我们需要再做一次tanh()变换。
- 注意:此时的
O
t
O_t
Ot来控制要不要输出当前的输入信息和前一次的隐变量,当
O
t
O_t
Ot为0时,表示重置清零
- 注意:此时的
O
t
O_t
Ot来控制要不要输出当前的输入信息和前一次的隐变量,当
O
t
O_t
Ot为0时,表示重置清零
- 总结:通过引入记忆单元,LSTM比GRU更灵活,即可以既多看当前的记忆单元(当前的输入信息
X
t
X_t
Xt),又可以多看前一个的记忆单元,也可以两者都不看都忘掉,还可以多存储信息。同时保留
H
t
H_t
Ht,防止梯度爆炸,还能重置清零隐变量