引言
写这篇文章就是因为自学的时候看到了太多的照本宣科的告诉我"Q是query,K是key,V是value"的文章,我上过小学,不需要再教我英语了,我需要的是有人能用通俗易懂的方式解释这些概念背后的含义和逻辑。
每次看到一篇新文章兴冲冲地点进去,结果看到开头就是"Attention机制中的Q、K、V分别代表query、key和value",我就知道这篇文章又要浪费我的时间了。
我想知道的是:
- 为什么需要这三个矩阵?
- 它们分别在计算过程中扮演什么角色?
- 这样设计的直觉是什么?
- 如何从数学和工程角度理解它们的交互方式?
与其给我一堆术语翻译和公式堆砌,不如给我一个清晰的思路和直观的例子。如果你不能用简单的话解释清楚一个概念,那么很可能你自己也没有真正理解它。
所以,今天我要尝试用我理解的方式,为同样困惑的人解释一下Attention机制,不再是简单的英文翻译,而是深入浅出地讲解它们在整个机制中的作用和意义。
第0步 学习自注意力机制之前,了解他
不只是自注意力机制,我们学习任何一个未知的事物时,都要像面对一个黑盒一样的去了解他。
- 他的作用是什么
- 同类产品有没有什么缺点
- 他怎么解决这些缺点的
他的作用是什么
当我们面对一个黑盒时,我们想了解一个黑盒的作用,我们能且只能观察他的输入输出,我们可以看到自注意力机制的输入和输出都是序列的向量
那我们就清晰的认识到:
自注意力机制是完成序列到序列任务的机制
具体是什么任务,可能是中英翻译,可能是问答,可能涉及多模态?那就是看我们的想象了。
同类产品有没有什么缺点?
上一个完成序列到序列任务的是RNN

RNN通过不断更新隐藏状态让权重中包含了上下文的信息,但这种机制仍有诸多缺点:
- 首先便是循环这种机制其实很不适合推理相关的任务 ,因为不同时间步之间的权重更新强依赖上一个循环,所以循环的并行性是非常差的,基本无法做到并行计算,无法并行计算,性能优化空间就差,那就会造成速度很慢。
- 由于不断更新一个权重,虽然权重包含了上下文的信息,但是实际上每一步都在覆盖部分上一步的信息,这也就造成了在长文本的时候 RNN的表现很差,随着序列长度增加,早期输入的信息会在传递过程中逐渐衰减
他是怎么解决这些缺点的
综上,自注意力机制这个黑盒一定是一个可以并行的解决序列长距离依赖问题的序列处理任务!
那他要如何解决呢?
0. 全局信息获取
不用时间步,而是使用矩阵表示序列,矩阵中每行均代表序列中的一个单词,这样就可以在一个时间步内获取整个序列的全部信息,而不必像RNN一样逐个处理每个时间步。同时矩阵计算给并行计算提供了基础,相关信息可以关注GEMM。
1. 位置编码
RNN成也萧何,败也萧何,依赖上一个单词的输入成为了他模型发展的瓶颈,摒弃了RNN内置的顺序信息,通过设计一种方式,来对序列中各个单词的位置进行编码,描述单词和其他单词之间的距离关系,才能走的更远!
通过在词嵌入的基础上 加上位置编码, 让我们的矩阵既包含词语的信息,也包含词语间位置的信息。
这里选择三角函数进行位置编码:
<math xmlns="http://www.w3.org/1998/Math/MathML"> P E ( p o s , 2 i ) = s i n p o s 1000 0 2 i d m o d e l P E ( p o s , 2 i + 1 ) = c o s p o s 1000 0 2 i d m o d e l PE(pos, 2i) = sin{\frac{pos}{10000^{\frac{2i}{d_model}}}} \\ PE(pos, 2i+1) = cos{\frac{pos}{10000^{\frac{2i}{d_model}}}} </math>PE(pos,2i)=sin10000dmodel2iposPE(pos,2i+1)=cos10000dmodel2ipos
因为三角函数可以自然地表现出模型可以识别的连续模式【周期性与平滑性】,因此相对位置对于模型来说更容易识别
2. 动态权重分配
这个就是自注意力的核心了,一个序列中不同的单词之间的相关性是不同的。在自注意力中,序列中的每个元素都会:
- 与序列中的所有元素(包括自己)进行比较
- 基于相似度分配注意力权重
- 根据这些权重聚合信息
举个🌰
"小明喜欢吃他妈妈做的饭。"
小明
和他
的关联度远远比小明
和饭
的关联度高,自注意力机制就会基于这些关联度,给予"小明"更高的注意力权重,因为"他"很可能是指代"小明"。最后在表示"他"这个词时,更多的融合"小明"的语义信息。
那具体怎么实现呢?
还记得之前的矩阵么, 我们设矩阵为X,我们通过 X 和 X 的点积计算相似度,再用这个相似度乘 X ,根据相似度对第三个X进行加权求和,在这个过程中,模型就理解了整个句子的含义。
这里小小的吐槽下,很多人一顿解释QKV,好像根据qk相似度就可以从数据库中检索到实际的V一样,这么解释简直是害人,我们冷静的想下,你拥有的信息X其实只包含词语embedding和位置信息,你不可能根据问题X经过一些矩阵操作就从问题里面直接检索到答案的。
一些数学解释
通俗易懂的讲解之后,我们再讨论下公式本身。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V </math>Attention(Q,K,V)=softmax(dk QKT)V
1. 为什么要使用缩放因子
因为当X向量维度较高时,点积的结果的方差也会变大,通过缩放,我们可以使softmax的输入分布更加的稳定,防止注意力分布过于陡峭。
2. 为什么使用softmax
这里就是归一化权重,将矩阵相乘的结果改成(0,1)区间内的值,确保注意力相似度是一个概率分布,每个权重代表关注该位置的概率。
总结
一个技术的价值 = 反共识性 * 问题规模 * 应用成本
自注意力机制在提出的时代打破了序列数据必须顺序处理的思维定势,创先的使用位置编码,这在当时简直是革命性的架构创新。而在问题规模上,自注意力机制涵盖几乎所有序列处理任务,并为大规模预训练模型奠定基础,甚至在多模态领域都有应用,而相对低廉的应用成本则加速了其在产业中的落地。这三者的乘积效应使得 Transformer 架构从提出到主导各大AI领域仅用了短短几年时间。
当我们评估未来可能出现的技术革新时,这个框架同样适用------真正具有颠覆性的技术往往挑战着既有认知,解决着广泛问题,同时保持实用的应用门槛。技术创新的道路上,不仅需要解决"能不能做"的问题,更需要考虑"值不值得做"的价值平衡。而自注意力机制的成功故事,恰恰为我们提供了这样一个启示性的范例。