小杨是图书馆的新管理员。每天都有读者来问:“我想学做巴斯克蛋糕,应该看哪几本书?”小杨不会立刻把整座图书馆背下来,而是先理解读者的问题,再看看每本书封面上的标签,最后从标签匹配的几本书里挑出最相关的内容,混合成一份定制答案。这个“根据问题匹配标签、再按匹配度取内容”的过程,就是缩放点积注意力要做的事。Transformer 之所以能理解一句话里每个词之间的关系,靠的就是这个核心运算:用 Query(问题)去匹配 Key(标签),经缩放和 Softmax 后形成权重,再对 Value(内容)加权求和。可以说,理解了缩放点积注意力,就抓住了 Transformer 真正“思考”的方式。

岗位关联

对 AI 从业者来说,这是通往 Transformer、大语言模型和注意力机制的一把钥匙;无论是实现模型、优化训练,还是进行推理加速,都绕不开这个核心公式。

目录
  1. 可视化演示
  2. 角色与直觉:图书卡片的三个要素
  3. 打分机制:点积如何度量相关
  4. 缩放因子:音量旋钮背后的数学
  5. 归一化与加权:从得分到答案
  6. 向量化实现:让图书馆同时工作
  7. 性能对比:为什么点积胜出
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示DiT(Diffusion Transformer)架构的核心流程,包括Patch编码、Transformer去噪与扩散过程,直观理解Sora视频生成的核心架构设计。

本节配有交互动效(进入视口后自动加载,约 3KB)。

DiT扩散Transformer Patch编码:将视频帧分割为时空Patch序列,类似ViT处理图像 Transformer去噪:用自注意力替代U-Net,逐步去除噪声生成清晰帧 扩散过程:前向加噪→反向去噪,T步逐步还原视频 x_t = √(α_t)·x_0 + √(1-α_t)·ε; DiT(x_t,t) → x_{t-1} DiT用Transformer架构替代U-Net实现扩散去噪

角色与直觉:图书卡片的三个要素

小杨在图书馆里慢慢摸出了门道:读者的问题、书的标签、书的内容,是三样完全不同的东西。问题是一句具体的需求,标签是封面上提炼出的关键词,内容才是真正要吸收的知识。在缩放点积注意力里,这三个角色分别叫 Query、Key、Value。Query 是“我在找什么”,Key 是“我有什么标签”,Value 是“被加权取用的内容”。模型并不知道这些角色应该长什么样,所以它通过可学习的矩阵,把原始的单词向量分别投影成三种身份。

整个 Transformer 的输入是一排 token,每个 token 有一个嵌入向量。为了让同一个 token 既能当“提问者”,又能当“被检索对象”,还能当“被提取的内容”,我们会用三个不同的线性投影把它分别变成 Q、K、V。这就好比小杨把同一本《烘焙入门》同时做了三张卡片:一张写“如何做蛋糕”,一张写“烘焙、甜品”,一张摘录蛋糕配方。

小杨发现,只要把“问题、标签、内容”分开整理好,后面的检索就有了清晰的起点。这正是 Q/K/V 投影的意义:让模型在训练中学会把信息分成不同角色。

Q=XWQ,K=XWK,V=XWV\displaystyle Q = XW_Q,\qquad K = XW_K,\qquad V = XW_V
X 是所有 token 组成的矩阵,W 是三个可学习投影矩阵;它们把通用嵌入转换成三种不同用途的向量。
  1. 输入矩阵 X每一行是一个 token 的嵌入向量,可以理解为图书馆里所有书的原始档案。
    X∈RL×dmodelX \in \mathbb{R}^{L \times d_{\text{model}}}
  2. 投影矩阵 W负责把通用档案“改造成不同职位”,是训练中学出来的参数。
    WQ∈Rdmodel×dk,WK∈Rdmodel×dk,WV∈Rdmodel×dvW_Q \in \mathbb{R}^{d_{\text{model}} \times d_k},\quad W_K \in \mathbb{R}^{d_{\text{model}} \times d_k},\quad W_V \in \mathbb{R}^{d_{\text{model}} \times d_v}
  3. 矩阵乘得到 Q/K/V每行对应一个 token 的查询、键或值向量,分别参与后续匹配和内容提取。
    Q,K∈RL×dk,V∈RL×dvQ, K \in \mathbb{R}^{L \times d_k},\quad V \in \mathbb{R}^{L \times d_v}

打分机制:点积如何度量相关

