注意力模型 (Attention Model)

在上个视频中你已经见到了,注意力模型如何让一个神经网络只注意到一部分的输入句子。当它在生成句子的时候,更像人类翻译。让我们把这些想法转化成确切的式子,来实现注意力模型。

跟上个视频一样,我们先假定有一个输入句子,并使用双向的RNN,或者双向的GRU或者双向的LSTM,去计算每个词的特征。实际上GRULSTM经常应用于这个,可能LSTM更经常一点。对于前向传播(the forward occurrence),你有第一个时间步的前向传播的激活值(a forward occurrence first time step),第一个时间步后向传播的激活值,后向的激活值,以此类推。他们一共向前了五个时间步,也向后了五个时间步,技术上我们把这里设置为0。我们也可以后向传播6次,设一个都是0的因子,实际上就是个都是0的因子。为了简化每个时间步的记号,即使你在双向RNN已经计算了前向的特征值和后向的特征值,我就用 a<t>a^{<t>}a<t> 来一起表示这些联系。所以 a<t>a^{<t>}a<t> 就是时间步 ttt 上的特征向量。但是为了保持记号的一致性,我们用第二个,也就是 t′t\primet′ ,实际上我将用 t′t\primet′ 来索引法语句子里面的词。接下来我们只进行前向计算,就是说这是个单向的RNN,用状态 SSS 表示生成翻译。所以第一个时间步,它应该生成 y<1>y^{<1>}y<1> ,当你输入上下文 CCC 的时候就会这样,如果你想用时间来索引它,你可以写 C<1>C^{<1>}C<1> ,但有时候我就写个 CCC ,就是没有上标的 CCC ,这个会取决于注意力参数,即 a<1,1>a^{<1,1>}a<1,1> , a<1,2>a^{<1,2>}a<1,2> 以此类推,告诉我们应该花多少注意力。同样的,这个 α\alphaα 参数告诉我们上下文有多少取决于我们得到的特征,或者我们从不同时间步中得到的激活值。所以我们定义上下文的方式实际上来源于被注意力权重加权的不同时间步中的特征值。于是更公式化的注意力权重将会满足非负的条件,所以这就是个0或正数,它们加起来等于1。我们等会会见到我们如何确保这个成立,我们将会有上下文,或者说在 t=1t=1t=1 时的上下文,我会经常省略上标,这就会变成对 t′t\primet′ 的求和。这个权重的所有 t′t\primet′ 的值,加上这些激活值。所以这里的这项(上图编号1所示)就是注意力权重,这里的这项(上图编号2)来自于这里(上图编号3),于是 α<t,t′>\alpha^{<t,t\prime>}α<t,t′> 就是 y<t>y^{<t>}y<t> 应该在 t′t\primet′ 时花在 aaa 上注意力的数量。换句话来说,当你在 ttt 处生成输出词,你应该花多少注意力在第 t′t\primet′ 个输入词上面,这是生成输出的其中一步。然后下一个时间步,你会生成第二个输出。于是相似的,你现在有了一个新的注意力权重集,再找到一个新的方式将它们相加,这就产生了一个新的上下文,这个也是输入,且允许你生成第二个词。只有现在才用这种方式相加,它会变成第二个时间步的上下文。即对 t′t\primet′ 的 α<2,t′>\alpha^{<2,t\prime>}α<2,t′> 进行求和,于是使用这些上下文向量, C<1>C^{<1>}C<1> 写到这里, C<2>C^{<2>}C<2> 也同理。这里的神经网络看起来很像相当标准的RNN序列,这里有着上下文向量作为输出,我们可以一次一个词地生成翻译,我们也定义了如何通过这些注意力权重和输入句子的特征值来计算上下文向量。剩下唯一要做的事情就是定义如何计算这些注意力权重。让我们下张幻灯片看看。

回忆一下 α<t,t′>\alpha^{<t,t\prime>}α<t,t′> ,是你应该花费在 a<t′>a^{<t\prime>}a<t′> 上的注意力的数量,当你尝试去生成第 ttt 个输出的翻译词,让我们先把式子写下来,再讨论它是怎么来的。这个式子你可以用来计算 α<t,t′>\alpha^{<t,t\prime>}α<t,t′> ,在此之前我们要先计算 e<t,t′>e^{<t,t\prime>}e<t,t′>,关键要用softmax,来确保这些权重加起来等于1。如果你对 t′t\primet′ 求和,比如每一个固定的 ttt 值,这些加起来等于1。如果你对 t′t\primet′ 求和,然后优先使用softmax,确保这些值加起来等于1。

