Attention机制

我们知道Seq2Seq模型有一个缺点就是句子太长的话encoder会遗忘,那么decoder接受到的句子特征也就不完全,我们看一下下面这个图,纵轴BLUE是机器翻译的指标,横轴是句子的单词量,我们可以看出用了attention之后模型的性能大大提升。

用了注意力机制,Decoder每次更新状态的时候都会再看一遍encoder所有状态,还会告诉decoder要更关注哪部分,这也是attention名字的由来。但是缺点就是计算量很大。

Attention原理

在encoder结束之后,attention和decoder同时工作, 回忆一下,decoder的初始状态 s0s_{0}s0 是 encoder最后一个状态, 不同于常规的Seq2Seq, encoder所有状态都要保留,这里需要计算 s0s_{0}s0 与每个状态的相关性, 我使用 αi=aligh⁡(hi,s0)\alpha_{i}=\operatorname{aligh}\left(h_{i}, s_{0}\right)αi=aligh(hi,s0) 这个公式表示计算两者相关性,把结果即为 αi,\alpha_{i},αi, 记做Weight, encoder有m个状态, 所以一共有m个 α,\alpha,α, 这里所有的值都是介于0和1的实 数, 全部加起来为1。

下面看一下怎么计算这个相似性。第一种方法是把 hih_{i}hiSoS_{o}So 做concat得到更高的向量,然后求矩 阵W与这个向量的乘积, 得到一个向量, 然后再将tanh作用于向量每一个元素,将他压到-1和1之 间,最后计算向量V与刚才计算出来的向量的内积, 这里的向量V和矩阵W都是参数,需要从训练 算出m个 α\alphaα 后,需要对他们做一个softmax变换, 把输出结果记做 α1\alpha_{1}α1αm,\alpha_{m},αm, 因为 是softmax输出,所以他们都大于0相加为1,这是第一篇attention论文提出计算的方法,往后有 很多其他计算的方法,我们来介绍一种更常用的方法。

输入还是 hih_{i}hiS0,S_{0},S0, 第一步是分别使用两个参数矩阵 Wk,WqW_{k}, \quad W_{q}Wk,Wq 做线性变换, 得到 kik_{i}kiq0q_{0}q0 这两 个向量, 这两个参数矩阵要从训练数据中学习。第二步是计算 kik_{i}kiq0q_{0}q0 的内积, 由于有m个K向 量, 所以得到L个 αi\alpha_{i}αi 。第三步就是对这些值做一个softmax变换, α1\alpha_{1}α1αm,\alpha_{m},αm, 因为是softmax输 出,所以他们都大于0相加为1。这种计算方法被Transformer模型采用, Transformer模型是当前 很多nlp问题采用的先进模型。

刚才讲了两种方法来计算 hih_{i}hiS0S_{0}S0 的相关性,现在我们得到了m个相关性 α,\alpha,α, 每个 α\alphaα 对应每个状 态 hi,h_{i},hi, 有了这些权車 α\alphaα 我们可以对m个状态计算加权平均, 得到一个Context vector C0C_{0}C0 。每一 个Context vector都会对应一个decoder状态 sis_{i}si

接下来我们来看一下decoder是怎么计算新的状态的。我们来回顾一下,假如不用attention,我 们是这样更新状态的,新的状态 S1S_{1}S1 是旧状态 S0S_{0}S0 与新输入 X1X_{1}X1 的函数, 看一下下图左边的公式, 将两者做concat,然后乘上权重矩阵加上偏置b, 最后通过tanh就是我们的新状态,也就是说状态 的更新仅仅是根据上一个状态,并不会看encoder的状态。用attention的话更新状态还要用到我 们计算出的Context vector C0,C_{0},C0, 把三个参数一起做concat后更新。