有了卡片之后,小杨面临一个新问题:怎么判断“如何做巴斯克蛋糕”和标签“烘焙、甜品”有多匹配?他不能只看字面是否相同,而是要把问题和标签都变成向量,再比较这两个向量的方向是否一致。方向越一致,点积越大,相关度越高。这是点积注意力最朴素的想法:用逐维度相乘再求和来给“匹配程度”打分。

在数学上,第 i 个 token 的查询向量 \(q_i\) 和第 j 个 token 的键向量 \(k_j\) 的点积写成:

所有查询和所有键两两计算,就会得到一个 \(n \times n\) 的得分矩阵。小杨把这张矩阵想象成一张“读者—书籍匹配表”,每一格都写着某个问题对某本书的匹配度。匹配度越高,后续给这本书的“注意力”就应该越多。

scoreij=qi⋅kj=∑m=1dkqi,mkj,m\displaystyle \mathrm{score}_{ij} = q_i \cdot k_j = \sum_{m=1}^{d_k} q_{i,m}k_{j,m}
点积把两个向量的每一维相乘后累加;值越大,说明查询和键在同一个方向上越“契合”。
  1. 查询向量 q_i代表第 i 个位置“想找什么”。
    qi∈Rdkq_i \in \mathbb{R}^{d_k}
  2. 键向量 k_j代表第 j 个位置“能提供什么”。
    kj∈Rdkk_j \in \mathbb{R}^{d_k}
  3. 逐维相乘再求和把两个向量每个维度上的取值相乘并累加,得到一个标量分数。
    ∑m=1dkqi,mkj,m\sum_{m=1}^{d_k} q_{i,m}k_{j,m}

缩放因子:音量旋钮背后的数学

小杨第一次直接按分数选书时,发现分数很容易“爆表”:如果某本书标签特别长,分数会被顶得很高,结果注意力几乎全集中到一本书上,其他书全被忽略。用专业术语说,就是 Softmax 的输出变得接近 one-hot,导致梯度变得很小,模型训练不动。Transformer 的解决方式很简单:给整体分数加一个音量旋钮,除以 \(\sqrt{d_k}\)。

假设 \(q\) 和 \(k\) 的每个分量都是从均值为 0、方差为 1 的分布里采样的独立随机变量,那么它们的点积分期望虽然仍是 0,方差却会随着维度 \(d_k\) 增大而线性增长。于是点积的标准差会变成 \(\sqrt{d_k}\)。为了让缩放后的分数仍然保持方差为 1,自然就应该除以 \(\sqrt{d_k}\)。

小杨把这个旋钮称为“调音台”:它不会改变哪本书更重要的排序,但会让音量不会大到刺耳、也不会小到听不见。在训练里,它保证了最开始的梯度是平稳的,模型不会一上来就“走极端”。

Var(q⋅k)=∑m=1dkVar(qmkm)=dk,Var(q⋅kdk)=1\displaystyle \mathrm{Var}(q \cdot k) = \sum_{m=1}^{d_k}\mathrm{Var}(q_m k_m) = d_k,\qquad \mathrm{Var}\left(\frac{q \cdot k}{\sqrt{d_k}}\right) = 1
缩放的本质是把“音量”拉回正常范围,让 Softmax 不会因为分数过大而过早饱和,从而保护梯度。
  1. 单项方差当 \(q_m\) 和 \(k_m\) 均值为 0、方差为 1 且相互独立时,乘积的方差为 1。
    Var(qmkm)=1\mathrm{Var}(q_m k_m) = 1
  2. 求和累加点积由 \(d_k\) 个独立项相加,方差就是 \(d_k\)。
    Var(q⋅k)=dk\mathrm{Var}(q \cdot k) = d_k
  3. 除以根号 dk因为标准差是 \(\sqrt{d_k}\),所以除以它后方差变为 1。
    q⋅kdk ⇒ Var=1\frac{q \cdot k}{\sqrt{d_k}} \ \Rightarrow\ \mathrm{Var} = 1

归一化与加权:从得分到答案

分数有了,音量也调好了,接下来小杨要把分数变成真正的“阅读比例”。Softmax 就是那个裁判:它把同一行的一组分数变成一组非负、总和为 1 的概率。概率越高,代表这本书在最终答案里占的权重越大。得到权重后,把每本书的 Value 向量按对应权重加在一起,就得到了当前 token 的输出向量。

