LSTM理解
从上图我们可以看到,LSTM与普通循环网络不同的是,LSTM加入Memroy Cell以及input,forget,output gate三个门的概念。我们可以把Memory Cell简单的理解为前一状态在该状态的记忆,LSTM通过这三个门来对该状态进行操作。
Forget Gate:
遗忘门(forget gate):决定我们需要从cell状态中扔掉什么样的信息。通过sigmoid层将输入
h
t
−
1
,
x
t
h_{t-1},x_t
ht−1,xt转化为0和1之间的数。1代表“完全保留这个值”,而0代表“完全扔掉这个值”。
输入:
input Gate:
输入门(input gate)决定我们需要在cell中存储什么样的信息。这个问题有两个部分。第一,一个sigmoid层调用“输入门(input gate)”以决定哪些数据是需要更新的。然后,一个tanh层为新的候选值
C
^
t
\hat C_t
C^t创建一个向量 ,这些值能够加入state中。下一步,我们要将这两个部分合并以创建对state的更新。
具体来看,我们把前一状态
C
t
−
1
C_{t-1}
Ct−1与
f
t
f_t
ft相乘得到网络选择遗忘后的状态,然后加上通过input gate的新的记忆信息
i
t
∗
C
^
t
i_t * \hat C_t
it∗C^t.在决定需要遗忘和加入的记忆后,我们就可以将旧的cell memory
C
t
−
1
C_{t-1}
Ct−1计算得到新的cell memory
C
t
C_t
Ct。
Output Gate:
输出门(output gate),我们将cell memory中的值放入tanh得到记忆信息中需要的数据,再将其与sigmoid门的输出
O
t
O_t
Ot相乘得到最后我们需要的输出。这样LSTM所有的工作就完成了,最终的output就可以通过输入们遗忘门将前面长期的记忆与当前状态结合,从而区别与普通rnn。
LSTM举例
我们将(x1,x2,x3)看作输入,这是一个序列输入,当x2=1是,memory就等于memory+x1。当x2=-1时,memory等于0。x3=1,输出就是memory当前值。
我们将三个门的weights设置如上图,这些weights正好对应上面例题中的要求,我们利用之前说明的公式最终可以求出y的输出。大家可以试试,加强对LSTM的理解。
rnn难训练的原因:
如图,我们可以看到,w1,w2作为权重,total loss会出现悬崖式的上升或下降。所以,当loss平坦时,learning rate应该设置的大些,而当loss处于悬崖临界的时候,learning rate*梯度将使weights变化巨大,出现nan。
正如上图,我们用一个简单的rnn为例,输入如图为序列1,0,0···,输出为y1,y2,…y1000.当w=1时,y1000=1,当w=1.01,y1000=20000,而当w=0.99,y1000=0.所以,我们不难看出w的微小变化会剧烈影响y的输出,从而出现gradient vanish or gradient explode。我们很难设置合理的learning rate去train rnn。
LSTM可以消除gradeient vanishing
LSTM与普通rnn区别在于存在三个门,上面我们讲到,遗忘门可以选择前一状态的记忆与该状态的输入相加,形成该状态的记忆信息。所以只要遗忘门不关,前一状态的记忆就会影响该状态的输出。换句话说,lstm中,状态时通过累加的方式来计算的,他的导数不是乘积的形式,而rnn用覆盖的方式计算状态,是乘积的方式。所以lstm可以解决gradient vanishing,但是阻止不了gradient explode。
循环门单元(Gated Recurrent Unit,GRU)
它组合了遗忘门和输入门到一个单独的“更新门”中。它也合并了cell state和hidden state,并且做了一些其他的改变。结果模型比标准LSTM模型更简单。
从上图可见,reset gate产生
r
t
r_t
rt,
r
t
r_t
rt作为一个权重,来衡量前一状态的取舍,从而生成新的状态信息即候选隐藏层
h
^
t
\hat h_t
h^t。update gate产生
z
t
z_t
zt,它决定输出
h
t
h_t
ht从
h
t
−
1
h_{t-1}
ht−1和
h
^
t
\hat h_t
h^t中分别取多少。
GRU省略了output gate,所以从参数量上减少了三分之一,训练速度提高,同时通过实验验证性能与LSTM性能持平。