回忆一下, C0C_{0}C0 是所有encoder状态 hih_{i}hi 的加权平均, 所以 C0C_{0}C0 知道输入 X1X_{1}X1XmX_{m}Xm 的完整信息, decoder新的状态 S1S_{1}S1 依赖于 C0,C_{0},C0, 这样RNN遗忘的问题就解决了。下一步则是计算context vector C1,C_{1},C1, 跟之前一样, 先计算权重 αi,\alpha_{i},αi, 这里是计算 S1S_{1}S1 跟之前encoder所有状态的相关性, 得到了m个 α,\alpha,α, 注意一下这里的权重也是要更新的,上一轮算的是跟 s0s_{0}s0 的相关性现在算的是跟 S1S_{1}S1 的相关性,这样就可以通过加权平均计算出新的 C1C_{1}C1

Decoder接受新的输入 X 2,_{2},2, 还是用那个公式计算出新状态, 然后一直循环下去直到结束。

我们知道在这个过程中我们会计算出很多权車 αi,\alpha_{i},αi, 我们思考一下我们究竟计算了多少个 α\alphaα ?想要 计算出一个context vector Cj,C_{j},Cj, 我们要计算出m个相似性权重 α,\alpha,α, 所以每轮更新都需要计算m个 权重,假如一共有t个state, 那么一共就要计算m\timest个权重, 也就是encoder和decoder数量的乘 积。attention为了不遗忘,代价就是高数量级的计算。

更抽象的理解

简而言之,Attention 机制就是对输入的每个元素考虑不同的权重参数,从而更加关注与输入的元素相似的部分,而抑制其它无用的信息,具体是通过一个叫做attention函数来实现的,它是用来得到attention value的。比较主流的attention框架如下:

上图其实可以描述出attention value的本质:它其实就是一个查询(query)到一系列键值(key-value)对的映射。

更具体的,也就是attention函数的工作实质,如下图所示:

可以看出Attention其实就是把序列中各个元素分配一个权重系数,上面从attention函数是attention机制的工作过程。现在换一个角度来理解,我们将attention机制看做软寻址。就是说序列中每一个元素都由key(地址)和value(元素)数据对存储在存储器里,当有query=key的查询时,需要取出元素的value值(也即query查询的attention值),与传统的寻址不一样,它不是按照地址取出值的,它是通过计算key与query的相似度来完成寻址。这就是所谓的软寻址,它可能会把所有地址(key)的值(value)取出来,上步计算出的相似度决定了取出来值的重要程度,然后按重要程度合并value值得到attention值,此处的合并指的是加权求和。

Attention 的优缺点

优点:

  • 一步到位的全局联系捕捉。attention机制可以灵活的捕捉全局和局部的联系,而且是一步到位的。另一方面从attention函数就可以看出来,它先是进行序列的每一个元素与其他元素的对比,在这个过程中每一个元素间的距离都是一,因此它比时间序列RNNs的一步步递推得到长期依赖关系好的多,越长的序列RNNs捕捉长期依赖关系就越弱。
  • 并行计算减少模型训练时间。Attention 机制每一步的计算都不依赖于上一步的计算结果,因此可以并行处理。
  • 模型复杂度小,参数少

缺点:
缺点很明显,attention机制不是一个"distance-aware"的,它不能捕捉语序顺序(这里是语序哦,就是元素的顺序)。这在NLP中是比较糟糕的,自然语言的语序是包含太多的信息。如果确实了这方面的信息,结果往往会是打折扣的。 当然这个缺点也好搞定,再添加位置信息就好了,所以就有了 position-embedding(位置向量)的概念了,这里就不细说了。

转载来源
https://zhuanlan.zhihu.com/p/135970560
https://zhuanlan.zhihu.com/p/35571412?spm=a2c4e.10696291.0.0.3f4619a49c8SGU
https://www.cnblogs.com/ydcode/p/11038064.html