完整公式就是 Transformer 论文中最核心的缩放点积注意力:

小杨这时候恍然大悟:他不是直接“选中一本书”,而是把几本书按比例剪裁、拼贴成一份新答案。如果某本书的权重接近 1,答案就几乎完全来自那本书;如果两本书权重各占 0.5,答案就是它们内容的“平均味道”。

Attention(Q,K,V)=softmax(QK⊤dk)V\displaystyle \mathrm{Attention}(Q,K,V) = \mathrm{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)V
先算 Q 和 K 的匹配分数,再缩放、归一化成权重,最后用权重去加权求和 Value,得到这个 token 在这一层“读到”的信息。
  1. QK^T查询矩阵和键矩阵相乘,得到所有位置两两之间的分数矩阵。
    QK⊤∈Rn×nQK^{\top} \in \mathbb{R}^{n \times n}
  2. 除以根号 dk对分数矩阵整体缩放,控制方差,保护梯度。
    QK⊤dk\frac{QK^{\top}}{\sqrt{d_k}}
  3. Softmax 归一化对每一行做指数归一化,让分数变成概率。
    P=softmax(QK⊤dk)P = \mathrm{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)
  4. 乘以 V用概率矩阵对 Value 矩阵做加权求和,得到输出。
    Attention=PV\mathrm{Attention} = P V

向量化实现:让图书馆同时工作

小杨最开始是一本一本地和问题比对,速度非常慢。后来他发现,图书馆完全可以一次性把“所有问题”和“所有标签”放进一张大表里,同时算出所有匹配度。这就是向量化的含义:不要用循环逐对计算,而是用矩阵乘法一次算出所有结果。

在注意力中,我们把多个 token 的 Q、K、V 分别堆叠成矩阵。Q 的每一行是一个查询,K 的每一列参与匹配,V 的每一行是待加权的内容。整个过程可以写成:

小杨把这种实现形容成“同时翻阅所有书”:不再是一个读者一个问题地服务,而是所有读者同时看所有标签,最后一次性生成各自的阅读清单。正是这种并行能力,让 Transformer 比 RNN 更容易在大规模 GPU 集群上训练。

Scoresn×n=Qn×dkKdk×n⊤,Outn×dv=Pn×nVn×dv\displaystyle \mathrm{Scores}_{n \times n} = Q_{n \times d_k} K^{\top}_{d_k \times n},\qquad \mathrm{Out}_{n \times d_v} = P_{n \times n} V_{n \times d_v}
矩阵乘可以把两两之间的所有计算打包并行,GPU 对矩阵乘有深度优化,因此比写 for 循环快几个数量级。
  1. Q 的形状\(n\) 个 token,每个是 \(d_k\) 维的查询向量。
    Q∈Rn×dkQ \in \mathbb{R}^{n \times d_k}
  2. K 转置把 \(n \times d_k\) 转成 \(d_k \times n\),使 Q 的行和 K 的列能直接相乘。
    K⊤∈Rdk×nK^{\top} \in \mathbb{R}^{d_k \times n}
  3. 分数矩阵一次乘法得到所有查询对所有键的分数。
    Scores∈Rn×n\mathrm{Scores} \in \mathbb{R}^{n \times n}
  4. 输出矩阵概率矩阵 \(P\) 和 \(V\) 相乘,得到每个 token 的加权输出。
    Out∈Rn×dv\mathrm{Out} \in \mathbb{R}^{n \times d_v}

性能对比:为什么点积胜出

小杨后来听说,在 Transformer 出现之前,还有人用“加性注意力”来打分。那种方法不是直接乘,而是给每一对“查询—键”配一个小的神经网络打分器:先拼接或相加,再过一层全连接和 tanh,最后算出一个分数。听起来更复杂,也更有表达力,为什么最终 Transformer 选用的是简单的点积注意力?

关键在于效率。加性注意力和点积注意力的时间复杂度都是 \(O(n^2 d_k)\),但点积注意力只需要乘法和加法,而加性注意力还额外包含了全连接层和 tanh 激活,运算常数更大。更致命的是,加性注意力更难被映射成高度优化的矩阵乘法,而点积注意力几乎可以完全交给 GPU 的矩阵乘单元。

最终,小杨在图书馆的“推荐算法升级会”上选了点积注意力。它不是在所有任务上都更准,但它在速度和工程友好度上全面胜出。对于需要处理海量文本的深度学习工程师来说,这就是最实用的选择。

