Attention

注意力机制(Attention Mechanism)的提出为了解决 seq2seq 在长序列中的遗忘问题(状态向量无法记住所有信息)。由 Dzmitry Bahdanau 于 ICLR 2015 年在《Neural Machine Translation by Jointly Learning to Align and Translate》论文中提出。

Note

本文是我学 Shusen Wang 老师课程视频的笔记,笔记中很多图片来自于课程的截图,在此统一注明出处。

核心思想:Decoder 每次更新状态的时候,都会再看一遍 Encoder 所有状态,从而避免遗忘。Attention 还能告诉 Decoder,应该关注 Encoder 哪个状态,Attention 名称的由来。

Attention 缺点:计算量大。

自引入以来,注意力机制已经在许多深度学习任务中取得了显著的成果,如机器翻译、文本摘要、语音识别和图像描述生成等。最著名的注意力模型之一是Transformer 模型,该模型完全基于多头自注意力,无需使用传统的循环神经网络(RNN)或卷积神经网络(CNN)结构。Transformer模型是许多当今最先进的NLP模型(如BERT、GPT等)的基础。


编码阶段

编码过程与 seq2seq 是一样的,不同之处在于:seq2seq 是将最后一个隐藏状态传入解码器,而这里,是将所有隐藏状态(隐藏状态集合)共同传入解码器。

Pasted image 20240203123009.png

Encoder 结束工作之后,Attention 和 Decoder 同时开始工作。


解码阶段

Decoder 的初始状态 s0 是 Encoder 的最后一个状态 hm。

除此之外,Decoder 还需要使用一系列权重值:

根据权重,可以计算上下文向量(Context Vector):

c0=α1h1+⋯+αmhm

注意,c0 是有状态的,因为权重是有状态的:αi=align(hi,s0)。

每个 Context Vector 都会对应一个 Decoder 状态 s。

解码器输入

Pasted image 20240203130126.png

纯 RNN 的解码器输入,就是新输入 x1′ 与 s0,向量拼接以后,乘参数矩阵 A′,再 Tanh,得到下一个状态 s1。只需要知道新输入 x 与旧状态 x。

有了 Attention 后,需要拼接 Context Vector,来计算新状态。

Context Vector 是 Encoder 所有状态 h1,⋯,hm 的加权平均 Context Vector 知道 Encoder 的输入 x1,⋯,xm 的完整信息。

因为 s1 的计算过程中结合了 Context Vector,因此 s1 同样知道 Encoder 完整的信息,从而解决了 RNN 的遗忘问题。

下一状态计算

权重计算式:αi=align(hi,s1)。,重新算出 s1 对应的权重,

再计算 Context Vector:

c1=α1h1+⋯+αmhm

Decoder 接受新输入 x2′,再加上 s1、c1,计算出 s2:

Pasted image 20240203131251.png

循环

如此循环往复:

Pasted image 20240203131507.png

问题回答:


直观理解权重含义

神经机器翻译,Encoder 在下,Decoder 在上。

Attention 会把 Decoder 的每个状态与 Encoder 每个状态作对比,得到两者相关性(即权重 α)。

线表示 Decoder 状态与 Encoder 状态的关联,粗的线表示权重大,细的表示权重小。两个状态的相关性高。

Pasted image 20240203131734.png

每当 Decoder 想要生成一个状态的时候,都会看一遍 Encoder 所有的状态。权重告诉 Decoder 该关注什么地方——Attention 名字的由来。

帮助 Decoder 生成正确的状态,从而生成正确的输出。


如何计算权重 α

原始论文方法

Pasted image 20240203123750.png

将 hi 与 s0 进行拼接,得到一个向量,求一个矩阵 W,与这个向量相乘,再对每一个元素应用 Tanh 函数,数值变为 (−1,1)。

再计算向量 v 与刚刚算出来向量的内积,得到 α~i。

v 和 W 都是参数,需要从训练数据里学习。

之后进行 normalize(相加之和为 1):

[α1,⋯,αm]=Softmax([α~1,⋯,α~m])

这是原始论文中提出的方法,在此之后,有很多其他论文提出权重计算方法。

Transformer 方法

更加流行的方式。输入还是 hi 与 s0,但是先对他们进行线性变换:

ki=Wk⋅hi,for i=1,⋯,mq0=Wq⋅s0

两个 W 参数矩阵,需要从训练数据中学习。

计算两个向量内积:

α~i=kiTq0,for i=1,⋯,m

之后进行 normalize(相加之和为 1):

[α1,⋯,αm]=Softmax([α~1,⋯,α~m])

网络资源


本文作者:Maeiee

本文链接:Attention

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!