SimLabs AI

Transformer 自注意力机制演示

通过矩阵可视化、逐步讲解和动态高亮,拆解自注意力里的 Q、K、V、打分矩阵、Softmax 和最终上下文向量,让抽象公式变成可观察的计算过程。

适合课堂演示 QKV 与注意力计算链路 适合初学者把公式和矩阵位置一一对应 支持逐步播放和 Q × K^T 逐格高亮观察

这个页面现已纳入 SimLabs LLM 可视化 系列,也可以先回到路线图按顺序学习。

1. 输入矩阵 X
2. 生成 Q, K, V
3. 计算注意力打分
4. Softmax 归一化
5. 输出上下文向量
步骤 0:输入序列矩阵
我们有 3 个单词(例如 "The", "cat", "sat"),每个词用 4 维向量表示。输入矩阵 $X \in \mathbb{R}^{3 \times 4}$,其中行数代表词的数量,列数代表词向量的维度。
步骤 1:生成 Query、Key、Value 矩阵
将输入矩阵 $X$ 分别与三个可学习的权重矩阵 $W^Q, W^K, W^V$ 相乘,生成 Query(查询)、Key(键)、Value(值)矩阵。关键不是“重复算三次”,而是让同一个词分别承担三种不同职责。
$$Q = XW^Q, \quad K = XW^K, \quad V = XW^V$$
Q = Query

我现在想找什么?

Q 决定当前词发出的“问题”。它告诉模型:我应该重点寻找哪一类信息。

  • 更像“检索条件”
  • 决定我要关注谁
K = Key

我身上有哪些标签?

K 决定这个词如何被别人找到。其他词会拿自己的 Q 来和我的 K 做匹配。

  • 更像“索引标签”
  • 决定我是否值得被看
V = Value

如果关注我,我提供什么内容?

V 是真正会被拿去加权汇总的信息本体。注意力高的词,会贡献更多自己的 V。

  • 更像“正文内容”
  • 决定最后输出里留下什么
记忆口诀:Q 决定“我要找什么”,K 决定“我能被怎样找到”,V 决定“我真正贡献什么信息”。
×
=
×
=
×
=

同一个词,为什么要变成三种向量?

选中一个词,看看它如何从原始输入 $X$,分别投影成 Q、K、V。这样更容易看出:同一个词在注意力里同时扮演“提问者”“被检索者”“信息提供者”三种身份。

原始输入 X

这是词的基础语义表示,还没有区分“查找”“匹配”“提供内容”这三种用途。

{{ formatVector(selectedTokenDetails.x) }}

变成 Q

把它改写成“我现在想找什么特征”的向量,用来主动提问。

{{ formatVector(selectedTokenDetails.q) }}

变成 K

把它改写成“我身上带着哪些标签”的向量,等别人来匹配。

{{ formatVector(selectedTokenDetails.k) }}

变成 V

把它改写成“如果被关注,我该贡献什么信息”的向量。

{{ formatVector(selectedTokenDetails.v) }}

提前把后续流程串起来看: 当前观察的是 {{ selectedTokenDetails.label }}。它会先拿自己的 Q 去和全句每个词的 K 做点积打分,再把得到的注意力权重分配到各个词的 V 上,最后形成输出向量 Z = {{ formatVector(selectedTokenDetails.z) }}

对 {{ item.label }}:原始分数 {{ item.score }},注意力权重 {{ item.weight }}
步骤 2:计算注意力打分
用 Query 矩阵 $Q$ 乘以 Key 矩阵的转置 $K^T$,得到原始的注意力打分矩阵。矩阵中的每个元素 $\text{Scores}_{ij}$ 表示第 $i$ 个词对第 $j$ 个词的关注程度(相关性)。
$\text{Scores} = QK^T$
×
=

逐格看 Q × KT 是怎么乘出来的

当前高亮的是 {{ activeScoreDemo.queryLabel }} 的 Query 行,以及 {{ activeScoreDemo.keyLabel }} 在转置后对应的 Key 列。它们做点积之后,结果会落在 Scores 的目标单元格里。

第 {{ scoreDemoIndex + 1 }} / {{ scoreDemoSequence.length }} 格
为什么这里要看列? 因为原本第 {{ activeScoreDemo.colIndex + 1 }} 个词的 Key 向量,在转置成 $K^T$ 之后会变成第 {{ activeScoreDemo.colIndex + 1 }} 列,所以矩阵乘法本质上是在拿 “Q 的一整行” 去点乘 “$K^T$ 的一整列”。

{{ activeScoreDemo.queryLabel }} 的 Q 向量是 {{ formatVector(activeScoreDemo.qVector) }},{{ activeScoreDemo.keyLabel }} 的 K 向量是 {{ formatVector(activeScoreDemo.kVector) }}。

