某篇开创了一个时代(算是吧)的文章。短短单栏十页。

Attention 机制、Transformer。

Transformer 前 NLP 领域占统治地位的是网络结构是各种 RNN 和 LSTM 等技术。Transformer 的过程相对来说简洁得多:只包含一对 Encoder-Decoder,其中的核心组成部分是一堆堆叠的 Attention 单元。

为啥叫“All you need”?因为这篇文章提出的网络结构是第一个仅用 Attention 机制,不用任何 RNN 或 CNN 相关结构搭建的网络。

[1706.03762] Attention Is All You Need(2017 年 6 月)


要干啥

Transformer 能干的事情挺多的,几乎一切序列相关的任务都能 handle。

论文中重点提到的是机器翻译任务。这里也以翻译为例。

Transformer

Pasted image 20250807152521.png
好经典的图啊。

Encoder 的作用是把输入的词向量 x1n 变成高维隐空间中的 z1n。Decoder 根据这些 z 自回归地生成输出 y1m

什么是自回归?Decoder 一个一个输出 y 的元素,每次根据 y1i1z 生成当前的 yi

每个编码器分为 N 个层。对 Encoder,一个层由一个 Attention 层和一个全连接构成;对 Decoder,一个层由一个 Attention,一个接受 Encoder 输出的 Attention 和一个全连接构成。各层之间都有残差连接等结构。

文中的 Attention 层都是多头的,一个 Multi-Head Attention 层由 h 个头构成,每个头是一个 Attention 单元。一个 Attention 单元接受两个 n×dk 的矩阵 Q,K,一个 n×dv 的矩阵 V,输出一个 n×dv 的矩阵。

Attention 层接受三个长为 nd 维向量序列(其实长度不同也行吧)Q0,K0,V0,对每个头把它们分别乘以矩阵 WiQ,WiK,WiV 变成输入到该头的 Q,K,V(维度分别为 dk,dk,dv)。所有头处理完之后把所有 hdv 维输出拼起来,乘以 hdv×d 维矩阵 WO 得到 d 维输出。

观察上面的图可以发现,Encoder 用的 Attention 层和 Decoder 用的第一个 Attention 层分别用了三个一样的输入,称这种 Attention 层是 Self-Attention。Decoder 用的第二个 Attention 层采用了来自 Encoder 的输出作为 Q,K 的来源,称这是 Cross-Attention。

在下文中可以看到,Attention 单元内部的操作流程是固定的,没有可训练的参数。Attention 层中实际可训练的参数是上述的几个 W,它们控制了从原来的序列里面“提取特征” Q,K,V 的过程。

Attention 机制

考虑这样一个问题:有一组 n 个键值对 {(ki,vi)},键和值都是向量,现在给了一个询问向量 q,希望找到所有与询问向量相似的键对应的值,或者把每个值按照键与询问的相似度给个加权;n=1 时希望把 vq,k 相似度进行某种加权求出对应值。

首先容易想到衡量两个向量 q,k 相似度的方法可以是某种带归一化的点积:如果 qk 很小的话意味着它们几乎正交从而肯定不相似;把 qk 分别归一化到单位向量后它们点积越大在单位球面上的位置越接近。

因为这些东西都会在神经网络的输出上进行,如果网络没炸的话可以认为 q,k,v 的每个元素都是独立同分布的且均值是 0 方差是 1(姑且这么认为吧),所以先不考虑向量级别的归一化。为了突出那几个最相似的 ki 采用 Softmax:

Softmax(z)i=ezijezj

假设 q 和每个 ki 都是 dk 维向量,vi 都是 dv 维的,有 n 个键值对。把 n 个键并在一起构成一个 n×dk 的矩阵 K,考虑 Softmax(qKT),这个 n 维向量恰如其分地表示了 q 和每个 ki 的相似度。

然后把所有 V 也并起来,Softmax(qKT)V 就是按相似度加权之后的全体值向量之和,这是一个 dv 维的向量。

现在假设有 m 个询问,它们并成了一个矩阵 Q。Attention 单元接受三个输入矩阵 Q,K,V,输出

Attn(Q,K,V)=Softmax(QKTdk)V

为啥要除一个 dk?这是由于 qKT(由于涉及到 dk 个方差为 1 的元素相加)的方差会变为 dkdk 较大时这个点积容易变得很大而整体跑到 Softmax 的两端去,从而除一个标准差进行归一化。

好草率的操作啊……但确实是那么回事……

Q 被称为“查询”(Query),K 被称为“键”(Key),V 被称为“值”(Value)。Attention 单元(全称 Scaled Dot-Production Attention)实现的事情:求出按 qki 相似度加权后的全体 vi 之和,对 m 个询问批量求解输出。

那为啥叫“注意力”机制?Q 相当于是需要注意的地方,KV 对是所有地方以及它们实际存在的东西。

Why Attention?

文中居然专开一节讲了 Why!好感动好感动

……诶怎么感觉讲的全是废话

首先考虑为啥要有 Self-Attention 和 Cross-Attention。以翻译任务为例,Encoder 会把原来的句子编码成一串高维向量 z1,,zn,用 Self-Attention 保证可以关注到句子中每对位置的词的关系;Decoder 需要输出翻译后的句子,其中每个词的来源是之前翻译出的所有词和原来的句子,因此要用 Cross-Attention 把诸 z 拿进来。

再考虑为啥是 Attention 这个结构。一些原因:

  • NLP 的任务往往是基于序列的,提取序列中长距离元素之间的关系是网络的一个关键能力。我们考虑网络中的数据流向,关注两个长距离元素第一次被关联到一起时经过的路径长度有多长,路径长度越短,经过的可训练参数就越少,这两个元的关联素便越容易被学习到。可以发现,RNN 连接长距离元素所需要经过的路径长度是 O(n) 的;但 Attention 可以 O(1) 连接序列中两个任意位置。
  • 并行友善。
  • 用 Self-Attention 搭起来的模型的可解释性更强。在研究 Transformer 能力的论文中经常能看到这种例子图:
    Pasted image 20250807173855.png
  • 这种图是怎么来的?对一个长为 n 的句子,考察网络中某个特定 Self-Attention 头,它的 QK 都是 n×dk 的矩阵,对应于 n 个词的两种编码表示。把每个词的 q 和每个词的 k 点积,得到一个 n×n 的结果表示每个词在以每个词为询问时有多重要,这就可以画成上面的二分图了。这一般被称为 Attention 可视化,可以观察模型是怎么理解句子结构的。对 Cross-Attention 也可以画出类似的图。

为什么 Encoder 往 Decoder 传的数据被放到了中间层 Q,K 的位置,而非 V

这可以从上面的 Attention 可视化图入手。Q,K 共同控制了生成的 V 应该从之前的哪些 V 加权得到,而 V 才是最终 Decode 变成词的东西。以翻译任务为例,Q,K 的信息是关于句子结构的,是跨语言存在的,因此可以用于指导翻译后的句子应该长啥样,而 V 的信息是对每个语言 specified 的,把输入的中文的 V 丢到输出的英文的 V 里面显然会干扰生成。

事实上 Transformer 在别的领域的应用也遵循这个原则。有篇做图像风格迁移的论文(TODO)也是把图像结构信息作为 Q,K 然后风格信息传 V

这么一看好像风格迁移任务和翻译任务挺像的……?

还有没有别的结构具有和 Attention 一样好甚至更好的性质?……不知道,我不想研究 NLP 啊……

评论功能没修好,暂不开放