热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅谈Attention机制的理解

什么是注意力机制?注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制。例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获

什么是注意力机制?

注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制。例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目标区域,也就是注意力焦点。然后对这一区域投入更多的注意力资源,以获得更多所需要关注的目标的细节信息,并抑制其它无用信息。

技术图片

图片来源:深度学习中的注意力机制,其中红色区域表示更关注的区域。

Encoder-Decoder 框架

目前大多数的注意力模型都是依附在 Encoder-Decoder 框架下,但并不是只能运用在该模型中,注意力机制作为一种思想可以和多种模型进行结合,其本身不依赖于任何一种框架。Encoder-Decoder 框架是深度学习中非常常见的一个模型框架,例如在 Image Caption 的应用中 Encoder-Decoder 就是 CNN-RNN 的编码 - 解码框架;在神经网络机器翻译中 Encoder-Decoder 往往就是 LSTM-LSTM 的编码 - 解码框架,在机器翻译中也被叫做 Sequence to Sequence learning 。

所谓编码,就是将输入的序列编码成一个固定长度的向量;解码,就是将之前生成的固定向量再解码成输出序列。这里的输入序列和输出序列正是机器翻译的结果和输出。

为了说明 Attention 机制的作用,以 Encoder-Decoder 框架下的机器翻译的应用为例,该框架的抽象表示如下图:

技术图片

为了方便阐述,在选取 Encoder 和 Decoder 时都假设其为 RNN。在 RNN 中,当前时刻隐藏状态 \(h_t\) 是由上一时刻的隐藏状态 \(h_{t-1}\) 和当前时刻的输入 \(x_t\) 决定的,如公式(1)所示:

\[h_t = f(h_{t-1},x_t)\tag{1}\]

编码阶段,获得各个时刻的隐藏层状态后,通过把这些隐藏层的状态进行汇总,可以生成最后的语义编码向量 \(C\) ,如公式(2)所示,其中 \(q\) 表示某种非线性神经网络,此处表示多层 RNN 。

\[C=q(h_1,h_2,\cdots,h_{T_x})\tag{2}\]

在一些应用中,也可以直接将最后的隐藏层编码状态作为最终的语义编码 \(C\),即满足:

\[C=q(h_1,h_2,\cdots,h_{T_x})=h_{T_x}\tag{3}\]

解码阶段,需要根据给定的语义向量 \(C\) 和之前已经生成的输出序列 \(y_1,y_2,\cdots,y_{t-1}\) 来预测下一个输出的单词 \(y_t\),即满足公式(4):

\[y_t=\arg \max P(y_t)=\prod_{t=1}^{T}p(y_t|y_1,y_2,\cdots,y_{t-1},C)\tag{4}\]

由于我们此处使用的 Decoder 是 RNN ,所以当前状态的输出只与上一状态和当前的输入相关,所以可以将公式(4)简写成如下形式:

\[y_t=g(y_{t-1},s_{t-1},C)\tag{5}\]

在公式(5)中,\(s_{t-1}\) 表示 Decoder 中 RNN 神经元的隐藏层状态,\(y_{t-1}\) 表示前一时刻的输出,\(C\) 代表的是编码后的语义向量,而 \(g(\cdot)\) 则是一个非线性的多层神经网络,可以输出 \(y_t\) 的概率,一般情况下是由多层 RNN 和 softmax 层组成。

局限性

Encoder-Decoder 框架虽然应用广泛,但是其存在的局限性也比较大。其最大的局限性就是 Encoder 和 Decoder 之间只通过一个固定长度的语义向量 \(C\) 来唯一联系。也就是说,Encoder 必须要将输入的整个序列的信息都压缩进一个固定长度的向量中,存在两个弊端:一是语义向量 C 可能无法完全表示整个序列的信息;二是先输入到网络的内容携带的信息会被后输入的信息覆盖掉,输入的序列越长,该现象就越严重。这两个弊端使得 Decoder 在解码时一开始就无法获得输入序列最够多的信息,因此导致解码的精确度不够准确。

Attention 机制

在上述的模型中,Encoder-Decoder 框架将输入 \(X\) 都编码转化为语义表示 \(C\),这就导致翻译出来的序列的每一个字都是同权地考虑了输入中的所有的词。例如输入的英文句子是:Tom chase Jerry,目标的翻译结果是:汤姆追逐杰瑞。在未考虑注意力机制的模型当中,模型认为 汤姆 这个词的翻译受到 TomchaseJerry 这三个词的同权重的影响。但是实际上显然不应该是这样处理的,汤姆 这个词应该受到输入的 Tom 这个词的影响最大,而其它输入的词的影响则应该是非常小的。显然,在未考虑注意力机制的 Encoder-Decoder 模型中,这种不同输入的重要程度并没有体现处理,一般称这样的模型为 ** 分心模型 **。