{{ term.left }} × {{ term.right }} = {{ term.product }}
结果: Scores[{{ activeScoreDemo.rowIndex + 1 }}, {{ activeScoreDemo.colIndex + 1 }}] = {{ activeScoreDemo.score }}; 缩放后为 {{ activeScoreDemo.scaledScore }}; Softmax 后对应权重为 {{ activeScoreDemo.attentionWeight }}。
步骤 3:缩放与 Softmax 归一化
首先将打分矩阵除以 $\sqrt{d_k}$(本例中 $d_k = 3$,所以除以 $\sqrt{3} \approx 1.732$)进行缩放,防止梯度消失。然后对每一行应用 Softmax 函数,将打分转化为概率分布(每行和为 1),得到最终的注意力权重矩阵。
$\text{Attention Weights} = \text{softmax}\left(\frac{\text{Scores}}{\sqrt{d_k}}\right)$
Softmax(
) =
步骤 4:计算最终输出
用注意力权重矩阵乘以值矩阵 $V$,进行加权求和。最终得到的输出矩阵 $Z$ 就是融合了整个句子上下文信息的新词向量表示。每个词的新表示都包含了它对其他词的关注信息。
$Z = \text{Attention Weights} \times V$
×
=
✓ 完成! 输出矩阵 $Z$ 的每一行代表一个词的新向量表示,它融合了该词与句子中所有其他词的关系信息。这就是 Transformer 自注意力机制的核心计算过程。
[System] {{ log }}

Transformer 核心:自注意力机制 (Self-Attention) 原理解析

引言:从词到向量 (Word to Vector)

计算机无法直接理解文字,只能处理数字。因此,我们需要将每个单词转换为一个数字向量(Embedding)。例如,句子 "The cat sat" 中的三个词,每个词被表示为一个 4 维向量,形成输入矩阵 $X \in \mathbb{R}^{3 \times 4}$(3 个词,每个词 4 维)。

一、核心魔法:自注意力机制 (Self-Attention)

在传统的序列模型(如 RNN/LSTM)中,文字是按顺序一个一个处理的。而 Transformer 的颠覆性在于它打破了时间顺序,让句子中的所有词在同一时间相互审视,这就是自注意力机制。

1.1 核心角色:Q, K, V

自注意力机制的核心是将输入矩阵 $X$ 分别乘以三个可学习的权重矩阵,得到三个新矩阵:

  • Q (Query, 查询): 当前词想寻找什么特征?(比如 "bank" 作为主体去询问其他词,想搞清楚自己是"银行"还是"河岸")
  • K (Key, 键): 句子中的每个词身上带有什么特征标签?用于与 Query 进行匹配。
  • V (Value, 值): 如果匹配上了,这个词实际能提供的具体信息内容是什么。

生成 Q, K, V 的公式:

$$ Q = XW^Q, \quad K = XW^K, \quad V = XW^V $$

其中 $W^Q, W^K, W^V \in \mathbb{R}^{d_{model} \times d_k}$ 是可学习的权重矩阵。

可以这样快速记忆 Q / K / V:

Q 像搜索词,K 像每个词贴出来的标签,V 像标签背后的正文内容。

当前词先拿自己的 Q 去扫描全句的 K,决定“该看谁”;然后按权重把这些词的 V 汇总起来,形成新的上下文表示。

1.2 数学推导公式

整个自注意力的计算可以浓缩为一个优雅的矩阵公式:

$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$

1.3 公式步骤拆解

  1. 步骤 1:计算相关性打分 $QK^T$
    用 Query 矩阵 $Q$ 去点乘所有词的 Key 矩阵 $K$ 的转置。点积越大,说明两个词的特征越匹配,关联度越高。结果是一个 $3 \times 3$ 的打分矩阵,其中 $\text{Scores}_{ij}$ 表示第 $i$ 个词对第 $j$ 个词的关注程度。
  2. 步骤 2:缩放 (Scale)
    除以 $\sqrt{d_k}$(在本演示中 $d_k = 3$,所以除以 $\sqrt{3} \approx 1.732$)。这是为了防止维度较高时,点积的结果过大,导致后续的 Softmax 函数梯度消失。
  3. 步骤 3:Softmax 归一化
    将缩放后的打分矩阵的每一行进行 Softmax 操作,转化为概率分布(每行的和为 1)。这代表了当前词分配给句子中所有词的注意力权重。
  4. 步骤 4:加权求和
    用刚才计算出的注意力权重矩阵乘以值矩阵 $V$,进行加权求和。最终得到的输出 $Z$,就是融合了整个句子上下文语境的全新词向量表示。

