目录
-
- 前言
-
-
- [1、手推自注意力机制公式,为什么要除以 d k \sqrt{d_k} dk ?](#1、手推自注意力机制公式,为什么要除以 d k \sqrt{d_k} dk ?)
- 2、多头注意力的核心意义是什么?单头注意力不行吗?
- [3、LayerNorm 、RMSNorm和 BatchNorm 的区别,为什么大模型只用 RMSNorm?](#3、LayerNorm 、RMSNorm和 BatchNorm 的区别,为什么大模型只用 RMSNorm?)
- [1. 三者最本质的区别](#1. 三者最本质的区别)
-
前言
整理一些常见八股问题,用于面试复习。
1、手推自注意力机制公式,为什么要除以 d k \sqrt{d_k} dk ?
因为 点积的数值会随着向量维度 (d_k) 增大而变大 ,如果不除以 d k \sqrt{d_k} dk ,softmax
很容易进入"过于尖锐"的区域,导致训练不稳定、梯度变小。
直观来说,Attention 里会先算:
Q K T QK^T QKT
其中每个 query 和 key 做点积。假设 (q) 和 (k) 的各维分量都是均值为 0、方差为 1 的随机变量,那么它们的点积
q ⋅ k = ∑ i = 1 d k q i k i q \cdot k = \sum_{i=1}^{d_k} q_i k_i q⋅k=i=1∑dkqiki
是 (d_k) 项的和。由于每一项的方差大致是 1,所以这个点积的方差大约会随着 (d_k) 增长到:
V a r ( q ⋅ k ) ≈ d k \mathrm{Var}(q \cdot k) \approx d_k Var(q⋅k)≈dk
这意味着点积的典型大小会是 d k \sqrt{d_k} dk 量级。维度越高,分数越大。
而 softmax 对输入数值大小非常敏感。比如一个 logits 向量如果数值很大,softmax 就会变得非常极端,接近
one-hot:某一个位置概率接近 1,其他位置接近 0。这样会带来两个问题:
- 梯度很小,训练变慢;
- 注意力分布过于尖锐,模型早期不稳定,难以学习合理的权重。
所以用
Q K T d k \frac{QK^T}{\sqrt{d_k}} dk QKT
就是为了把点积的尺度拉回一个更稳定的范围,让它的方差大致保持在 1 附近,从而避免 softmax 饱和。
2、多头注意力的核心意义是什么?单头注意力不行吗?
多头注意力的核心意义,是把一次注意力计算拆成 多个并行的"视角" 去看同一段输入:每个头都会先对 (Q,K,V) 做不同的线性投影,再各自独立算 attention,最后把这些结果拼接起来。Transformer 原论文给出的动机很直接:多头注意力让模型能够在不同位置、不同表示子空间上"联合关注"信息 ;而如果只用单头,容易把这些信息"平均掉"。
单头不是"不行",而是 表达能力更受限 。单头注意力本质上只有一张注意力分布图,它在某一时刻往往只能突出一种主要关系,比如"主谓关系"或者"代词指代"。但真实语言里,一个 token 往往同时和多个对象有关:既可能要看语法依赖,又可能要看长距离语义,还可能要看位置或实体边界。多头的好处,就是让不同头分别学到不同模式;原论文中明确写到,单头时"averaging inhibits this(平均化会抑制这种能力)"。
可以把它想成"一个人看图"和"一个小组分工看图"的区别。单头像一个人只能给出一份总的关注结果;多头像几个人分别盯不同方面:有人看局部搭配,有人看远距离依赖,有人看句法结构,最后把这些观察汇总。
3、LayerNorm 、RMSNorm和 BatchNorm 的区别,为什么大模型只用 RMSNorm?
可以把它们先抓住一句话:
- BatchNorm :按 一个 batch 来归一化
- LayerNorm :按 单个样本的一层特征 来归一化
- RMSNorm :像 LayerNorm,但不减均值,只按均方根缩放
1. 三者最本质的区别
BatchNorm
BatchNorm 对每个特征维度,统计 一个 mini-batch 里 的均值和方差,再做标准化。原始定义核心是:
x ^ = x − μ batch σ batch 2 + ϵ \hat{x}=\frac{x-\mu_{\text{batch}}}{\sqrt{\sigma^2_{\text{batch}}+\epsilon}} x^=σbatch2+ϵ x−μbatch
它依赖 batch 里的其他样本,训练时和推理时还不完全一样:训练用当前 batch统计量,推理通常用滑动平均统计量。BatchNorm 在 CNN 里很成功,但它的效果明显依赖 batch size。
LayerNorm
LayerNorm 不看别的样本,只看 当前这一个样本内部
的隐藏维度,对这一层的特征求均值和方差,再归一化。它对训练和推理做的是同一种计算,而且特别适合 RNN / Transformer
这种序列模型。LayerNorm 论文明确强调:它不像 BatchNorm 那样依赖mini-batch,并且更容易用于循环网络。
RMSNorm
RMSNorm 是在 LayerNorm 基础上的"简化版"。它不做中心化(不减均值),只做缩放:
R M S ( x ) = 1 n ∑ i x i 2 x ^ = x R M S ( x ) + ϵ \mathrm{RMS}(x)=\sqrt{\frac{1}{n}\sum_i x_i^2} \qquad \hat{x}=\frac{x}{\mathrm{RMS}(x)+\epsilon} RMS(x)=n1i∑xi2 x^=RMS(x)+ϵx
也就是说:
- LayerNorm:减均值,再除标准差
- RMSNorm:直接除均方根
RMSNorm 论文的核心观点就是:LayerNorm 里的 re-centering(重新居中) 可能不是必须的,而保留re-scaling(重新缩放) 已经足够稳定训练,并且更省计算。
4、RoPE 位置编码的原理,相比绝对/相对位置编码好在哪?
视频理解:旋转位置编码RoPE的简单理解
RoPE(Rotary Position Embedding,旋转位置编码)的核心思路是:不再把"位置向量"直接加到 token
embedding 上,而是按位置对 (Q) 和 (K) 做旋转 。这样一来,attention 分数里会自然出现"相对位置差"(m-n),也就是两个 token 之间隔了多远。RoFormer 原论文明确指出,RoPE 是"用旋转矩阵编码绝对位置,同时在
self-attention 公式中自然引入显式相对位置依赖"。([arXiv][1])
你可以先把它想成二维平面上的旋转。假设一个二维向量是 ( x 1 , x 2 ) (x_1,x_2) (x1,x2),位置 (m) 对应一个角度
θ m \theta_m θm,那就把这个向量旋转 θ m \theta_m θm。RoPE在高维里做的其实就是这件事的并行版本:把隐藏维度两两分组,每一对维度都像复数平面上的一个点,按该位置对应的角度做旋转。Hugging
Face 的文档也是这么概括的:RoPE 不是加一个显式位置向量,而是"根据位置在复平面中旋转 query 和
key,从而具备相对位置感知能力"。
为什么这很妙?因为 attention 里真正参与打分的是 q m ⊤ k n q_m^\top k_n qm⊤kn。如果 q q q 和 k k k都分别按位置 m m m 和
n n n旋转,那么它们点积后的结果会依赖于角度差 ,也就是 θ m − θ n \theta_m-\theta_n θm−θn,本质上对应相对位置
m − n m-n m−n。这就是 RoPE 最关键的地方:表面上是把绝对位置编码进了向量,结果在注意力分数里体现出来的是相对位置关系。RoFormer 论文把这点当作它最核心的理论性质之一。
拿它和"绝对位置编码"比,最典型的绝对位置编码就是 Transformer 原论文里的 sinusoidal positional
encoding:给每个位置一个固定的正弦/余弦向量,然后加到输入 embedding 上 。这种做法能告诉模型"这是第 5
个词""这是第 20 个词",但 attention 里两个位置之间的相对关系不是直接内建进去的,模型要自己去学"第 20 个和第 5
个相差 15"。Transformer 原论文采用了这种绝对位置编码方案。
而"相对位置编码"这一路,典型代表是 Shaw 等人在 2018 年的工作:他们直接在 self-attention
里额外加入相对距离表示,让模型更直接地知道 token
间距离,并且在机器翻译任务上优于绝对位置表示。也就是说,研究界后来越来越意识到:很多语言关系其实更依赖相对位置,而不是绝对位置。
RoPE 相比绝对位置编码,优势主要有三点。
第一,更自然地把相对位置信息融进 attention 打分 。绝对位置编码是"先加进去,再让模型自己学怎么用";RoPE
是"直接让打分公式对相对位置敏感"。这通常更符合注意力机制本身的需求,因为注意力关心的正是"当前位置该看谁、离我多远"。RoFormer
论文明确强调它能"在 self-attention 中自然引入显式相对位置依赖"。
第二,对更长序列往往更友好,外推性更好 。绝对位置 embedding
尤其是可学习的位置表,通常受训练时最大长度限制;超出长度要么没法直接用,要么效果变差。RoPE
不需要一张固定长度的位置表,而是用旋转规则按位置生成,因此在实现上更容易扩展到更长上下文。Hugging Face 文档和 Llama
文档都明确把 RoPE 与"更好处理更长序列"联系起来。
第三,实现简洁、参数开销小,而且已经被现代 LLM 大量采用 。RoPE 不需要为每个位置学习一个独立向量,本质上只是对 (Q,K)
做确定性的旋转变换,因此额外参数少,和标准 attention 结合也很直接。Hugging Face 在 Llama
文档中明确写到,Llama 用 RoPE 取代了绝对位置 embedding,以更好处理长序列;其博客也提到 RoPE 已被"多数现代
Transformer"采用。
当然,RoPE 也不是"完美碾压一切"。和一些专门设计的相对位置偏置方法相比,它的归纳偏置更柔和;而且当上下文长度远远超过训练范围时,原始
RoPE 仍可能退化,所以后来社区又发展出了多种 RoPE 变体和缩放方案。Hugging Face 的 RoPE 工具文档就专门列出了多种
RoPE 类型与配置,用来改善长上下文行为。
你可以最后记成一句话:
绝对位置编码 :告诉模型"我在第几个位置";
相对位置编码 :告诉模型"我和你隔多远";
RoPE:用"旋转"把绝对位置编码进 (Q,K),但让 attention 分数天然对"相对距离"敏感,所以兼顾了实现简洁、相对位置感知和较好的长上下文扩展性。