通俗解读NLP中几种常见的注意力机制
1 前言
注意力机制在NLP领域中有广泛的应用,诸如机器翻译、智能对话、篇章问答等。在模型设计中使用注意力机制,可以显著提升模型的性能。然而,对于初识注意力机制的朋友来说,可能会有这样的疑问:自然语言处理中说的注意力机制到底是啥?它与我们大脑中的注意力有何联系?它是如何实现的?面对诸多疑问,本文将用通俗的语言来解开这些困惑。本文首先简单介绍一下认知神经学中的注意力。接着,详细解说NLP领域常见的三种注意力机制:Bahdanau注意力、Luong注意力和自注意力(self-attention)。最后,对几种注意力机制进行归纳梳理,揪出它们的核心思想,分析它们的异同。
2 认知神经学中的注意力
在日常生活中,我们通过视觉、听觉、触觉等方式接收大量的感觉输入,而人脑在有限的资源下还能有条不紊地工作,是因为人脑可以有意或无意地从这些大量输入信息中选择小部分有用信息来重点处理,并忽略其他信息。这种能力就叫作注意力。注意力一般分为两种:
1)聚焦式注意力:自上而下的有意识的注意力。它是指有预定目的、主动有意识地聚焦于某一对象的注意力。例如,一个人在一个嘈杂的环境中与朋友聊天时,他还是可以听到朋友的谈话内容,而忽略其它声音。
2)基于显著性的注意力:自下而上的无意识的注意力。基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关。例如,一个人正在认真工作,忽然身后有人叫他名字,他会中断当前的工作,转头往后看看是谁在叫他。
当前NLP领域中的注意力机制大多是模拟认知神经学中的聚焦式注意力,即让模型根据当前状态,有目的地聚焦于某些信息。简单地说,NLP中注意力机制的核心思想就是让模型根据当前状态,从众多信息中选择当前所需要的最重要的信息。举个简单例子,一个人在房间里找一把银色钥匙,那么可以把当前状态理解为找银色钥匙,把信息定义为房间里的东西。根据找银色钥匙这个状态,那么{金属类物品,银色物品,形状像钥匙的物品}就成为注意力所关注的物品。那NLP中注意力机制中的当前状态到底是什么呢,下面通过几个例子来说明。
3 Bahdanau注意力与Luong注意力
- Bahdanau注意力
Bahdanau注意力机制是Bahdanau等人在论文Neural machine translation by jointly learning to align and translate中提出的。Bahdanau指出,在基于Encoder-Decoder结构中,传统的做法是,Encoder对句子进行编码,得到一个固定维度的向量表示给Decoder使用。因为维度固定,对于长句子来说,这种做法会造成较大的信息丢失。Bahdanau认为这个问题是神经机器翻译性能提升的瓶颈。于是他在论文中提出了注意力机制。他的做法是,Decoder不是“平等”地编码句子中的各个词,而是根据前一时刻状态,让Encoder对句子中重要的单词给予较高权重,对于不重要单词给予较低权重,权重的大小反映了当前状态所关注的句子中的信息。下面举个英译汉的例子来说明。
有一RNN Encoder,如图下半部分所示。每个时刻输入一个单词,输出一个隐状态。图中上半部分是一个RNN Decoder。它的输入包括三部分:前一时刻的解码输出、当前时刻Decoder状态以及上下文向量(context vector)。如下图中所示的第三个时刻,Decoder利用前一时刻的输出(作品)、当前时刻Decoder状态和上下文向量进行解码翻译,输出当前时刻的翻译结果。
而论文中计算上下文向量就采用了注意力机制。等于Encoder各个时刻隐状态的加权和,如公式(1)所示。
(1)
从公式中可以看出,在第三个时刻,、和的权重较大,也就是说Decoder的注意力主要集中在了piece、conveys和feeling这三个单词所在时刻的表示信息上。那么权重是怎么得到的呢。论文中采用一个打分函数,让Decoder的前一个时刻状态与Encoder各个隐藏状态计算一个分数{},如公式(2)所示。
(2)
其中为Decoder前一时刻的状态,为Encoder各个时刻的隐状态。这里的打分函数score()可以采用向量内积方式来计算。
接着,对进行softmax操作,得到权重,如公式(3)所示。
(3)
- Luong注意力
Luong等人在论文Effective Approaches to Attention-based Neural Machine Translation中也采用注意力机制来解决机器翻译任务中的对齐问题。Luong注意力与Bahdanau注意力主要有两点不同。一是打分函数所使用的查询向量不同。Bahdanau在打分函数中所用的查询向量是Decoder前一时刻状态,而Luong在打分函数中所用的查询向量是Decoder当前时刻状态,如下图所示,
两种注意力的打分函数如下方公式所示,其中为Decoder上一时刻的状态,为Decoder当前时刻的状态,为Encoder各个时刻的隐状态。
Bahdanau打分函数:
Luong打分函数:
第二个不同是,Luong提出了三种不同的打分函数,如下面公式所示。
上式中,第一个函数用向量点积来计算分值,其中为解码器的当前状态。为Encoder的隐状态。第二个函数采用了一个参数矩阵,参数矩阵是可学习的,这个函数有个专业的名称叫双线性打分函数。第三个函数是加性打分函数,其中、是可学习的参数向量。三个函数的核心思想都是求Decoder当前状态与Encoder各时刻隐状态之间的关系。
4 自注意力(self-attention)
在唠叨自注意力机制之前,先说一下三个专有名词。其实,如果用土话能说明白的东西,我一般不会用专业术语去说,因为我更喜欢用接地气的话来沟通。然而这个部分绕不开这三个专有名词,它们分别是:查询向量(Query)、键向量(Key)和值向量(Value)。以找银色钥匙为例,简单理解一下这三个向量。如果把找银色钥匙这个状态编码为一个向量,那它就是查询向量。物品的各种颜色、形状和材质所表示的向量可以认为是键向量。这样就可以根据当前找银色钥匙这一状态计算不同颜色、不同形状、不同材质的分值权重。房间物品的向量表示就是值向量,综合房间某物品的颜色、形状和材质可得到一个对这个物品的关注度,即权重。不过在NLP中,键向量和值向量常常是相同的,或是从同一个向量经过不同的线性变换得到。为下文表述方便,查询向量用Q表示,键向量用K表示,值向量用V表示。Q、K、V也可以是二维矩阵。
在Luong注意力中,我们把Decoder当前时刻状态称为查询向量,Encoder各个时刻的隐状态既是键向量,也是值向量。也就是说,用查询向量和键向量计算权重分布,然后用和值向量计算加权和。
Bahdanau注意力和Luong注意力分别是用RNN、LSTM作为Encoder和Decoder的组件。而RNN、LSTM最明显的不足有两个,一是对长序列的反向传播容易造成梯度消失或梯度爆炸,二是RNN和LSTM必须得一个时间步一个时间步地进行编码和解码,每个时间步输入一个单词,不能并行计算。针对RNN和LSTM的这两点不足,Ashish在论文Attention Is All You Need中提出自注意力机制(self-attention)。简单来说,自注意力机制就是句子通过自己跟自己比较,来计算单词之间的相关性。那么,自己和自己怎么比较呢,具体细节如下图所示。
图中,X是输入序列,可以把每一列看作是单词的向量表示。、、是三个参数矩阵,它们将X映射到三个不同的向量空间:、、。叫查询向量矩阵,叫键向量矩阵,叫值向量矩阵。
如上图所示,查询向量矩阵和键向量矩阵经过缩放点积运算,得到分值,然后再对分值进行softmax操作,得到权值分布矩阵(图中绿色方阵)。最后再将值向量矩阵V与权值矩阵相乘,得到输出序列H.如下方公式所示。
5 总结
总的来说,不管是Bahdanau注意力、Luong注意力,还是自注意力,它们的作用都是做信息筛选,从输入信息中选取相关的信息。实现这个信息筛选的过程可以分为两步:一是计算注意力分布,二是根据来计算输入信息的加权平均。
[参考文献]
[1] Bahdanau, Dzmitry, Kyunghyun Cho, and Yoshua Bengio. "Neural machine translation by jointly learning to align and translate." arXiv preprint arXiv:1409.0473 (2014).
[2] Luong, Minh-Thang, Hieu Pham, and Christopher D. Manning. "Effective approaches to attention-based neural machine translation." arXiv preprint arXiv:1508.04025 (2015).
[3] Vaswani, Ashish, et al. "Attention is all you need." Advances in neural information processing systems 30 (2017).
[4] 邱锡鹏. 神经网络与深度学习[M]. 北京: 机械工业出版社, 2021.
通俗解读NLP中几种常见的注意力机制相关推荐
- IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解
IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解 0.前言 一.光学传感器模块: 1. 光敏传感器模块: 2. 红外避障模块 3. 循迹传感器模块 4. U型光电传感器模块 5. 红外接收模 ...
- unity3d中画线有几种方式_Spring RestTemplate中几种常见的请求方式
原文 https://segmentfault.com/a/1190000011093597 在Spring Cloud中服务的发现与消费一文中,当我们从服务消费端去调用服务提供者的服务的时候,使用了 ...
- Spring RestTemplate中几种常见的请求方式
关注公众号[江南一点雨],专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货! 在Spring Cloud ...
- Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明:本 ...
- java简述常见的布局极其特点_请简要说明 Android 中五种常见布局的特点。_学小易找答案...
[简答题]请简要说明有序广播和无序广播的区别 [简答题]请简要说明 Android 程序结构中 AndroidManifest.xml 的功能? [简答题]简述李村站人工办理进路的作业过程. [简答题 ...
- java布尔类型比较器_浅谈Java中几种常见的比较器的实现方法
在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...
- Java中 9 种常见的 CMS GC 问题分析与解决
目录 Java中 9 种常见的 CMS GC 问题分析与解决 1. GC 1.1 引言 1.2 概览 2. GC 基础 2.1 基础概念 2.2 JVM 内存划分 2.3 分配对象 2.4 收集对象 ...
- 算法中七种常见的时间复杂度
这是我的推广信息,以激励自己更好的分享自己的知识和经验!也希望看到的你能够多多支持,谢谢! 1. 滴滴云AI大师: 目前滴滴云正在大力推广自己的云计算服务,需要购买的朋友们用我的AI大师码 「2049 ...
- java中的排序方法_Java中8种常见的排序方法
本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分 ...
最新文章
- Openresty最佳案例 | 第5篇:http和C_json模块
- 你不曾见过的酷炫地图可视化作品(一)
- MYSQL如何导出存储过程和触发器?
- android 自定义库,Android自定义Log库
- 小学奥数 7657 连乘积末尾0的个数-2022.01.26
- 时尚精美电商专题首页设计PSD分层模板资源
- 番禺区天气预报软件测试,天气预报模块测试用例(P707)
- mysql多表查询练习_MySQL多表查询综合练习答案
- 泛型类型(Generic Type)
- B站韩顺平java学习笔记(九)-- 面向对象编程(高级)章节
- 邮件发送平台哪个好?大家究竟该如何选择?
- java processing_1 Processing入门简介
- libero soc 11.9 modelsim仿真
- that was originally added here
- python 做网页_听过最近Python过气了?
- 仿真软件测试基尔霍夫定律,基尔霍夫定律的仿真验证.ppt
- 书籍《阅读的方法》读后感
- 树莓派3 Android Pie 编译适配
- 清空input的type为file时的值
- JetsonNano国产套件成功部署YoloV5手把手图解教程