二、多头注意力 (Multi-Head Attention)

在实际的 Transformer 中,会使用多个注意力头(Multi-Head)。每个头使用不同的 $W^Q, W^K, W^V$ 权重矩阵,从不同的子空间(视角)去理解句子:

  • 有的头可能关注语法结构(主谓宾关系)
  • 有的头可能关注语义相似性(同义词、近义词)
  • 有的头可能关注时态和情态
$$ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)W^O $$ $$ \text{where } \text{head}_i = \text{Attention}(QW^Q_i, KW^K_i, VW^V_i) $$

三、位置编码 (Positional Encoding)

自注意力机制本身是无序的(类似词袋模型),它无法区分 "猫咬狗" 和 "狗咬猫"。因此,Transformer 必须通过位置编码来注入位置信息。常用的方法是使用正弦和余弦函数:

$$ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$ $$ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) $$

位置编码会被加到词嵌入向量上,形成最终的输入表示。

四、前馈网络与残差连接 (FFN & Residual Connection)

在自注意力层之后,Transformer 还会经过一个前馈神经网络(Feed-Forward Network):

$$ \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 $$

同时,为了防止梯度消失和加速训练,Transformer 使用了残差连接(Residual Connection)和层归一化(Layer Normalization):

$$ \text{Output} = \text{LayerNorm}(x + \text{Sublayer}(x)) $$

五、总结

Transformer 的核心创新在于自注意力机制,它让模型能够并行处理整个序列,并动态地关注序列中的不同部分。通过 Q、K、V 三个矩阵的巧妙设计,Transformer 实现了高效的上下文建模,成为了现代 NLP(如 GPT、BERT)和多模态模型(如 CLIP、Stable Diffusion)的基石。

自注意力机制:为什么有效

自注意力机制之所以强大,是因为它从根本上解决了传统神经网络(如RNN、LSTM)处理序列数据时的两大核心缺陷:长距离依赖难题并行计算瓶颈。以下从五个维度拆解其有效性的根源。


1. 解决“忘事”问题:长距离依赖

在RNN或LSTM中,信息按顺序传递,句子越长,开头的信息越容易衰减(梯度消失),导致模型“忘了开头”。

  • 自注意力优势:每个词可以直接与序列中的所有词(包括最开头的词)进行交互计算。
  • 物理意义:无论两个词相隔多远,自注意力都能建立“短路连接”,直接衡量它们的相关性。
    例如句子:“那个在公园里遛狗的人,穿了一件红色的衣服。” 自注意力可让“人”和“红色的衣服”直接关联,不受中间长句的干扰。

2. 并行计算与“上帝视角”

RNN必须按时间步依次计算(处理完第1个字才能处理第2个),限制了GPU并行能力。

  • 自注意力优势:可一次性接收整个句子,通过矩阵运算同时计算所有词之间的相关性。
  • 物理意义:相当于在第一步就拥有“上帝视角”,看到句子全貌,而非逐步爬行。这充分利用了现代硬件的并行能力,大幅提升训练速度。

3. 动态权重分配:关注重点

卷积神经网络(CNN)的卷积核参数是静态的,无论输入内容如何变化,提取特征的方式固定。

  • 自注意力优势:注意力权重是动态生成的,完全依赖于当前的输入内容。
  • 物理意义:模型可根据上下文实时调整关注点。例如处理代词“它”时,自注意力会给前文的名词(如“苹果”或“汽车”)分配更高权重,帮助消歧。这种动态性赋予了模型极强的灵活性。

4. 多重表示:构建丰富的语义地图

Transformer使用多头注意力(Multi-Head Attention),即并行执行多组自注意力计算。

  • 自注意力优势:不同的“头”可以学习不同层面的依赖关系。
  • 物理意义
    • 有的头关注语法关系(如主语与谓语);
    • 有的头关注指代关系(如“小明”和“他”);
    • 有的头关注临近词修饰(如形容词与名词)。
    多视角表示使得文本理解更加立体和丰富。

5. 数学本质:特征向量的加权求和

自注意力核心公式:

Attention(Q, K, V) = softmax( QKT / √dk ) V
  • QKT:计算相似度矩阵,衡量每个元素与其他所有元素的匹配程度。
  • Softmax:将匹配度转换为概率分布(权重),使所有权重之和为1。
  • 乘以V:根据计算出的权重,对所有Value向量进行加权求和——权重越大,该位置对最终输出的贡献越大。

总结

自注意力机制通过全局感知、动态加权、并行计算,突破了传统模型在长序列建模和语义捕捉上的瓶颈。它不仅让模型“看见”每个词,更深刻地理解了词与词之间的相互作用——这正是它有效的根本原因。