Tdot(n)=O(n2dk),Tadd(n)=O(n2dk),Cdot≪Cadd\displaystyle T_{\text{dot}}(n) = O(n^2 d_k),\qquad T_{\text{add}}(n) = O(n^2 d_k),\qquad C_{\text{dot}} \ll C_{\text{add}}
两者复杂度同阶,但点积注意力常数因子更小,且更适合 GPU 并行优化;这也是 Transformer 选择它的工程原因。
  1. n 和 d_kn 是序列长度,d_k 是键向量维度;每对查询和键要做一次长度为 d_k 的计算。
    O(n2dk)O(n^2 d_k)
  2. 点积常数因子点积内部只有乘加,计算轻量。
    Cdot≈一次内积C_{\text{dot}} \approx \text{一次内积}
  3. 加性常数因子加性注意力多出全连接层和 tanh,计算更重。
    Cadd≈一个小型MLPC_{\text{add}} \approx \text{一个小型MLP}

AI 应用场景

机器翻译与语言模型训练

阶段:模型训练

解决的问题:传统 RNN 必须按时间步逐个处理单词,难以并行。Scaled Dot-Product Attention 让每个词都能同时“看到”所有其他词,直接计算任意两个位置的关联,大幅提升训练速度。

具体案例:训练一个中文到英文的翻译模型时,decoder 中每个 token 的 Query 会和 encoder 输出的 Key/Value 做缩放点积注意力,从而让“主语”准确对齐“动词”,并用 Softmax 权重决定翻译时应该参考源语言的哪些部分。

检索增强生成(RAG)

阶段:推理

解决的问题:传统检索依赖关键词精确匹配,无法理解“怎么做好吃的巴斯克蛋糕”和“芝士蛋糕配方”之间的语义关系。缩放点积注意力可以把问题和文档片段映射成稠密向量,直接计算语义相关度。

具体案例:在智能客服系统中,用户提问生成 Query,候选文档生成 Key 和 Value;点积打分后,系统从知识库里检索出最相关的几个片段,再交给大模型生成回答。缩放因子保证了打分稳定,不会因为文档长度差异导致注意力失衡。

注意力计算算子优化与推理加速

阶段:推理部署

解决的问题:序列很长时,注意力矩阵 \(n \times n\) 会占用大量显存和计算时间。理解了缩放点积注意力的矩阵形状后,工程师可以做算子融合、分块计算,甚至利用在线 Softmax 减少显存读写。

具体案例:在部署千亿参数模型时,推理引擎会把 QKV 投影、缩放、Softmax、加权求和融合成 GPU Kernel,避免把完整分数矩阵写回显存,从而提高吞吐量。这正是 FlashAttention 等高效注意力方案的思想基础。

Python 演示

python41 行
import numpy as np  def softmax(x, axis=-1):    x_max = np.max(x, axis=axis, keepdims=True)    exp_x = np.exp(x - x_max)    return exp_x / np.sum(exp_x, axis=axis, keepdims=True)  def scaled_dot_product_attention(Q, K, V, mask=None):    d_k = Q.shape[-1]    scores = np.matmul(Q, K.transpose(0, 2, 1)) / np.sqrt(d_k)    if mask is not None:        scores = np.where(mask, scores, -1e9)    weights = softmax(scores, axis=-1)    out = np.matmul(weights, V)    return out, weights  def main():    np.random.seed(42)    batch, seq_len, d_k, d_v = 2, 4, 16, 8    Q = np.random.randn(batch, seq_len, d_k)    K = np.random.randn(batch, seq_len, d_k)    V = np.random.randn(batch, seq_len, d_v)     out, attn = scaled_dot_product_attention(Q, K, V)     print("attn shape:", attn.shape)    print("rows sum to 1:", np.allclose(attn.sum(axis=-1), 1.0))    print("out shape:", out.shape)     raw = np.matmul(Q, K.transpose(0, 2, 1))    raw_var = np.var(raw)    scaled_var = np.var(raw / np.sqrt(d_k))    print("raw var:", round(float(raw_var), 3))    print("scaled var:", round(float(scaled_var), 3))  if __name__ == "__main__":    main()
目的:用 NumPy 从零实现批量缩放点积注意力,并验证 Softmax 权重归一化与缩放因子的方差控制效果。
  1. d_k = Q.shape[-1]取出键向量的最后一维,作为缩放系数的分母来源。
  2. scores = np.matmul(Q, K.transpose(0, 2, 1)) / np.sqrt(d_k)批量计算所有查询和键的点积,并完成缩放。
  3. scores = np.where(mask, scores, -1e9)对被禁止 attend 的位置填入极大负数,使 Softmax 后权重趋近 0。
  4. weights = softmax(scores, axis=-1)在最后一个维度上做归一化,让每行权重之和为 1。
  5. out = np.matmul(weights, V)用注意力权重对 Value 做加权求和,得到最终输出。
  6. np.allclose(attn.sum(axis=-1), 1.0)验证注意力权重行和确实等于 1,符合概率分布定义。