而带有 Attention 机制的 Encoder-Decoder 模型则是要从序列中学习到每一个元素的重要程度,然后按重要程度将元素合并。这就表明,在 Encoder 将输入的序列元素进行编码时,得到的不在是一个固定的语义编码 C ,而是存在多个语义编码,且不同的语义编码由不同的序列元素以不同的权重参数组合而成。一个简单地体现 Attention 机制运行的示意图如下:

技术图片

在 Attention 机制下,语义编码 C 就不在是输入序列 \(X\) 的直接编码了,而是各个元素按其重要程度加权求和得到的,即:

\[C_i=\sum_{j=0}^{T_x}{a_{ij}f(x_j)}\tag{6}\]

在公式(6)中,参数 \(i\) 表示时刻, \(j\) 表示序列中的第 \(j\) 个元素, \(T_x\) 表示序列的长度, \(f(\cdot)\) 表示对元素 \(x_j\) 的编码。

Attention 原理

到目前为止,相信各位客官对 Attention 机制的思想和作用都有了一定的了解。接下来,我们将对 Attention 机制的具体实现原理进行剖析。

Attention 机制的一个重点就是获得 attention value,即机器翻译中的语义编码 \(C_i\)。在上一节中我们知道该值是通过输入元素按照不同的权重参数组合而成的,所以我们可以将其定义为一个 attention 函数,比较主流的 attention 函数的机制是采用键值对查询的方式,其工作实质如下图所示:

技术图片

通过工作示意图我们可以知道,一个 attention value 的获得需要经过三个阶段:

  1. 查询 Query 和各个键值 Key 进行相似度计算得到权值;
  2. 对上述得到的权值利用类 SoftMax() 进行归一化;
  3. 用归一化后的权值和各个 Value 进行加权求和,得到的值就是 attention value。

在自然语言任务中,往往 Key 和 Value 是相同的。需要注意的是,计算出来的 attention value 是一个向量,代表序列元素 \(x_j\) 的编码向量,包含了元素 \(x_j\) 的上下文关系,即同时包含全局联系和局部联系。全局联系很好理解,因为在计算时考虑了该元素与其他所有元素的相似度计算;而局部联系则是因为在对元素 \(x_j\) 进行编码时,重点考虑与其相似度较高的局部元素,尤其是其本身。

Attention 机制的优劣

相比于传统的 RNN 和 CNN,attention 机制具有如下优点:

  • 一步到位的全局联系捕捉,且关注了元素的局部联系;attention 函数在计算 attention value 时,是进行序列的每一个元素和其它元素的对比,在这个过程中每一个元素间的距离都是一;而在时间序列 RNNs 中,元素的值是通过一步步递推得到的长期依赖关系获取的,而越长的序列捕捉长期依赖关系的能力就会越弱。

  • 并行计算减少模型训练时间;Attention 机制每一步的计算都不依赖于上一步的计算结果,因此可以并行处理。

  • 模型复杂度小,参数少

但 attention 机制的缺点也比较明显,因为是对序列的所有元素并行处理的,所以无法考虑输入序列的元素顺序,这在自然语言处理任务中比较糟糕。因为在自然语言中,语言的顺序是包含了十分多的信息的,如果缺失了该部分的信息,则得到的结果往往会大大折扣。

总结

简而言之,Attention 机制就是对输入的每个元素考虑不同的权重参数,从而更加关注与输入的元素相似的部分,而抑制其它无用的信息。其最大的优势就是能一步到位的考虑全局联系和局部联系,且能并行化计算,这在大数据的环境下尤为重要。同时,我们需要注意的是 Attention 机制作为一种思想,并不是只能依附在 Encoder-Decoder 框架下的,而是可以根据实际情况和多种模型进行结合。

该文仅是对 Attention 机制的思想和原理进行了分析,在具体的实现上还有许多的细节信息,包括和框架的结合方式,具体的数学计算,并行计算的过程以及具体的代码实现等,后续会持续更新 Attention 机制这些部分的内容。

参考资料
  • 深度学习中的注意力机制
  • 浅谈 Attention 机制的理解
  • Attention 机制简单总结
  • 什么是自注意力机制?

浅谈 Attention 机制的理解


推荐阅读
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
author-avatar
woorain_77b002
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有