卡码笔记-最强八股文
首页
计算机基础
C++
Java
Go
大模型
  • Java面经
  • C++面经
  • 大模型面经
简历专栏
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
Go
大模型
  • Java面经
  • C++面经
  • 大模型面经
简历专栏
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 本栏必读

    • 卡码大模型专栏介绍
  • 入门认知

  • Prompt与调用基础

  • RAG检索增强

  • Agent智能体

  • 微调认知

  • 部署与工程化

  • 多模态入门

  • Transformer原理

    • 为什么都绕不开Transformer
    • 数据流动全解析:从输入到输出每一步
    • 三种架构详解与对比
    • Attention机制:Q、K、V是什么
    • Attention计算全过程一步步拆解
    • Multi-Head Attention:为什么一个头不够
    • 位置编码:Transformer为什么必须知道顺序
    • 残差连接、LayerNorm、FFN:缺一不可的配角
    • 一层Transformer Block长什么样
  • 手撕Transformer

  • 模型家族与Llama架构

  • 大模型动态

# Attention计算全过程:从QK转置到Softmax加权求和一步步拆解

上一篇文章给大家介绍了 Q、K、V 的直觉含义,这篇文章我们来把它"算一遍"。 不用担心,全程只有加减乘除和一个 Softmax,我们将会用一个简单的例子一步步来计算。

往期指路👉🏻


上一篇我们说:Query 在问"我该注意谁",Key 在回答"注意我",Value 是真正的信息。 但这些话说起来很直觉,计算机到底是怎么算出"注意多少"的呢?

答案就藏在这个公式里:

Attention(Q,K,V)=softmax(QK⊤dk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(​√​d​k​​​​​​​QK​⊤​​​​)V

看起来有点吓人,但我们一步一步来,你会发现它其实非常合理。


# 举一个最小的例子

假设输入序列是:

我 爱 你

每个 Token 经过 Embedding 之后变成一个 2 维向量(真实场景里通常是 512 或 1024 维,这里用 2 维方便手算供大家理解):

Token 向量
我 [1, 0]
爱 [0, 1]
你 [1, 1]

把三行拼在一起,就得到输入矩阵 X_{3×2}。

为了简化计算,我们假设 W_Q = W_K = W_V = 单位矩阵,所以 Q = K = V。 (真实训练中这三个矩阵是不同的,是学习得来的,这里先理解流程)


# 第一步:计算 QKᵀ(谁和谁更相关?)

有了 Q 和 K,我们要计算每对 Token 之间的相关程度。

直觉是这样的:两个向量越"相似",它们的内积(点积)就越大。

score(i,j)=qi⋅kj⊤\text{score}(i, j) = q_i \cdot k_j^\top score(i,j)=q​i​​⋅k​j​⊤​​

把所有 Token 两两都算一遍,就是矩阵乘法 Q × Kᵀ。 Q 是 3×2,Kᵀ 是 2×3,结果是 3×3 的分数矩阵,每一格表示"行 Token 对列 Token 的关注程度"。

手算一下:

我 爱 你
我 1 0 1
爱 0 1 1
你 1 1 2

注意右下角那个 2,代表"你"和自己的相似度最高——很合理,一个 Token 和自己当然最像。 讲到这里大家也应该明白了为什么要转置 K:

Q 和 K 都是 n×d 的矩阵,形状一样没法直接相乘。 把 K 转置成 d×n,才能得到 n×n 的分数矩阵,每一格刚好对应一对 Token。


# 第二步:缩放(为什么要除以 dk\sqrt{d_k}√​d​k​​​​​?)

上一步得到的分数,可能会非常大——尤其是当向量维度$ d_k $很高的时候。

来看个例子,假设两个 64 维的向量,每个分量都是随机数,它们的内积期望值大概是 64 倍于 1 维的情况。这会导致什么?

梯度就几乎消失了,模型根本学不动。

解决方式很简单——除以$ √d_k$:

scaledscore=QK⊤dk\text{scaled score} = \frac{QK^\top}{\sqrt{d_k}} scaledscore=​√​d​k​​​​​​​QK​⊤​​​​

我们的例子里 dk=2d_k = 2d​k​​=2, √2 ≈ 1.41,缩放后:

我 爱 你
我 0.71 0 0.71
爱 0 0.71 0.71
你 0.71 0.71 1.41

分数被"压平"了一些,Softmax 就不会那么极端。


# 第三步:Softmax(把分数变成权重)

现在的分数还是普通数字,有正有负,我们需要把它们变成概率——非负,且每行加起来等于 1。

这正是 Softmax 做的事:

softmax(zi)=ezi∑jezj\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}} softmax(z​i​​)=​∑​j​​e​z​j​​​​​​e​z​i​​​​​​

对每一行单独做 Softmax,以"我"这一行为例:

分数:[0.71, 0, 0.71]

e0.71≈2.03,e0=1.00,e0.71≈2.03e^{0.71} \approx 2.03, \quad e^0 = 1.00, \quad e^{0.71} \approx 2.03 e​0.71​​≈2.03,e​0​​=1.00,e​0.71​​≈2.03

总和 = 5.06,归一化后:

[2.03/5.06,1.00/5.06,2.03/5.06]≈[0.40,0.20,0.40][2.03/5.06,\ 1.00/5.06,\ 2.03/5.06] \approx [0.40,\ 0.20,\ 0.40] [2.03/5.06,1.00/5.06,2.03/5.06]≈[0.40,0.20,0.40]

三行全部算完,得到注意力权重矩阵 A:

我 爱 你
我 0.40 0.20 0.40
爱 0.20 0.40 0.40
你 0.27 0.27 0.46

可以验证,每行加起来都等于 1 ✅

"你"关注自己的权重是 0.46,明显高于关注另外两个词(各 0.27), 这说明 Attention 自动判断出:在当前这句话里,"你"最应该关注自己携带的信息。


# 第四步:加权求和(用权重"取"出信息)

最后一步,用注意力权重矩阵 A 对 V 做加权求和:

Output=A⋅V\text{Output} = A \cdot V Output=A⋅V

A 是 3×3,V 是 3×2,输出是 3×2,和输入 X 同形。

以"你"为例,它的权重行是 [0.27, 0.27, 0.46],V 矩阵的三行分别是:

  • v₁(我)= [1, 0]
  • v₂(爱)= [0, 1]
  • v₃(你)= [1, 1]
\text{out}_\text{你} = 0.27 \times [1,0] + 0.27 \times [0,1] + 0.46 \times [1,1] = [0.73,\ 0.73]

"你"的输出向量 [0.73, 0.73] 是三个 Token 信息的加权混合,但对自身的权重更大。

这就是 Attention 的本质:每个 Token 的输出,都是全局信息的一次加权聚合,权重由相似度决定。


# 串起整个流程

Attention(Q,K,V)=softmax(QK⊤dk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(​√​d​k​​​​​​​QK​⊤​​​​)V

步骤 操作 目的
① Q × Kᵀ 计算每对 Token 的相似度
② ÷ √d_k 防止分数过大导致梯度消失
③ Softmax 把分数变成概率权重,行和为 1
④ × V 按权重加权求和,聚合上下文信息

下一篇文章我们会进入 Multi-Head Attention,看看多个注意力头并行运转时,会带来什么效果,点个关注不迷路~

Last Updated: 4/16/2026, 6:06:25 PM

← Attention机制:Q、K、V是什么 Multi-Head Attention:为什么一个头不够 →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