注意力机制Attention详解

一、前言

2018年谷歌提出的NLP语言模型Bert一提出,便在NLP领域引起热议,之所以Bert模型能够火出圈,是由于Bert模型在NLP的多项任务中取得了之前所有模型都不能达到的出色效果。那么Bert模型它是如何提出的呢?我们来追溯Bert模型的发展历史:
首先Bert模型是基于Transformer提出的,Transformer同样是谷歌团队在2017年发表的论文 《Attention is all you need》 中提出,Transformer又是基于attention机制,注意力(Attention)机制由Bengio团队于2014年提出。而目前大部分attention模型都是依附于Encoder-Decoder框架进行实现。因此,我们要讲解Bert,必须要从Encoder-Decoder框架开始说起。

二、注意力Attention简述

什么是注意力: 对于人类来说,视野非常开阔,但焦点往往只有小部分范围,甚至一个点,这就叫做注意力。它可以帮助人类在众多的信息中去筛选对人类有帮助的信息。
注意力机制的核心目标是: 从众多信息中选择出对当前任务目标更关键的信息,将注意力放在上面。

三、Encoder-Decoder框架


上图是最常见的Encoder-Decoder框架图,在文本处理和语音识别的Encoder部分通常采用RNN模型;在图像处理的Encoder部分通常采用CNN模型

举个栗子: 机器翻译
英文:Tom chase Jerry
中文:汤姆 追逐 杰瑞

对应在图中,输入序列 {x1=Tom,x2=chase ,x3=Jerry} ,经过Encoder,被编码成语义编码C,语义编码是一块高度抽象的内容。

这里的语义编码C的编码方式是啥呢?
编码方式有很多种,在NLP中常见的RNN/LSTM/以及它们的变种,这里我们以RNN为例。
输入序列{x1,x2,x3,x4},通过RNN生成隐藏层的状态值{h1,h2,h3,h4},最简单的办法可以直接采用最后时刻输出的ht作为C的状态值,这里也就是h4作为语义编码C的值,也可以将所有时刻的隐藏层的值进行汇总,然后生成语义编码C的值,这里就是C=q(h1,h2,h3,h4),q是非线性激活函数。

再通过Decoder将其解码为中文内容,同样解码也可以采用RNN/LSTM/以及它们的变种进行解码。Encoder编码和Decoder解码的方式可以任意搭配
解码完成后输出序列 {Y1=“汤姆”,Y2=“追逐”,Y3=“杰瑞”}。在此过程中,每次生成一个目标单词,每个目标单词的有效信息都不一样,例如“杰瑞”,与之最重要的信息是“Jerry”,其他的可以看作成噪声或者相关度不大的信息。

相比于注意力机制而言,还有一种分心模型:
体现在翻译输出时,对于输入贡献的注意力是一样的。例如翻译:“杰瑞”时,“Tom”,“chase”,“Jerry”三者贡献的注意力相同(同一个C)。

分心模型的计算:
Y1 = f ( C ) ; Y2 = f ( C ,Y1 ) ; Y3 = f ( C ,Y1,Y2 )

引入注意力机制之后:

此时会分配不同的语义编码C,语义编码C会告诉输入哪一个更为相关。

引入注意力机制后的计算:
Y1 = f1 ( C1 ) ; Y2 = f1 ( C2 ,Y1 ) ; Y3 = f1 (C3 ,Y1,Y2 )
C汤姆 = g ( 0.6 * f2(Tom),0.2 * f2(chase),0.2 * f2(Jerry))
C追逐 = g ( 0.2 * f2(Tom),0.7 * f2(chase),0.1 * f2(Jerry))
C杰瑞 = g ( 0.3 * f2(Tom),0.2 * f2(chase),0.5 * f2(Jerry))
g(x) 是对构成的元素进行加权求和 :aij表示权重

四、Attention机制的具体计算过程


