在10.9节(编码器—解码器(seq2seq))里,解码器在各个时间步依赖相同的背景变量来获取输入序列信息。当编码器为循环神经网络时,背景变量来自它最终时间步的隐藏状态。

现在,让我们再次思考那一节提到的翻译例子:输入为英语序列“They”“are”“watching”“.”,输出为法语序列“Ils”“regardent”“.”。不难想到,解码器在生成输出序列中的每一个词时可能只需利用输入序列某一部分的信息。例如,在输出序列的时间步1,解码器可以主要依赖“They”“are”的信息来生成“Ils”,在时间步2则主要使用来自“watching”的编码信息生成“regardent”,最后在时间步3则直接映射句号“.”。这看上去就像是在解码器的每一时间步对输入序列中不同时间步的表征或编码信息分配不同的注意力一样。这也是注意力机制的由来 [1]。

仍然以循环神经网络为例,注意力机制通过对编码器所有时间步的隐藏状态做加权平均来得到背景变量。解码器在每一时间步调整这些权重,即注意力权重,从而能够在不同时间步分别关注输入序列中的不同部分并编码进相应时间步的背景变量。本节我们将讨论注意力机制是怎么工作的。

在10.9节(编码器—解码器(seq2seq))里我们区分了输入序列或编码器的索引10.11 注意力机制 - 图1与输出序列或解码器的索引10.11 注意力机制 - 图2。该节中,解码器在时间步10.11 注意力机制 - 图3的隐藏状态10.11 注意力机制 - 图4#card=math&code=%5Cboldsymbol%7Bs%7D%7Bt%27%7D%20%3D%20g%28%5Cboldsymbol%7By%7D%7Bt%27-1%7D%2C%20%5Cboldsymbol%7Bc%7D%2C%20%5Cboldsymbol%7Bs%7D%7Bt%27-1%7D%29),其中![](https://g.yuque.com/gr/latex?%5Cboldsymbol%7By%7D%7Bt’-1%7D#card=math&code=%5Cboldsymbol%7By%7D%7Bt%27-1%7D)是上一时间步10.11 注意力机制 - 图5的输出![](https://g.yuque.com/gr/latex?y%7Bt’-1%7D#card=math&code=y%7Bt%27-1%7D)的表征,且任一时间步10.11 注意力机制 - 图6使用相同的背景变量10.11 注意力机制 - 图7。但在注意力机制中,解码器的每一时间步将使用可变的背景变量。记![](https://g.yuque.com/gr/latex?%5Cboldsymbol%7Bc%7D%7Bt’%7D#card=math&code=%5Cboldsymbol%7Bc%7D_%7Bt%27%7D)是解码器在时间步10.11 注意力机制 - 图8的背景变量,那么解码器在该时间步的隐藏状态可以改写为

10.11 注意力机制 - 图9.%0A#card=math&code=%5Cboldsymbol%7Bs%7D%7Bt%27%7D%20%3D%20g%28%5Cboldsymbol%7By%7D%7Bt%27-1%7D%2C%20%5Cboldsymbol%7Bc%7D%7Bt%27%7D%2C%20%5Cboldsymbol%7Bs%7D%7Bt%27-1%7D%29.%0A)

这里的关键是如何计算背景变量10.11 注意力机制 - 图10和如何利用它来更新隐藏状态10.11 注意力机制 - 图11。下面将分别描述这两个关键点。

10.11.1 计算背景变量

我们先描述第一个关键点,即计算背景变量。图10.12描绘了注意力机制如何为解码器在时间步2计算背景变量。首先,函数10.11 注意力机制 - 图12根据解码器在时间步1的隐藏状态和编码器在各个时间步的隐藏状态计算softmax运算的输入。softmax运算输出概率分布并对编码器各个时间步的隐藏状态做加权平均,从而得到背景变量。

10.11_attention.svg

具体来说,令编码器在时间步10.11 注意力机制 - 图14的隐藏状态为10.11 注意力机制 - 图15,且总时间步数为10.11 注意力机制 - 图16。那么解码器在时间步10.11 注意力机制 - 图17的背景变量为所有编码器隐藏状态的加权平均:

10.11 注意力机制 - 图18