现在我们如何计算这些 eee 项,一种我们可以用的方式是用下面这样的小的神经网络,于是 s<t−1>s^{<t-1>}s<t−1> 就是神经网络在上个时间步的状态,于是这里我们有一个神经网络,如果你想要生成 y<t>y^{<t>}y<t> ,那么 s<t−1>s^{<t-1>}s<t−1> 就是上一时间步的隐藏状态,即 s<t>s^{<t>}s<t> 。这是给小神经网络的其中一个输入,也就是在神经网络中的一个隐藏层,因为你需要经常计算它们,然后 a<t′>a^{<t\prime>}a<t′> ,即上个时间步的的特征是另一个输入。直观来想就是,如果你想要决定要花多少注意力在的激活值上。于是,似乎它会很大程度上取决于你上一个时间步的的隐藏状态的激活值。你还没有当前状态的激活值,因为上下文会输入到这里,所以你还没计算出来,但是看看你生成上一个翻译的RNN的隐藏状态,然后对于每一个位置,每一个词都看向他们的特征值,这看起来很自然,即 α<t,t′>\alpha^{<t,t\prime>}α<t,t′> 和 e<t,t′>e^{<t,t\prime>}e<t,t′> 应该取决于这两个量。但是我们不知道具体函数是什么,所以我们可以做的事情就是训练一个很小的神经网络,去学习这个函数到底是什么。相信反向传播算法,相信梯度下降算法学到一个正确的函数。这表示,如果你应用这整个的模型,然后用梯度下降来训练它,这是可行的。这个小型的神经网络做了一件相当棒的事情,告诉你 y<t>y^{<t>}y<t> 应该花多少注意力在 a<t′>a^{<t\prime>}a<t′> 上面,然后这个式子确保注意力权重加起来等于1,于是当你持续地一次生成一个词,这个神经网络实际上会花注意力在右边的这个输入句子上,它会完全自动的通过梯度下降来学习。

这个算法的一个缺点就是它要花费三次方的时间,就是说这个算法的复杂是 O(n3)O(n3)O(n3) 的,如果你有 TxT_xTx​ 个输入单词和 TyT_yTy​ 个输出单词,于是注意力参数的总数就会是 Tx∗TyT_x*T_yTx​∗Ty​ ,所以这个算法有着三次方的消耗。但是在机器翻译的应用上,输入和输出的句子一般不会太长,可能三次方的消耗是可以接受,但也有很多研究工作,尝试去减少这样的消耗。那么讲解注意想法在机器翻译中的应用,就到此为止了。虽然没有讲到太多的细节,但这个想法也被应用到了其他的很多问题中去了,比如图片加标题(image captioning),图片加标题就是看一张图,写下这张图的标题。底下的这篇论文来源于Kevin Chu,Jimmy Barr, Ryan Kiros, Kelvin Shaw, Aaron Korver, Russell Zarkutnov, Virta Zemo, 和 Andrew Benjo。他们也显示了你可以有一个很相似的结构看图片,然后,当你在写图片标题的时候,一次只花注意力在一部分的图片上面。如果你感兴趣,那么我鼓励你,也去看看这篇论文,做一些编程练习。


因为机器翻译是一个非常复杂的问题,在之前的练习中,你应用了注意力,在日期标准化的问题(the date normalization problem)上面,问题输入了像这样的一个日期,这个日期实际上是阿波罗登月的日期,把它标准化成标准的形式,或者这样的日期。用一个序列的神经网络,即序列模型去标准化到这样的形式,这个日期实际上是威廉·莎士比亚的生日。一般认为是这个日期正如你之前联系中见到的,你可以训练一个神经网络,输入任何形式的日期,生成标准化的日期形式。其他可以做的有意思的事情是看看可视化的注意力权重(the visualizations of the attention weights)。这有一个机器翻译的例子,这里被画上了不同的颜色,不同注意力权重的大小,我不想在这上面花太多时间,但是你可以发现,对应的输入输出词,你会发现注意力权重,会变高,因此这显示了当它生成特定的输出词时通常会花注意力在输入的正确的词上面,包括学习花注意在哪。 在注意力模型中,使用反向传播时, 什么时候学习完成。

这就是注意力模型,在深度学习中真的是个非常强大的想法。在本周的编程练习中,我希望你可以享受自己应用它的过程。

3.8 注意力模型-深度学习第五课《序列模型》-Stanford吴恩达教授相关推荐

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

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

  2. 深度学习教程(10) | 卷积神经网络解读(吴恩达·完整版)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 联合体union和大小端(big-endian、little-endian)
  2. python json
  3. 华为python工程师工资-华为工程师对Python编程的看法
  4. mysql乐观和悲观锁实现_mysql实现乐观锁和悲观锁该怎么编写?
  5. linux单个core的线程,正确使用Core Data多线程的3种方式
  6. html css基础知识
  7. 贺利坚老师汇编课程47笔记:jmp指令无条件转移只修改IP
  8. 《团队作业第一周》五小福团队作业——UNO
  9. mysql如何让自增id从1开始设置方法
  10. 4 个拥有绝佳命令行界面的终端程序
  11. 游戏王抽卡模拟器(概率计算器)
  12. linux设置ipsan_linux 配置IPSAN存储
  13. 24 Hour Wallpaper for Mac(动态桌面壁纸软件)
  14. 1 0.99999的悖论_天文学科普:带你了解反物质、费米悖论和黑洞
  15. nginx: [error] OpenEvent(“Global\ngx_reload_7652“) failed (2: The system cannot find the file specif
  16. TensorFlow 卷积神经网络之猫狗识别(二)
  17. 1、 利用AUTO CAD脚本写一个插件,可以读取CAD中的图形公式,并输出为一个Excel计算表格...
  18. 通过一张照片,获取照片的地址信息
  19. unbound部署DNS
  20. [h5]一个基于HTML5实现的视频播放器代码详解

热门文章

  1. 使用Golang时遇到的一些坑
  2. Gson将字符串转map时,int默认为double类型
  3. 【Linux抓包工具之tcpdump】
  4. 颜色代码对照表、网页颜色选择器
  5. asp程序错误详细说明例表
  6. GIS地图界面和计算机图形学填充算法
  7. IDA Pro 权威指南阅读摘要1
  8. 超图js版本加载点图层和点要素
  9. 组件通信 eventtBus
  10. springBoot单元测试-模拟MVC测试