2.2 注意力机制
Seq2Seq结构的原理简单,其中编码器可将输入的编码C看作对输入整体语义的表示,基于该编码生成目标文本也与直觉相符。但Seq2Seq存在两个问题:
·固定长度的语义编码C在表示长序列输入语义时可能存在信息细节损失。
·在解码阶段,不论生成哪个单词,原始输入对目标单词的影响力相同。
为了解决上述问题,研究者提出了注意力机制(Attention Mechanism)[15]。顾名思义,注意力机制可以让模型在解码时从关注全部的语义信息切换到仅关注重点信息,从而实现更好的生成效果。注意力机制首先在视觉领域被提出[16],用于动态地选择图像处理区域,之后被广泛应用于自然语言处理领域。
以机器翻译问题为例,当前正在处理的单词最为重要,模型将注意力放在此处较为合理。例如,将中文“我今天去外婆家吃饭”翻译成英文,当模型翻译到目标词“I”时,模型需要更关注原文中“我”这个词,而当模型翻译到目标词“Today”时,模型需要更关注原文中“今天”这个词。显然,不同的目标词在原文中对应的焦点不同且不断变化。
在我们的实际生活中,注意力机制无处不在。比如,上学的时候,老师经常教导我们读书的时候要“集中注意力”,意思就是让我们集中精力关注重要的事,而暂时忽略其他可能打扰学习的事。又如,眼睛在看到一幅图片的时候,往往会下意识地重注其中最具吸引力的内容,而自动忽略和弱化其他内容。这些日常例子的背后都有注意力机制的身影。
注意力机制由查询Q(Query)、键K(Key)和值V(Value)三部分构成。注意力机制的计算过程可分为三个步骤:计算Q和K的相关性分数、归一化权重和计算注意力值。
图2-2 注意力机制示意
图2-2展示了注意力机制的原理和计算过程。输入向量分别代表输入的键值对,ki和vi分别代表其中第i个元素,序列长度为n。令Q代表查询向量,那么注意力机制的具体计算流程为:
1)计算Q与每个ki的相关性分数。相关性分数有多种不同的计算方法,此处以点积为例,计算公式为:
2)归一化相关性分数,使其取值范围为[0,1],得到注意力分布,其计算公式为:
3)根据相关性系数对序列(v1,…,vn)进行加权求和,计算公式为:
上述计算过程展示了最常见的软注意力机制(Soft Attention),它选择n个输入元素的加权平均作为结果。与之对应的还有一种硬注意力机制(Hard Attention),它仅选择n个输入中的某一个元素作为结果,例如选择这些输入中权重最大的一个。