其中给定10.11 注意力机制 - 图19时,权重10.11 注意力机制 - 图2010.11 注意力机制 - 图21的值是一个概率分布。为了得到概率分布,我们可以使用softmax运算:

10.11 注意力机制 - 图22%7D%7B%20%5Csum%7Bk%3D1%7D%5ET%20%5Cexp(e%7Bt’%20k%7D)%20%7D%2C%5Cquad%20t%3D1%2C%5Cldots%2CT.%0A#card=math&code=%5Calpha%7Bt%27%20t%7D%20%3D%20%5Cfrac%7B%5Cexp%28e%7Bt%27%20t%7D%29%7D%7B%20%5Csum%7Bk%3D1%7D%5ET%20%5Cexp%28e%7Bt%27%20k%7D%29%20%7D%2C%5Cquad%20t%3D1%2C%5Cldots%2CT.%0A)

现在,我们需要定义如何计算上式中softmax运算的输入10.11 注意力机制 - 图23。由于10.11 注意力机制 - 图24同时取决于解码器的时间步10.11 注意力机制 - 图25和编码器的时间步10.11 注意力机制 - 图26,我们不妨以解码器在时间步10.11 注意力机制 - 图27的隐藏状态10.11 注意力机制 - 图28与编码器在时间步10.11 注意力机制 - 图29的隐藏状态10.11 注意力机制 - 图30为输入,并通过函数10.11 注意力机制 - 图31计算10.11 注意力机制 - 图32

10.11 注意力机制 - 图33.%0A#card=math&code=e%7Bt%27%20t%7D%20%3D%20a%28%5Cboldsymbol%7Bs%7D%7Bt%27%20-%201%7D%2C%20%5Cboldsymbol%7Bh%7D_t%29.%0A)

这里函数10.11 注意力机制 - 图34有多种选择,如果两个输入向量长度相同,一个简单的选择是计算它们的内积10.11 注意力机制 - 图35%3D%5Cboldsymbol%7Bs%7D%5E%5Ctop%20%5Cboldsymbol%7Bh%7D#card=math&code=a%28%5Cboldsymbol%7Bs%7D%2C%20%5Cboldsymbol%7Bh%7D%29%3D%5Cboldsymbol%7Bs%7D%5E%5Ctop%20%5Cboldsymbol%7Bh%7D)。而最早提出注意力机制的论文则将输入连结后通过含单隐藏层的多层感知机变换 [1]:

10.11 注意力机制 - 图36%20%3D%20%5Cboldsymbol%7Bv%7D%5E%5Ctop%20%5Ctanh(%5Cboldsymbol%7BW%7D_s%20%5Cboldsymbol%7Bs%7D%20%2B%20%5Cboldsymbol%7BW%7D_h%20%5Cboldsymbol%7Bh%7D)%2C%0A#card=math&code=a%28%5Cboldsymbol%7Bs%7D%2C%20%5Cboldsymbol%7Bh%7D%29%20%3D%20%5Cboldsymbol%7Bv%7D%5E%5Ctop%20%5Ctanh%28%5Cboldsymbol%7BW%7D_s%20%5Cboldsymbol%7Bs%7D%20%2B%20%5Cboldsymbol%7BW%7D_h%20%5Cboldsymbol%7Bh%7D%29%2C%0A)

其中10.11 注意力机制 - 图3710.11 注意力机制 - 图3810.11 注意力机制 - 图39都是可以学习的模型参数。

10.11.1.1 矢量化计算

我们还可以对注意力机制采用更高效的矢量化计算。广义上,注意力机制的输入包括查询项以及一一对应的键项和值项,其中值项是需要加权平均的一组项。在加权平均中,值项的权重来自查询项以及与该值项对应的键项的计算。