常见误区

误区初学者常觉得除以 \(\sqrt{d_k}\) 不过是个常数缩放,删掉后注意力权重大概也差不多,所以可有可无。

正解缩放是 Softmax 的温度调节。不缩放时,点积分数的方差随维度 \(d_k\) 增大,Softmax 的输入很容易进入指数函数两侧的饱和区,输出接近 one-hot,梯度趋近于 0,模型难以训练。它直接关系到训练稳定性,不是可有可无的装饰。

为何常见:单看公式会觉得除法只是改变数值大小,没有意识到 Softmax 对输入尺度极其敏感。

误区看到注意力图里同一个输入同时连到 Q、K、V 三条线,就以为 Query、Key、Value 就是原始 embedding。

正解在 Transformer 中,输入 embedding 要分别乘上三个不同的可学习投影矩阵,才能得到 Q、K、V。这三个矩阵让模型把同一份信息转换成“问题、标签、内容”三种不同视角,是注意力机制的重要参数来源。

为何常见:很多简化示意图省略了线性投影层,导致读者误以为 Q/K/V 没有额外参数。

误区以为分数高就一定能获得高权重,完全忽略了 Softmax 的作用。

正解Softmax 做的是“同一行内部的竞争”。权重取决于该分数与同行的其他分数之间的相对大小。如果所有分数都很高,单个高分对应的权重也不一定大。真正决定注意力的是归一化后的相对比例,而不是绝对数值。

为何常见:人们容易把“相似度”和“概率”混为一谈,忘了归一化这一步。

误区既然 Transformer 用了缩放点积注意力,那加性注意力一定在效果上更差。

正解两者在多种任务上的精度常常相当。缩放点积注意力胜在计算高效:矩阵乘法可以深度优化,常数因子更小,内存访问更友好。加性注意力虽然多了一个小型网络,理论上表达能力并不明显弱,但工程代价更高。

为何常见:把“工程上胜出”误当成“数学上绝对更优”,忽略了效率也是模型设计的关键指标。

误区想阻止某个位置被 attend,就直接把它在分数矩阵里设为 0,认为 0 就代表“没有注意力”。

正解Softmax 会对输入做指数运算,0 的指数是 1,所以填 0 的位置仍然会参与竞争。正确做法是填入 \(-\infty\),或者用一个极大的负数如 -1e9,这样指数结果趋近 0,Softmax 后权重才真正为 0。

为何常见:从普通编程直觉看,“不允许”就是“置零”,但忽略了 Softmax 的指数归一化机制。

面试题

Q1. 在缩放点积注意力中,Q 与 K 点积得到的矩阵,含义是什么?

单选题 · easy

  • A.每个查询和每个键的相似度分数← 正确答案
  • B.每个查询与每个值的拼接结果
  • C.每个键和每个值的线性组合
  • D.每个位置的位置编码差值

答案:A。Q 和 K 做点积是为了给“查询”和“键”的每一对组合打分,分数越高代表越相关。该矩阵形状为 \(n \times n\),并不是值之间的组合,也不是位置编码的差值。

Q2. 注意力公式里除以 \(\sqrt{d_k}\) 最主要的目的是?

单选题 · easy

  • A.让 Softmax 输入方差保持稳定← 正确答案
  • B.减少矩阵乘法的参数数目
  • C.把 Key 维度变为 Value 维度
  • D.让所有注意力权重之和等于 1

答案:A。点积分数的方差会随维度 \(d_k\) 线性增长,除以 \(\sqrt{d_k}\) 可以把方差拉回 1,避免 Softmax 饱和和梯度消失。它不改变参数数量,也不承担 Softmax 的归一化功能。

Q3. 当 \(d_k\) 很大而忘记缩放,直接对点积结果做 Softmax,常见后果是?

