LSTM 与 GRU

LSTM

全称:Long Short-Term Memory 长短期记忆网络

大致结构如图所示(不想用软件画图。。。):

LSTM 与 GRU_第1张图片

三个门已经在图中表示了出来。下面将逐步介绍。
图中最上面的C是最主要的传输流。

遗忘门
f t = δ ( W f ⋅ [ h t − 1 , X t ] ) f_t = \delta(W_f\cdot[h_{t-1},X_t]) ft=δ(Wf[ht1,Xt])(这里b放入了 X t X_t Xt中)
输出值在[0,1]之间。和 C t − 1 C_{t-1} Ct1相乘,代表保留 C t − 1 C_{t-1} Ct1中多少信息。
1代表完全保留,0代表完全舍弃。

输入门
i t = δ ( W i ⋅ [ h t − 1 , X t ] ) C ^ t = t a n h ( W C ⋅ [ h t − 1 , X t ] ) i_t = \delta(W_i\cdot[h_{t-1},X_t]) \\ \hat C_t = tanh(W_C\cdot[h_{t-1},X_t]) it=δ(Wi[ht1,Xt])C^t=tanh(WC[ht1,Xt])
C t = i t ∗ C ^ t + f t ∗ C t − 1 C_t = i_t*\hat C_t + f_t*C_{t-1} Ct=itC^t+ftCt1
i t i_t it代表了要更新的内容, C ^ t \hat C_t C^t代表了备用的要更新的内容,通过一个+号,完成更新,得到 C t C_t Ct(还不是最终的 C t C_t Ct)。

输出门
O t = δ ( W o ⋅ [ h t − 1 , X t ] ) C t = O t ∗ t a n h ( C t ) O_t = \delta(W_o\cdot[h_{t-1},X_t]) \\ C_t = O_t* tanh(C_t) Ot=δ(Wo[ht1,Xt])Ct=Ottanh(Ct)
O t O_t Ot决定了将要哪些部分进行输出,tanh将 C t C_t Ct限定在[-1,1]之间。

总体来说,就是在输入之间先丢弃一部分信息,在输入时更新一部分信息,在输出时再选择输出一部分信息。



GRU

LSTM 与 GRU_第2张图片
图片来自:https://blog.csdn.net/weixin_42612033/article/details/85622891
GRU 只有两个门:重置门( r t r_t rt)(相当于 lstm 的遗忘门和输入门)和 更新门( z t z_t zt
这篇文章说得很好:https://www.zhihu.com/search?type=content&q=gru
选择 gru 的原因:计算比 lstm 简单。


关于 rnn 的输入输出
lstm 一次只处理一个句子,每个句子经过 word_embedding 后 变为一个矩阵:每一列为一个词向量。rnn 的 time_step 大小与 句子中词的个数相同。rnn 每个 time_step 处理一个词向量。rnn 的cell 个数指的是每个 time_step 的 cell 个数,决定了每个 time_step 的输出向量的维度。
贴一张知乎上的图片,十分形象:
LSTM 与 GRU_第3张图片
注意输出不要被图所迷惑了,每个 time_step 的输出是同一个输出向量在不同时刻的变化,而不是每个time_step 都产生新的输出向量。即在不考虑 batch_size 的情况下,输出是一维,而不是二维。



RNN 为什么会产生梯度消失和梯度爆炸?以及 LSTM 为什么能解决梯度消失?
根据 BPTT 的链式求导法则,每个时间步的激活函数的导数若 < 1, 那么它们累积的结果接近于0,导致梯度消失反之若 > 1,那么累积的结果会非常大,导致梯度爆炸。
解决办法:

  • 梯度消失:relu、lstm
  • 梯度爆炸:梯度截断、relu
    lstm 是怎么解决的待定。。。

参考博客:
https://blog.csdn.net/gzj_1101/article/details/79376798
https://www.zhihu.com/search?type=content&q=gru
https://blog.csdn.net/weixin_42612033/article/details/85622891
https://www.zhihu.com/question/41949741/answer/318771336

你可能感兴趣的:(深度学习)