大数据文摘授权转载自数据派THU
作者:Greg Mehdiyev, Ray Hong, Jinghan Yu, Brendan Artley
翻译:陈之炎
校对:ZRX
本博由Simon Fraser大学计算机科学专业硕士生撰写并维护,同时这也是他们课程学分的一部分。
想了解更多关于该项目的信息,请访问:
sfu.ca/computing/mpcs
简介
看到这张照片时,首先映入眼帘的是什么?相信大多数人的眼神会被蓝色小鸭子吸引。对人类而言,显然这只蓝色小鸭子在图片中异常突出。不知何故,人类总是具备发现特定模式的能力,并会将注意力转移到那些与众不同的特征之上。
为什么会是这样子的?究竟是什么让我们注意到“蓝色鸭子“呢?
如果仔细观察这张照片,还会看到有其他不同特征的鸭子。例如,其中有三只鸭子面朝侧面而非正面向前。
是什么让蓝色鸭子比侧向鸭子更突出?是否能教会电脑学习这一特征呢?
这正是注意力机制解决的目标问题。“注意力机制是一种尝试行为,旨在有选择性地聚焦某些相关的事物,同时忽略深度神经网络中的其他事物。”⁷
从一般意义上说,注意力机制是对编码-解码器结构的改进。编码器-解码器模型利用神经网络将输入的编码特征转换成另一种编码特征。注意机力制组件赋予了神经网络在编码数据时对特定特征赋予 “注意力”的能力,它有助于解决神经网络中经常发生的梯度消失/爆炸问题。
编码器-解码器GIF 结构图
对注意力机制的实现可概述如下:
1. 为编码器中的每个状态分配一个分值: 对输入序列进行编码之后,称这部分编码为内部状态,可以为包含“注意力”的状态分配高的分值,为不包含任何相关信息的状态分配低分值,从而达到识别相关编码器状态的目的。
2. 计算注意力的权重: 在第一步得出的分值基础上计算出注意力权重。
3. 计算语境向量: 语境向量为包含第1步和第2步中信息的聚合向量。
4. 前馈: 将从语境向量中收集到的信息输入到编码器/解码器层中。
5. 解码: 解码器利用注意力机制解码信息。
这便是注意力机制的工作原理,接下来深入研究一些真实的应用程序!
常见用例
1. 自然语言处理(NLP)
自然语言处理是机器学习的一个子集,它赋予了计算机解释人类语言的能力,诸如翻译软件、聊天机器人和虚拟助手等工具均来自于这一研究领域。与自然语言处理相关的主要挑战之一是将句子中每个单词的上下文翻译为计算机所能理解的格式。
通常,使用编码器和解码器形式的两个RNNs/LSTMs来完成语境信息的翻译。编码器利用特征表示提炼出句子信息,解码器再将特征表示转换为摘要。
这种方法对短句子很有效,但是,由于存在梯度消失/爆炸的问题,对长句子来说就变得不那么准确了。如果没有注意力机制,对于复杂的人类语言来说,该方法的有效性便不太可靠了。例如,来看下面的句子。
例句
可以比较未包含注意力机制的模型与包含有注意力机制的模型来验证它的有效性。通过可视化文本,为更加 “重要”的单词赋予一个更深颜色的文本。可以看到,如果没有注意力机制组件,模型会受到梯度爆炸/消失的影响,无法在早期找到单词,从而遗漏了句子中那些对整体意义提供重要信息的那部分文本。
未包含注意力机制
这便是注意力机制的价值所在。在创建语境向量时,无论句子有多长,它均能够考虑到整个句子,为句子中的每个单词赋予重要程度,并将模型的“注意力”集中在句子中最重要的单词上。该模型的注意力可表示如下。
包含注意力机制
2. 计算机视觉
机器学习中受益于注意力机制的另一个领域是计算机视觉,该领域专注于实现人类视觉系统的自动化。目前,计算机视觉的应用包括目标检测、图像分类和图像字幕。
计算机视觉图像
图像字幕可自动生成图像的文本描述,该描述以清晰的格式准确地表达出图像中的内容。下面,来深入了解一下在模型架构中加入注意力机制的好处。
首先,在没有注意力机制的情况下实现图像字幕,模型生成一个文本表示,如“一群黄色橡胶鸭”。由于模型是基于整个图像进行的概括,这已经相当准确了。话虽如此,即便是图像中的一个明显的焦点,但结果中并没有提及蓝色鸭子。由于图像的每个区域都赋予同等的重要性,并没有将蓝鸭子描述出来。
未包含注意力机制
再来考虑一下使用了注意力机制的情况,这时,模型赋予了包含蓝鸭子图像区域更高的重要性,在生成图像描述时,将这些信息的描述考虑进来。
包含注意力机制
生成的描述将类似于“一群黄色橡皮鸭中的一只蓝色橡皮鸭”。注意,描述中的主题是“蓝色鸭子”。随着注意力机制对这一区域图像的重视,得出了更为准确的文本描述。
在讨论了注意力机制的常见用例之后,再来看看底层的数学。
数学
多年来,注意力机制出现了很多变种。其中最著名的三个版本是Vaswani ³注意力机制,Bahdanau ²注意力机制和Luong ¹¹注意力机制。在本文中,将重点关注Vaswani注意力机制和Bahdanau注意力机制。
注意力层
注意力机制背后的思想是将一个query值和一组 key-value对映射到一个输出当中。
1. Key / Value / Query
“key/value/query的概念类似于检索系统。例如,当在Youtube上搜索视频时,搜索引擎会将 query (搜索栏中的文本)映射到一组keys (视频标题、描述等)上,与数据库中的候选视频相关联,然后展示最匹配的视频(values)。”⁵
Key向量、Query向量和Value向量是嵌入向量在不同子空间中的抽象,因此可以通过将嵌入E乘以一个权矩阵来得到向量,“嵌入(向量)是一个相对低维的空间,可以将其转换为高维向量“⁶
2. 输出
输出是权重和values的组合,其中权重是在query和key的点积的基础上,应用softmax函数获得的。
Vaswani注意力机制
Vaswani注意力机制中,key向量、query向量和value向量是编码器-解码器层的输入,key向量和query向量的长度可以用变量d来表示,当输入由长度为d的key向量和query向量组成时,则计算出所有key向量和query向量的点积。
然后将每个结果除以d的平方根。最后,应用softmax函数得出其值的权重。
假设有一个有四字单词的句子(s1,s2, s3,s4),要想计算s4的注意力,s4依赖于s3,s3依赖于s2等等。首先,将s3的query向量命名为q3,将s1, s2, s3的key向量命名为k1, k2, k3。为了计算出权值,需要计算query向量q3与所有key向量的点积,将其除以d的平方根。然后,应用softmax函数。结果得出以下三个权重,称之为(w1,w2,w3)。
假设s1、s2、s3的值是(v1、v2、v3),那么s4的语境向量则是(w1、w2、w3)和(v1、v2、v3)的点积。
点积图
接下来,需要计算一组query向量的注意力,将key向量、query向量和value向量打包成矩阵Q、K、V。通过将嵌入向量的组合矩阵乘以权重矩阵Wq、Wk、Wv来得到key、query和value矩阵。这里给出了以下形式的注意力矩阵,可以将这一注意力矩阵应用到机器学习模型(如:Seq2Seq、图像字幕、BERT等等)中去。
注意力矩阵公式
Bahdanau注意力机制
Bahdanau注意力机制又可称为加性注意力机制。Bahdanau注意力机制和Vaswani注意力机制之间的主要区别是:Bahdanau注意力机制使用了一种加法策略,而Vaswani注意力机制使用的是一种乘法策略,二者的实现方式采用了各自不同的缩放因子。
Bahdanau 注意力机制
可以将Bahdanau注意力机制划分为以下步骤:首先,将上一个时间步长中的解码器隐含态与编码器隐含态(输入句子中的每个元素对应一个隐含态)相组合,生成对齐分值。类似于Vaswani注意力机制中的sqrt(d),Bahdanau注意力机制采用Tanh作为缩放因子,可以用下面的公式来表示:
Bahdanau 分值公式
然后,使用softmax函数将分值归一化成权重值,将权重值乘以隐含的编码器状态,得到语境向量。最后,将语境向量和前一个解码器的输出连接起来,生成一个新的输出。每个时间步长均重复上述过程。
该注意力机制的详细实现过程将在“代码”小节中做详细描述。
附加信息
1. 什么是Seq2Seq?
序列到序列的学习模型将句子从一个维度转换成另一维度,在语言翻译时,便是将句子从一种语言翻译成另一种语言。
2. 为什么要softmax?
softmax函数取n个实数的输入向量v1,并将其归一化为包含n个分量的概率分布。每个输出分量在(0,1)范围内,各向量分量的和加起来为1。利用softmax函数,可以为每个分量生成概率分布函数,从而影响解码器输出的概率。最后,将语境向量与之前的解码器输出连接,输入到解码器RNN单元中去,以生成新的隐含态。
3. 为什么要缩放?
如果d的维数很大,点积的大小就会很大,Softmax函数会使得梯度变得很小,通过对点积进行缩放来减少这种影响。Bahdanau 注意力机制用Tanh实现缩放,Vaswani 注意力机制用1/sqrt(d)实现缩放。
代码
在下一节中,将Bahdanau注意力机制应用于序列任务,利用Keras实现一个编码器-解码器架构,可以从Google Colab Notebook.上下载该例子的完整代码。
文中的代码对“注意力机制文章⁹”中的第三方实现代码进行了修改和优化。与“注意力机制文章⁹”不同,这里利用注意力机制来设计一个系统,将给定的英语句子翻译成法语。
下面是模型的输入示例和预测输出序列示例。
预测示例
导入包
1. 首先使用下面的代码导入所需的python包。
LanguageIndex类
2. 接下来,创建一个执行索引映射的语言索引类(LanguageIndex类)。目的是存储字典中的所有单词,并能够引用它们的索引。这个类还存储了每种语言的最长句的长度。
文本清洗
3. 接下来,创建一些辅助函数来生成编解码的数据序列,辅助函数为执行特征工程而设。辅助函数删除所有的标点符号、空格和不常见的字符,实现句子清洗,它把每个句子转换成一个向量列表,每个向量表示一个句子中的各单词的索引。
加载数据集+损失函数
4. 接下来,定义数据转换函数,并将其加载到数据集中。该部分代码段中还包括了损失函数。
创建数据集
5. 把上述内容归集起来。清理输入数据、向量化输入和输出语言的张量、计算输入和输出句子的最大长度,并添加必要的填充。这些操作通过下述代码来实现。
编码器+解码器
1. 编码器
编码器负责步进输入序列的时间步长,并将整个序列编码成一个固定长度的向量,即语境向量。
2. 解码器
解码器负责读取语境向量,步进输出时间步长。
在下个单元中,将定义编码器和解码器架构。默认情况下,编码器和解码器配置在CPU上运行。然而,模型在基于CUDA的GPU上运行要快得多。如果在GPU上进行训练,应将第 7行至 27行代码替换为:
3. 创建模型、数据并进行训练!
最后,序列到序列翻译模型的所有片段均准备好之后,只需运行以下代码段,实例化数据集并开始训练模型。
结语
引入注意力机之后制,离使用机器学习模仿人类观察又进了一步。
可以免费从 Google Colab Notebook上下载源代码。如果想了解更多关于注意力机制的信息,请查看下述资源。
原文标题:
What You Never Knew About Attention Mechanisms
原文链接:
https://medium.com/sfu-cspmp/what-you-never-knew-about-attention-mechanisms-caa2a2fb0b94