在上面的例子中,查询项为解码器的隐藏状态,键项和值项均为编码器的隐藏状态。
让我们考虑一个常见的简单情形,即编码器和解码器的隐藏单元个数均为10.11 注意力机制 - 图40,且函数10.11 注意力机制 - 图41%3D%5Cboldsymbol%7Bs%7D%5E%5Ctop%20%5Cboldsymbol%7Bh%7D#card=math&code=a%28%5Cboldsymbol%7Bs%7D%2C%20%5Cboldsymbol%7Bh%7D%29%3D%5Cboldsymbol%7Bs%7D%5E%5Ctop%20%5Cboldsymbol%7Bh%7D)。假设我们希望根据解码器单个隐藏状态10.11 注意力机制 - 图42和编码器所有隐藏状态10.11 注意力机制 - 图43来计算背景向量10.11 注意力机制 - 图44
我们可以将查询项矩阵10.11 注意力机制 - 图45设为10.11 注意力机制 - 图46,并令键项矩阵10.11 注意力机制 - 图47和值项矩阵10.11 注意力机制 - 图48相同且第10.11 注意力机制 - 图49行均为10.11 注意力机制 - 图50。此时,我们只需要通过矢量化计算

10.11 注意力机制 - 图51%5Cboldsymbol%7BV%7D%0A#card=math&code=%5Ctext%7Bsoftmax%7D%28%5Cboldsymbol%7BQ%7D%5Cboldsymbol%7BK%7D%5E%5Ctop%29%5Cboldsymbol%7BV%7D%0A)

即可算出转置后的背景向量10.11 注意力机制 - 图52。当查询项矩阵10.11 注意力机制 - 图53的行数为10.11 注意力机制 - 图54时,上式将得到10.11 注意力机制 - 图55行的输出矩阵。输出矩阵与查询项矩阵在相同行上一一对应。

10.11.2 更新隐藏状态

现在我们描述第二个关键点,即更新隐藏状态。以门控循环单元为例,在解码器中我们可以对6.7节(门控循环单元(GRU))中门控循环单元的设计稍作修改,从而变换上一时间步10.11 注意力机制 - 图56的输出10.11 注意力机制 - 图57、隐藏状态10.11 注意力机制 - 图58和当前时间步10.11 注意力机制 - 图59的含注意力机制的背景变量10.11 注意力机制 - 图60 [1]。解码器在时间步10.11 注意力机制 - 图61的隐藏状态为

10.11 注意力机制 - 图62%20%5Codot%20%5Ctilde%7B%5Cboldsymbol%7Bs%7D%7D%7Bt’%7D%2C%0A#card=math&code=%5Cboldsymbol%7Bs%7D%7Bt%27%7D%20%3D%20%5Cboldsymbol%7Bz%7D%7Bt%27%7D%20%5Codot%20%5Cboldsymbol%7Bs%7D%7Bt%27-1%7D%20%20%2B%20%281%20-%20%5Cboldsymbol%7Bz%7D%7Bt%27%7D%29%20%5Codot%20%5Ctilde%7B%5Cboldsymbol%7Bs%7D%7D%7Bt%27%7D%2C%0A)

其中的重置门、更新门和候选隐藏状态分别为

