←上一篇 ↓↑ 下一篇→
1.9 GRU 单元 回到目录 1.11 双向神经网络

长短期记忆 ((LSTM) Long Short Term Memory Unit)

在上一个视频中你已经学了GRU(门控循环单元)。它能够让你可以在序列中学习非常深的连接。其他类型的单元也可以让你做到这个,比如LSTM即长短时记忆网络,甚至比GRU更加有效,让我们看看。

这里是上个视频中的式子,对于GRU我们有 a < t > = c < t > a^{<t>}=c^{<t>} a<t>=c<t> 。

还有两个门:

更新门 Γ u \Gamma_u Γu​ (the update gate

相关门 Γ r \Gamma_r Γr​ (the relevance gate

c ~ < t > \tilde{c}^{<t>} c~<t> ,这是代替记忆细胞的候选值,然后我们使用更新门 Γ u \Gamma_u Γu​ 来决定是否要用 c ~ < t > \tilde{c}^{<t>} c~<t> 更新 c < t > c^{<t>} c<t> 。

LSTM是一个比GRU更加强大和通用的版本,这多亏了 Sepp HochreiterJurgen Schmidhuber,感谢那篇开创性的论文,它在序列模型上有着巨大影响。我感觉这篇论文是挺难读懂的,虽然我认为这篇论文在深度学习社群有着重大的影响,它深入讨论了梯度消失的理论,我感觉大部分的人学到LSTM的细节是在其他的地方,而不是这篇论文。

这就是LSTM主要的式子(上图编号2所示),我们继续回到记忆细胞c上面来,使用来 c ~ < t > = t a n h ( W c [ a < t − 1 > , x < t > ] + b c ) \tilde{c}^{<t>}=tanh(W_c[a^{<t-1>},x^{<t>}]+b_c) c~<t>=tanh(Wc​[a<t−1>,x<t>]+bc​) 更新它的候选值 c ~ < t > \tilde{c}^{<t>} c~<t> (上图编号3所示)。注意了,在LSTM中我们不再有 a < t > = c < t > a^{<t>}=c^{<t>} a<t>=c<t> 的情况,这是现在我们用的是类似于左边这个式子(上图编号4所示),但是有一些改变,现在我们专门使用 a < t > a^{<t>} a<t> 或者 a < t − 1 > a^{<t-1>} a<t−1> ,而不是用 c < t − 1 > c^{<t-1>} c<t−1> ,我们也不用 Γ r \Gamma_r Γr​ ,即相关门。虽然你可以使用LSTM的变体,然后把这些东西(左边所示的GRU公式)都放回来,但是在更加典型的LSTM里面,我们先不那样做。

我们像以前那样有一个更新门 Γ u \Gamma_u Γu​ 和表示更新的参数 W u W_u Wu​ , Γ u = σ ( W u [ a < t − 1 > , x < t > ] + b u ) \Gamma_u=\sigma(W_u[a^{<t-1>},x^{<t>}]+b_u) Γu​=σ(Wu​[a<t−1>,x<t>]+bu​) (上图编号5所示)。一个LSTM的新特性是不只有一个更新门控制,这里的这两项(上图编号6,7所示),我们将用不同的项来代替它们,要用别的项来取代 Γ u \Gamma_u Γu​ 和 1 − Γ u 1-\Gamma_u 1−Γu​ ,这里(上图编号6所示)我们用 Γ u \Gamma_u Γu​ 。

然后这里(上图编号7所示)用遗忘门(the forget gate),我们叫它 Γ f \Gamma_f Γf​ ,所以这个 Γ f = σ ( W f [ a < t − 1 > , x < t > ] + b f ) \Gamma_f=\sigma(W_f[a^{<t-1>},x^{<t>}]+b_f) Γf​=σ(Wf​[a<t−1>,x<t>]+bf​) (上图编号8所示);

然后我们有一个新的输出门, Γ o = σ ( W o [ a < t − 1 > , x < t > ] + b o ) \Gamma_o=\sigma(W_o[a^{<t-1>},x^{<t>}]+b_o) Γo​=σ(Wo​[a<t−1>,x<t>]+bo​) (上图编号9所示);

于是记忆细胞的更新值 c < t > = Γ u ∗ c ~ < t > + Γ f ∗ c < t − 1 > c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+\Gamma_f*c^{<t-1>} c<t>=Γu​∗c~<t>+Γf​∗c<t−1> (上图编号10所示);

所以这给了记忆细胞选择权去维持旧的值 c < t − 1 > c^{<t-1>} c<t−1> 或者就加上新的值 c ~ < t > \tilde{c}^{<t>} c~<t> ,所以这里用了单独的更新门 Γ u \Gamma_u Γu​ 和遗忘门 Γ f \Gamma_f Γf​ ,

然后这个表示更新门( Γ u = σ ( W u [ a < t − 1 > , x < t > ] + b u ) \Gamma_u=\sigma(W_u[a^{<t-1>},x^{<t>}]+b_u) Γu​=σ(Wu​[a<t−1>,x<t>]+bu​) 上图编号5所示);

遗忘门( Γ f = σ ( W f [ a < t − 1 > , x < t > ] + b f ) \Gamma_f=\sigma(W_f[a^{<t-1>},x^{<t>}]+b_f) Γf​=σ(Wf​[a<t−1>,x<t>]+bf​) 上图编号8所示)和输出门(上图编号9所示)。

最后 a < t > = c < t > a^{<t>}=c^{<t>} a<t>=c<t> 的式子会变成 a < t > = Γ o ∗ c < t > a^{<t>}=\Gamma_o*c^{<t>} a<t>=Γo​∗c<t> 。这就是LSTM主要的式子了,然后这里(上图编号11所示)有三个门而不是两个,这有点复杂,它把门放到了和之前有点不同的地方。

再提一下,这些式子就是控制LSTM行为的主要的式子了(上图编号1所示)。像之前一样用图片稍微解释一下,先让我把图画在这里(上图编号2所示)。如果图片过于复杂,别担心,我个人感觉式子比图片好理解,但是我画图只是因为它比较直观。这个右上角的图的灵感来自于Chris Ola的一篇博客,标题是《理解LSTM网络》(Understanding LSTM Network),这里的这张图跟他博客上的图是很相似的,但关键的不同可能是这里的这张图用了 a < t − 1 > a^{<t-1>} a<t−1> 和 x < t > x^{<t>} x<t> 来计算所有门值(上图编号3,4所示),在这张图里是用 a < t − 1 > , x < t > a^{<t-1>},x^{<t>} a<t−1>,x<t> 一起来计算遗忘门 Γ f \Gamma_f Γf​ 的值,还有更新门 Γ u \Gamma_u Γu​ 以及输出门 Γ o \Gamma_o Γo​ (上图编号4所示)。然后它们也经过tanh函数来计算 c ~ < t > \tilde{c}^{<t>} c~<t> (上图编号5所示),这些值被用复杂的方式组合在一起,比如说元素对应的乘积或者其他的方式来从之前的 c < t − 1 > c^{<t-1>} c<t−1> (上图编号6所示)中获得 c < t > c^{<t>} c<t> (上图编号7所示)。

这里其中一个元素很有意思,如你在这一堆图(上图编号8所示的一系列图片)中看到的,这是其中一个,再把他们连起来,就是把它们按时间次序连起来,这里(上图编号9所示)输入 x < 1 > x^{<1>} x<1> ,然后 x < 2 > , x < 3 > x^{<2>},x^{<3>} x<2>,x<3> ,然后你可以把这些单元依次连起来,这里输出了上一个时间的 a , a a,a a,a 会作为下一个时间步的输入, c c c 同理。在下面这一块,我把图简化了一下(相对上图编号2所示的图有所简化)。然后这有个有意思的事情,你会注意到上面这里有条线(上图编号10所示的线),这条线显示了只要你正确地设置了遗忘门和更新门,LSTM是相当容易把的 c < 0 > c^{<0>} c<0> 值(上图编号11所示)一直往下传递到右边,比如 c < 3 > = c < 0 > c^{<3>}=c^{<0>} c<3>=c<0> (上图编号12所示)。这就是为什么LSTMGRU非常擅长于长时间记忆某个值,对于存在记忆细胞中的某个值,即使经过很长很长的时间步。

这就是LSTM,你可能会想到这里和一般使用的版本会有些不同,最常用的版本可能是门值不仅取决于 a < t − 1 > a^{<t-1>} a<t−1> 和 x < t > x^{<t>} x<t> ,有时候也可以偷窥一下 c < t − 1 > c^{<t-1>} c<t−1> 的值(上图编号13所示),这叫做“窥视孔连接”(peephole connection)。虽然不是个好听的名字,但是你想,“偷窥孔连接”其实意思就是门值不仅取决于 a < t − 1 > a^{<t-1>} a<t−1> 和 x < t > x^{<t>} x<t> ,也取决于上一个记忆细胞的值( c < t − 1 > c^{<t-1>} c<t−1> ),然后“偷窥孔连接”就可以结合这三个门( Γ u 、 Γ f 、 Γ o \Gamma_u、\Gamma_f、\Gamma_o Γu​、Γf​、Γo​ )来计算了。

如你所见LSTM主要的区别在于一个技术上的细节,比如这(上图编号13所示)有一个100维的向量,你有一个100维的隐藏的记忆细胞单元,然后比如第50个 c < t − 1 > c^{<t-1>} c<t−1> 的元素只会影响第50个元素对应的那个门,所以关系是一对一的,于是并不是任意这100维的 c < t − 1 > c^{<t-1>} c<t−1> 可以影响所有的门元素。相反的,第一个 c < t − 1 > c^{<t-1>} c<t−1> 的元素只能影响门的第一个元素,第二个元素影响对应的第二个元素,如此类推。但如果你读过论文,见人讨论“偷窥孔连接”,那就是在说 c < t − 1 > c^{<t-1>} c<t−1> 也能影响门值。

LSTM前向传播图:


LSTM反向传播计算:

门求偏导:

d Γ o < t > = d a n e x t ∗ t a n h ( c n e x t ) ∗ Γ o < t > ∗ ( 1 − Γ o < t > ) (1) d\Gamma_o^{<t>}=da_{next}*tanh(c_{next})*\Gamma_o^{<t>}*(1-\Gamma_o^{<t>}) \tag{1} dΓo<t>​=danext​∗tanh(cnext​)∗Γo<t>​∗(1−Γo<t>​)(1) d c ~ < t > = d c n e x t ∗ Γ i < t > + Γ o < t > ( 1 − t a n h ( c n e x t ) 2 ∗ i t ∗ d a n e x t ∗ c ~ < t > ∗ ( 1 − t a n h ( c ~ ) 2 ) (2) d\tilde{c}^{<t>}=dc_{next}*\Gamma_i^{<t>}+\Gamma_o^{<t>}(1-tanh(c_{next})^2*i_t*da_{next}*\tilde{c}^{<t>}*(1-tanh(\tilde{c})^2) \tag{2} dc~<t>=dcnext​∗Γi<t>​+Γo<t>​(1−tanh(cnext​)2∗it​∗danext​∗c~<t>∗(1−tanh(c~)2)(2) d Γ u < t > = d c n e x t ∗ c ~ < t > + Γ o < t > ( 1 − t a n h ( c n e x t ) 2 ∗ c ~ t ∗ d a n e x t ∗ Γ u < t > ∗ ( 1 − Γ u < t > ) (3) d\Gamma_u^{<t>}=dc_{next}*\tilde{c}^{<t>}+\Gamma_o^{<t>}(1-tanh(c_{next})^2*\tilde{c}_t*da_{next}*\Gamma_u^{<t>}*(1-\Gamma_u^{<t>}) \tag{3} dΓu<t>​=dcnext​∗c~<t>+Γo<t>​(1−tanh(cnext​)2∗c~t​∗danext​∗Γu<t>​∗(1−Γu<t>​)(3) d Γ f < t > = d c n e x t ∗ c ~ p r e v + Γ o < t > ( 1 − t a n h ( c n e x t ) 2 ∗ c p r e v ∗ d a n e x t ∗ Γ f < t > ∗ ( 1 − Γ f < t > ) (4) d\Gamma_f^{<t>}=dc_{next}*\tilde{c}_{prev}+\Gamma_o^{<t>}(1-tanh(c_{next})^2*c_{prev}*da_{next}*\Gamma_f^{<t>}*(1-\Gamma_f^{<t>}) \tag{4} dΓf<t>​=dcnext​∗c~prev​+Γo<t>​(1−tanh(cnext​)2∗cprev​∗danext​∗Γf<t>​∗(1−Γf<t>​)(4)

参数求偏导

d W f = d Γ f < t > ∗ ( a p r e v x t ) T (5) dW_f=d\Gamma_f^{<t>}*\left(\begin{matrix}a_{prev}\\x_t \end{matrix}\right)^T \tag{5} dWf​=dΓf<t>​∗(aprev​xt​​)T(5) d W u = d Γ u < t > ∗ ( a p r e v x t ) T (6) dW_u=d\Gamma_u^{<t>}*\left(\begin{matrix}a_{prev}\\x_t \end{matrix}\right)^T \tag{6} dWu​=dΓu<t>​∗(aprev​xt​​)T(6) d W c = d Γ c < t > ∗ ( a p r e v x t ) T (7) dW_c=d\Gamma_c^{<t>}*\left(\begin{matrix}a_{prev}\\x_t \end{matrix}\right)^T \tag{7} dWc​=dΓc<t>​∗(aprev​xt​​)T(7) d W o = d Γ o < t > ∗ ( a p r e v x t ) T (8) dW_o=d\Gamma_o^{<t>}*\left(\begin{matrix}a_{prev}\\x_t \end{matrix}\right)^T \tag{8} dWo​=dΓo<t>​∗(aprev​xt​​)T(8)

为了计算 d b f , d b u , d b c , d b o db_f,db_u,db_c,db_o dbf​,dbu​,dbc​,dbo​ 需要各自对 d Γ f < t > , d Γ u < t > , d c ~ < t > , d Γ o < t > d\Gamma_f^{<t>},d\Gamma_u^{<t>},d\tilde{c}^{<t>},d\Gamma_o^{<t>} dΓf<t>​,dΓu<t>​,dc~<t>,dΓo<t>​ 求和。

最后,计算隐藏状态、记忆状态和输入的偏导数:

d a p r e v = W f T ∗ d Γ f < t > + W u T ∗ d Γ u < t > + W c T ∗ d c ~ < t > + W o T ∗ d Γ o < t > (9) da_{prev}=W^T_f*d\Gamma_f^{<t>}+W^T_u*d\Gamma_u^{<t>}+W^T_c*d\tilde{c}^{<t>}+W^T_o*d\Gamma_o^{<t>} \tag{9} daprev​=WfT​∗dΓf<t>​+WuT​∗dΓu<t>​+WcT​∗dc~<t>+WoT​∗dΓo<t>​(9) d c p r e v = d c n e x t ∗ Γ f < t > + Γ o < t > ∗ ( 1 − t a n h ( c n e x t ) 2 ) ∗ Γ f < t > ∗ d a n e x t (10) dc_{prev}=dc_{next}*\Gamma_f^{<t>}+\Gamma_o^{<t>}*(1-tanh(c_{next})^2)*\Gamma_f^{<t>}*da_{next} \tag{10} dcprev​=dcnext​∗Γf<t>​+Γo<t>​∗(1−tanh(cnext​)2)∗Γf<t>​∗danext​(10) d x < t > = W f T ∗ d Γ f < t > + W u T ∗ d Γ u < t > + W c T ∗ d c ~ t + W o T ∗ d Γ o < t > (11) dx^{<t>}=W^T_f*d\Gamma_f^{<t>}+W^T_u*d\Gamma_u^{<t>}+W^T_c*d\tilde{c}_{t}+W^T_o*d\Gamma_o^{<t>} \tag{11} dx<t>=WfT​∗dΓf<t>​+WuT​∗dΓu<t>​+WcT​∗dc~t​+WoT​∗dΓo<t>​(11)

这就是LSTM,我们什么时候应该用GRU?什么时候用LSTM?这里没有统一的准则。而且即使我先讲解了GRU,在深度学习的历史上,LSTM也是更早出现的,而GRU是最近才发明出来的,它可能源于Pavia在更加复杂的LSTM模型中做出的简化。研究者们在很多不同问题上尝试了这两种模型,看看在不同的问题不同的算法中哪个模型更好,所以这不是个学术和高深的算法,我才想要把这两个模型展示给你。

GRU的优点是这是个更加简单的模型,所以更容易创建一个更大的网络,而且它只有两个门,在计算性上也运行得更快,然后它可以扩大模型的规模。

但是LSTM更加强大和灵活,因为它有三个门而不是两个。如果你想选一个使用,我认为LSTM在历史进程上是个更优先的选择,所以如果你必须选一个,我感觉今天大部分的人还是会把LSTM作为默认的选择来尝试。虽然我认为最近几年GRU获得了很多支持,而且我感觉越来越多的团队也正在使用GRU,因为它更加简单,而且还效果还不错,它更容易适应规模更加大的问题。

所以这就是LSTM,无论是GRU还是LSTM,你都可以用它们来构建捕获更加深层连接的神经网络。

Hochreiter S, Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8):1735-1780.)

课程板书




←上一篇 ↓↑ 下一篇→
1.9 GRU 单元 回到目录 1.11 双向神经网络

1.10 长短期记忆-深度学习第五课《序列模型》-Stanford吴恩达教授相关推荐

  1. 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-d ...

  2. 2.19 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.18 Logistic 损失函数的解释 回到目录 3.1 神经网络概览 文章目录 总结 习题 第 11 题 第 12 题 第 13 题 第 14 题 第 15 题 第 1 ...

  3. 1.1 欢迎-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 无 回到目录 1.2 什么是神经网络 欢迎 第一个视频主要讲了什么是深度学习,深度学习能做些什么事情.以下是吴恩达老师的原话: 深度学习改变了传统互联网业务,例如如网络搜索和 ...

  4. 机器学习和深度学习到底怎么学?顶尖专家吴恩达告诉你

    机器学习和深度学习到底怎么学? 在外国版知乎上,有位网友问:新手如何学习机器学习?学习完MOOC的课程后有没有能力阅读研究论文或者真正的做出一点研究成果? 这个困惑很多人的问题吴恩达给出了详细的回答, ...

  5. 3.12 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.11 随机初始化 回到目录 4.1 深层神经网络 文章目录 总结 习题 第 21 题 第 22 题 第 23 题 第 24 题 第 25 题 第 26 题 第 27 题 ...

  6. 3.5 向量化实现的解释-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.4 多个例子中的向量化 回到目录 3.6 激活函数 向量化实现的解释 (Explanation for Vectorized Implementation) 在上一个视频 ...

  7. 3.10 触发字检测-深度学习第五课《序列模型》-Stanford吴恩达教授

    触发字检测 (Trigger Word Detection) 现在你已经学习了很多关于深度学习和序列模型的内容,于是我们可以真正去简便地描绘出一个触发字系统(a trigger word system ...

  8. 0.0 目录-深度学习第五课《序列模型》-Stanford吴恩达教授

    文章目录 目录 第五课 第四课 第三课 第二课 第一课 目录 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1. ...

  9. 3.7 注意力模型直观理解-深度学习第五课《序列模型》-Stanford吴恩达教授

    注意力模型直观理解 (Attention Model Intuition) 在本周大部分时间中,你都在使用这个编码解码的构架(a Encoder-Decoder architecture)来完成机器翻 ...

最新文章

  1. elasticsearch源码分析之search模块(client端)
  2. cocos2d-x游戏实例(5)-A星算法(1)
  3. MySQL查询获取行号rownum
  4. 关于用飞信框架运行net程序-用批处理运行
  5. WEB标准页面CSS命名参考
  6. Spin控件使用总结
  7. Performance Co-Pilot
  8. STL源码剖析学习二:空间配置器(allocator)
  9. Apache 简单设置虚拟主机
  10. 怎么将tflite部署在安卓上_手把手教程:如何从零开始训练 TF 模型并在安卓系统上运行...
  11. 【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
  12. 游戏开发之多态及虚函数(C++基础)
  13. python学习笔记之hashlib
  14. 【code vs】 2780 ZZWYYQWZHZ
  15. ThreadLocal理解
  16. ocjp 考试题之六
  17. 斗地主发牌编程PHP,php模拟实现斗地主发牌
  18. vue word 转换html渲染页面(mammoth)
  19. 目标追踪(一)环境搭建
  20. 总结移动开发入行十周年

热门文章

  1. 提取安兔兔排行榜到表格
  2. 前后端分离技术——前端框架
  3. Ubuntu安装OpenSSH让向日葵可以远程控制
  4. Linux问题解决:win10主机无法ping通虚拟机
  5. 风炫安全Web安全学习第四十三节课 路径遍历漏洞
  6. 这一次,彻底搞懂HTML5新特性
  7. unity hub版本管理工具 中文包 及入门指北
  8. 大数据应用之双色球算奖平台总体设计数据规模估算篇 - 张子良
  9. php 一维数组变字符串,php怎么把数组转为字符串?
  10. 分布式协议算法——RAFT协议