Attention

注意力机制(Attention Mechanism)的提出为了解决 seq2seq 在长序列中的遗忘问题(状态向量无法记住所有信息)。由 Dzmitry BahdanauICLR 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模型(如BERTGPT等)的基础。


编码阶段

编码过程与 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 的解码器输入,就是新输入 x1s0,向量拼接以后,乘参数矩阵 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,再加上 s1c1,计算出 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

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

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

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

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

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

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

Transformer 方法

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

ki=Wkhi,for i=1,,mq0=Wqs0

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

计算两个向量内积:

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

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

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

网络资源


本文作者:Maeiee

本文链接:Attention

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


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