10.11 注意力机制 - 图63%2C%5C%5C%0A%5Cboldsymbol%7Bz%7D%7Bt’%7D%20%26%3D%20%5Csigma(%5Cboldsymbol%7BW%7D%7Byz%7D%20%5Cboldsymbol%7By%7D%7Bt’-1%7D%20%2B%20%5Cboldsymbol%7BW%7D%7Bsz%7D%20%5Cboldsymbol%7Bs%7D%7Bt’%20-%201%7D%20%2B%20%5Cboldsymbol%7BW%7D%7Bcz%7D%20%5Cboldsymbol%7Bc%7D%7Bt’%7D%20%2B%20%5Cboldsymbol%7Bb%7D_z)%2C%5C%5C%0A%5Ctilde%7B%5Cboldsymbol%7Bs%7D%7D%7Bt’%7D%20%26%3D%20%5Ctext%7Btanh%7D(%5Cboldsymbol%7BW%7D%7Bys%7D%20%5Cboldsymbol%7By%7D%7Bt’-1%7D%20%2B%20%5Cboldsymbol%7BW%7D%7Bss%7D%20(%5Cboldsymbol%7Bs%7D%7Bt’%20-%201%7D%20%5Codot%20%5Cboldsymbol%7Br%7D%7Bt’%7D)%20%2B%20%5Cboldsymbol%7BW%7D%7Bcs%7D%20%5Cboldsymbol%7Bc%7D%7Bt’%7D%20%2B%20%5Cboldsymbol%7Bb%7D_s)%2C%0A%5Cend%7Baligned%7D%0A#card=math&code=%5Cbegin%7Baligned%7D%0A%5Cboldsymbol%7Br%7D%7Bt%27%7D%20%26%3D%20%5Csigma%28%5Cboldsymbol%7BW%7D%7Byr%7D%20%5Cboldsymbol%7By%7D%7Bt%27-1%7D%20%2B%20%5Cboldsymbol%7BW%7D%7Bsr%7D%20%5Cboldsymbol%7Bs%7D%7Bt%27%20-%201%7D%20%2B%20%5Cboldsymbol%7BW%7D%7Bcr%7D%20%5Cboldsymbol%7Bc%7D%7Bt%27%7D%20%2B%20%5Cboldsymbol%7Bb%7Dr%29%2C%5C%5C%0A%5Cboldsymbol%7Bz%7D%7Bt%27%7D%20%26%3D%20%5Csigma%28%5Cboldsymbol%7BW%7D%7Byz%7D%20%5Cboldsymbol%7By%7D%7Bt%27-1%7D%20%2B%20%5Cboldsymbol%7BW%7D%7Bsz%7D%20%5Cboldsymbol%7Bs%7D%7Bt%27%20-%201%7D%20%2B%20%5Cboldsymbol%7BW%7D%7Bcz%7D%20%5Cboldsymbol%7Bc%7D%7Bt%27%7D%20%2B%20%5Cboldsymbol%7Bb%7Dz%29%2C%5C%5C%0A%5Ctilde%7B%5Cboldsymbol%7Bs%7D%7D%7Bt%27%7D%20%26%3D%20%5Ctext%7Btanh%7D%28%5Cboldsymbol%7BW%7D%7Bys%7D%20%5Cboldsymbol%7By%7D%7Bt%27-1%7D%20%2B%20%5Cboldsymbol%7BW%7D%7Bss%7D%20%28%5Cboldsymbol%7Bs%7D%7Bt%27%20-%201%7D%20%5Codot%20%5Cboldsymbol%7Br%7D%7Bt%27%7D%29%20%2B%20%5Cboldsymbol%7BW%7D%7Bcs%7D%20%5Cboldsymbol%7Bc%7D_%7Bt%27%7D%20%2B%20%5Cboldsymbol%7Bb%7D_s%29%2C%0A%5Cend%7Baligned%7D%0A)

其中含下标的10.11 注意力机制 - 图6410.11 注意力机制 - 图65分别为门控循环单元的权重参数和偏差参数。

10.11.3 发展

本质上,注意力机制能够为表征中较有价值的部分分配较多的计算资源。这个有趣的想法自提出后得到了快速发展,特别是启发了依靠注意力机制来编码输入序列并解码出输出序列的变换器(Transformer)模型的设计 [2]。变换器抛弃了卷积神经网络和循环神经网络的架构。它在计算效率上比基于循环神经网络的编码器—解码器模型通常更具明显优势。含注意力机制的变换器的编码结构在后来的BERT预训练模型中得以应用并令后者大放异彩:微调后的模型在多达11项自然语言处理任务中取得了当时最先进的结果 [3]。不久后,同样是基于变换器设计的GPT-2模型于新收集的语料数据集预训练后,在7个未参与训练的语言模型数据集上均取得了当时最先进的结果 [4]。除了自然语言处理领域,注意力机制还被广泛用于图像分类、自动图像描述、唇语解读以及语音识别。

小结

  • 可以在解码器的每个时间步使用不同的背景变量,并对输入序列中不同时间步编码的信息分配不同的注意力。
  • 广义上,注意力机制的输入包括查询项以及一一对应的键项和值项。
  • 注意力机制可以采用更为高效的矢量化计算。

参考文献

[1] Bahdanau, D., Cho, K., & Bengio, Y. (2014). Neural machine translation by jointly learning to align and translate. arXiv preprint arXiv:1409.0473.

[2] Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., … & Polosukhin, I. (2017). Attention is all you need. In Advances in Neural Information Processing Systems (pp. 5998-6008).

[3] Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2018). Bert: Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805.

[4] Radford, A., Wu, J., Child, R., Luan, D., Amodei, D., Sutskever I. (2019). Language Models are Unsupervised Multitask Learners. OpenAI.


注:本节与原书基本相同,原书传送门