一文详解Attention机制相关推荐

  1. 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第二篇文章,前面我们已经介绍了第一个真正意义 ...

  2. Python-Matplotlib可视化(1)——一文详解常见统计图的绘制

    Python-Matplotlib可视化(1)--一文详解常见统计图的绘制 matplotlib库 曲线图 曲线图的绘制 结合Numpy库,绘制曲线图 绘制多曲线图 读取数据文件绘制曲线图 散点图 条 ...

  3. 一文详解 ChatGPT:背后的技术,数据,未来发展

    文章目录 一文详解 ChatGPT ChatGPT背后的技术 基于 Transformer 的预训练语言模型 提示学习与指令精调 思维链(Chain of Thought,COT) 基于人类反馈的强化 ...

  4. 一文详解JavaBean 看这篇就够了

    一文详解JavaBean 看这篇就够了 JavaBean的历史渊源 JavaBean的定义(通俗版) JavaBean应用 < jsp:useBean > < jsp:getProp ...

  5. 一文详解 YOLO 2 与 YOLO 9000 目标检测系统

    一文详解 YOLO 2 与 YOLO 9000 目标检测系统 from 雷锋网 雷锋网 AI 科技评论按:YOLO 是 Joseph Redmon 和 Ali Farhadi 等人于 2015 年提出 ...

  6. 一文详解决策树算法模型

    AI有道 一个有情怀的公众号 上文我们主要介绍了Adaptive Boosting.AdaBoost演算法通过调整每笔资料的权重,得到不同的hypotheses,然后将不同的hypothesis乘以不 ...

  7. 「软件项目管理」一文详解软件配置管理计划

    一文详解软件配置管理计划 前言 一.配置管理概述 1. 配置管理(SCM)定义 2. 软件配置项目(SCI) 3. 基线 4. 软件配置控制委员会(SCCB) 二.软件配置管理过程 1. 管理过程 2 ...

  8. 「软件项目管理」一文详解软件项目质量计划

    一文详解软件项目质量计划

  9. 「软件项目管理」一文详解软件项目管理概述

    一文详解软件项目管理概述

  10. OpenCV-Python实战(12)——一文详解AR增强现实

    OpenCV-Python实战(12)--一文详解AR增强现实 0. 前言 1. 增强现实简介 2. 基于无标记的增强现实 2.1 特征检测 2.2 特征匹配 2.3 利用特征匹配和单应性计算以查找对 ...

最新文章

  1. HDU 2300 Crashing Robots
  2. LeetCode之All Possible Full Binary Trees(Kotlin)
  3. Python面向对象案例汇总
  4. kafka数据到flume_大数据摄取:Flume,Kafka和NiFi
  5. 如何运行vue项目(维护他人的项目)
  6. 利用C语言实现计算机图像处理的方法
  7. No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题
  8. Web安全之点击劫持
  9. [模拟|数位] leetcode 9 回文数
  10. EF6学习笔记十:原始查询,在EF中使用SQL语句
  11. 含泪推荐5款实用又小巧的PC软件
  12. spss统计分析基础教程(上)--自学
  13. VM虚拟机安装win7系统(亲测可用!!!)
  14. Azure云平台学习之路(一)——Azure简介
  15. 微信公众号获取管理素材列表的大坑-{errcode:40004,errmsg:invalid media type hint:}
  16. java定时任务不执行_【SpringBoot】为什么我的定时任务不执行?
  17. 【网络流24题】火星探险问题 题解
  18. 论文笔记之:Playing for Data: Ground Truth from Computer Games
  19. vmware虚拟服务器弊端,VM虚拟机问题总结
  20. 利用开源 SNI PROXY+DNSMASQ 工具链实战 Netflix 流媒体解锁

热门文章

  1. 递归算法的基本理解以及基本算法,多行注释详解,适合编程小白,刚接触递归的编程新手
  2. python opengl3d模型_初试PyOpenGL一 (Python+OpenGL)
  3. c++ socket线程池_Netty(3)——Reactor线程模型
  4. 0基础学java可行吗_上海0基础学JAVA可行吗?
  5. 【转】python eval
  6. 使用go语言开发一个后端gin框架的web项目
  7. 前端工程师如何与设计师合作能提高效率
  8. 大数据时代亟需消除八大“疑云”
  9. 借助mapshaper的简化来修复geojson的拓扑错误
  10. soltrace教程(2)旧版本项目导入新版本