单选题 · mid

  • A.权重分布更平滑,训练加速
  • B.Softmax 输出趋于 one-hot,梯度变小← 正确答案
  • C.输出向量的维度自动翻倍
  • D.注意力权重和会大于 1

答案:B。点积数值随维度增大后,Softmax 输入绝对值偏大,指数函数进入饱和区,输出接近 one-hot。概率分布太尖锐会让非最大位置的梯度极小,模型难以继续学习。

Q4. 下面哪个公式是缩放点积注意力的标准形式?

单选题 · mid

  • A.\(\mathrm{softmax}(QK^{\top}/\sqrt{d_k})V\)← 正确答案
  • B.\(\mathrm{softmax}(QV^{\top}/\sqrt{d_k})K\)
  • C.\(\mathrm{sigmoid}(QK^{\top}/\sqrt{d_k})V\)
  • D.\(\mathrm{softmax}(Q^{\top}K/\sqrt{d_k})V\)

答案:A。标准公式中,Q 和 K 先做转置点积,再缩放,用 Softmax 归一化,最后乘 V。Key 和 Value 的位置不能互换,且归一化函数是 Softmax 而不是 Sigmoid。

Q5. 在实现时,对不允许被 attend 的位置通常用什么值填充?

单选题 · mid

  • A.填入 0
  • B.填入 1
  • C.填入 -inf← 正确答案
  • D.填入均值

答案:C。Softmax 会将 0 变成 \(e^0=1\),仍然参与竞争。只有填入 \(-\infty\) 或极大的负数,指数结果才趋近 0,从而让该位置的注意力权重真正为 0。

Q6. 加性注意力相比缩放点积注意力的主要劣势是?

单选题 · hard

  • A.额外全连接与 tanh,矩阵乘难优化← 正确答案
  • B.序列长度和特征维度必须严格相等
  • C.无法建模词与词之间的语义相关性
  • D.只能处理定长句子,不能处理变长

答案:A。加性注意力需要额外的全连接层和 tanh 激活,计算常数更大,也不像纯矩阵乘那样容易在 GPU 上高度优化。它仍然能建模语义相关性,也能处理变长序列,复杂度同样是 \(O(n^2 d_k)\)。

Q7. 缩放点积注意力包含哪些关键步骤?

多选题 · mid

  • A.Q 与 K 做点积得到得分矩阵← 正确答案
  • B.得分除以根号 dk 进行缩放← 正确答案
  • C.用 Softmax 对得分做归一化← 正确答案
  • D.对 V 做逐元素卷积生成输出

答案:ABC。标准流程是“QK 点积 → 除以 \(\sqrt{d_k}\) → Softmax → 对 V 加权求和”。加权求和不是卷积,因此 D 错误。A、B、C 共同构成缩放点积注意力的核心步骤。

Q8. 关于缩放系数 \(1/\sqrt{d_k}\),下列说法正确的是?

多选题 · hard

  • A.可看成 Softmax 的温度调节← 正确答案
  • B.能降低点积随维度增长的方差← 正确答案
  • C.会让所有注意力权重总和变成 1
  • D.能减少模型参数总量

答案:AB。缩放系数相当于温度参数,控制分布的尖锐程度;它把点积方差从 \(d_k\) 拉回 1。注意力权重总和变成 1 是 Softmax 的功能,参数总量也不会因此减少。

Q9. Q 和 K 的维度必须满足什么关系才能做点积?

单选题 · mid

  • A.最后一维必须相等← 正确答案
  • B.第一维必须相等
  • C.必须都是二维矩阵
  • D.维度可以任意不同

答案:A。矩阵乘法要求前一个矩阵的最后一维等于后一个矩阵的倒数第二维。在注意力公式中,Q 的最后一维 \(d_k\) 必须和 K 转置后的维度匹配,否则无法计算点积。

Q10. 用矩阵乘法实现缩放点积注意力的优势有哪些?

多选题 · hard

  • A.所有位置可同时计算,适合 GPU 并行← 正确答案
  • B.前向和反向都可复用矩阵乘算子← 正确答案
  • C.能从根本上把复杂度降到 O(n)
  • D.不需要存储中间得分矩阵

答案:AB。矩阵乘让所有 token 位置并行参与计算,并且 PyTorch、TensorFlow 和 GPU Kernel 都对矩阵乘做了深度优化,前向反向都能复用。注意力复杂度仍然是 \(O(n^2 d_k)\),且通常需要存储或分块计算中间分数矩阵,因此 C、D 错误。