步骤:

  1. 根据Query和Key计算两者相似性或相关性;
    常见方法:
    (1) 两者向量点积: Similarity(Query,Keyi) = Query · Keyi
    (2) Cosine 相似性: Similarity(Query,Keyi) =(Query · Keyi)/||Query||·||Keyi||
    (3)引入额外的神经网络 MLP网络: Similarity(Query,Keyi) = MLP(Query,Keyi)
  2. 经过步骤1得到原始得分s1(例如Query = 汤姆,Key1 = Tom,经过F(Q,K)函数计算后得到两者相关性的得分,其他的同理。由于s1是一个实际的分值,通过softmax函数进行归一化处理,将得分映射到0-1之间得到权重系数(a1,a2,a3,a4)。
  3. 根据权重系数对Value进行加权求和。(权重系数a1,a2,a3,a4先分别和Value1,Value2,Value3,Value4相乘,最后相加)
    最终得到Attention Value

Attention计算公式:

五、Attention机制优缺点

优点:
1.速度快。Attention机制不再依赖于RNN,解决了RNN不能并行计算的问题。这里需要说明一下,基于Attention机制的seq2seq模型,因为是有监督的训练,所以咱们在训练的时候,在decoder阶段并不是说预测出了一个词,然后再把这个词作为下一个输入,因为有监督训练,咱们已经有了target的数据,所以是可以并行输入的,可以并行计算decoder的每一个输出,但是再做预测的时候,是没有target数据地,这个时候就需要基于上一个时间节点的预测值来当做下一个时间节点decoder的输入。所以节省的是训练的时间。
2.效果好。因为注意力机制,能够获取到局部的重要信息,能够抓住重点。
缺点:
1.只能在Decoder阶段实现并行运算,Encoder部分依旧采用的是RNN,LSTM这些按照顺序编码的模型,Encoder部分还是无法实现并行运算,不够完美。
2.因为Encoder部分目前仍然依赖于RNN,所以对于中长距离之间,两个词相互之间的关系没有办法很好的获取。

六、Self-Attention机制

在上面的Attention机制结构图中,Self-Attention其实表示的是Query、Key、Value三者是相同的值。(例如Query = Tom,Key1 = Value1 = Tom,Key2 = Value2 = chase,Key3 = Value3 = Jerry)。
同样下图中Query表示:making…(句子中的每一个词);Key/Value表示整句话中的每个单词;权重系数表示句子中哪个词和我的这个词关联最大(making,more,difficu)
Self-Attention可以捕获同一个句子中单词之间的一些句法特征(比如下图中展示的有一定距离的短语结构)或者语义特征(图中its的指代对象是Law)

Self-Attention机制的优点:
更容易捕获句子中长距离的相互依赖特征,如果是RNN或者LSTM(都需要按照次序序列进行计算)对于长距离的相互依赖特征,要经过若干时间步步骤的信息累积才能够将两者联系在一起,距离越远,有效信息被稀释的越多,有效捕获的可能性越小。

Self-Attention不需要依赖次序序列计算,在计算过程中直接将句子中【任意两个单词的联系通过一个计算步骤直接联系在一起】对于远距离依赖特征之间的距离被极大缩短,有效的利用这些特征。

七、结语

以上是本人在学习注意力机制Attention过程中的个人见解,有不足之处欢迎指正!
接下来将学习建立在注意力机制基础上的Transformer,欢迎关注!

注意力机制Attention详解相关推荐

  1. NLP中的Attention注意力机制+Transformer详解

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者: JayLou娄杰 知乎链接:https://zhuanlan.zhihu. ...

  2. 【李宏毅】注意力机制+transformer详解

    Transformer 背景 关于RNN详解可以看这篇博客:循环神经网络 RNN一般被用来处理序列输入的,但是它有一个缺点就是不能并行化,后面一个神经元的输入要依赖与之前神经元的输出. 然后就有人提出 ...

  3. Transformer和自注意力机制Self-Attention详解和时间复杂度计算+Image Transformer简介

    Transformer 背景 注意力机制已经在编码器解码器模型中广泛应用,极大提升了模型性能.我们为什么不能尝试完全抛开RNN.CNN等传统结构,直接尝试使用注意力机制来捕捉输入和输出之间的依赖呢? ...

  4. 注意力机制基本原理详解及应用

    注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理.语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影.所以,了解注意力机制的工作原理对于关注深度学习技术发展的技 ...

  5. 自注意力机制超级详解(Self-attention)

    Attention ia all you need论文原文 仅供自我学习使用 Self-attention想要解决的问题:目前input都是一个向量,输出可能是一个数值,一个类别,那么如果输入是一排向 ...

  6. 史上最小白之Attention详解

    1.前言 在自然语言处理领域,近几年最火的是什么?是BERT!谷歌团队2018提出的用于生成词向量的BERT算法在NLP的11项任务中取得了非常出色的效果,堪称2018年深度学习领域最振奋人心的消息. ...

  7. 深度学习之图像分类(十七)-- Transformer中Self-Attention以及Multi-Head Attention详解

    深度学习之图像分类(十七)Transformer中Self-Attention以及Multi-Head Attention详解 目录 深度学习之图像分类(十七)Transformer中Self-Att ...

  8. Self Attention 详解

    Self Attention 详解 前言 注意力机制(Attention),之前也是一直有所听闻的,也能够大概理解 Attention 的本质就是加权,对于 Google 的论文<Attenti ...

  9. seq2seq + attention 详解

    seq2seq + attention 详解 作者:xy_free \qquad 时间:2018.05.21 1. seq2seq模型 seq2seq模型最早可追溯到2014年的两篇paper [1, ...

最新文章

  1. python读取txt数据-Python从文件中读取数据
  2. 第三课--EFM32GG11系列--串口接收不定长度数据的几种方式
  3. 201712-1最小差值
  4. 利用已有的大数据技术,如何构建机器学习平台
  5. 杭州之行--记杭电网新恩普杯程序设计邀请赛
  6. 华为P20云文档空间满了怎么清理_原来华为手机能这样清理垃圾,怪不得别人的手机再用两年不卡顿...
  7. mysql客户端新建一个表_MySQL 建库、建用户及建表事项
  8. 4. 正则表达式(4)
  9. MVC模型与FishiGUI应用层MVC型号
  10. java batik_java – Batik传递库依赖项
  11. PPT训练营-【目录页】
  12. IT营Beego教程 Golang+Beego+Grom仿小米商城项目实战视频教程
  13. 安装pyHive报错
  14. C语言 牛顿法 解方程,如何用科学计算器求方程的解(牛顿法解方程具体步骤)...
  15. CSDN 勤学会 —— 和优秀的人一起学习进步
  16. linux用户自动输入密码,Linux自动输入密码登录用户
  17. Unix编程常见问题解答(精华)
  18. 人生关键角色转变:走向职场人
  19. Java通过URL同步头像(总结)
  20. Linux命令英文全称学习

热门文章

  1. CSS隐藏元素五种方法
  2. Ubuntu安装与配置的小白教程
  3. OF基础操作5(在虚拟机上安装VMware Tools)
  4. Ubuntu16卸载firewalld
  5. c语言编程实现密码判断,C语言实现密码判断
  6. 卷积和互相关操作的关系
  7. [序列化]MsgPack、Hessian对比
  8. skew width_SKEW WIDTH是什么意思
  9. HTML基础:常用文本格式化标签(换行,加横线,加粗,斜体字等)
  10. Linux学习之计算机概论