标签:注意力机制
-
MLA 多头潜在注意力拆解:DeepSeek 压缩 KV cache 的做法
GQA 共享 K/V 头还留着"每头一份缓存"的底账,MLA 干脆把每层的 K/V 压成一个 d_c=512 维的潜向量,推理时缓存只存它。这篇拆解 DeepSeek-V2/V3 的投影设计、低秩吸收的等效改写,以及为什么要给 RoPE 单独留一条位置通道。
-
GQA 与 MQA:共享 KV 的性价比
自回归解码的显存大头是 KV cache,而 Q 头数远多于内容需要。MQA 让一个 KV 头服务所有 Q 头,GQA 取中间值——这篇推导 cache 字节的账本,解释为什么 decode 阶段 KV 头数几乎只影响吞吐不影响质量,以及 Llama-2-70B 为什么选 8 个 KV 头。
-
attention sink 现象:softmax 逼出来的"垃圾桶"token
把 softmax 的权重可视化,大量质量永远堆在序列最前面的几个 token 上——即使它们语义上毫无用处。这不是模型的 bug,而是 softmax"权重必须和为 1"的结构性产物。这篇从归一化约束推出 sink 的必然性,讲 StreamingLLM 怎么利用它,以及 ViT 里的对应现象。
-
注意力复杂度 O(n²d) 的账本:计算与显存各自卡在哪里
注意力的 n² 到底花在哪些矩阵乘上、显存的 n² 又花在哪里、什么时候注意力会超过 FFN 成为主导开销。这篇把 FLOPs、显存、带宽三笔账分开算清。
-
缩放点积的 1/√d:方差视角的推导
为什么注意力打分要除以 √d?因为 q·k 的方差恰好随 d 线性增长,logits 尺度膨胀会让 softmax 饱和、梯度消失。这篇用方差推导给出这个常数的来源,并讨论为什么不是 1/d。
-
FlashAttention-2/3 的改进点:把 IO 收益榨干
FA-1 证明了少搬数据就能赢,FA-2 把循环次序和非矩阵乘开销一起砍掉,FA-3 则吃满 H100 的 TMA 与异步流水线。这篇按"还有多少油水"的顺序拆解三代各自改了什么、为什么。
-
注意力机制三问:Q、K、V 各自扮演什么角色
从检索类比出发,讲清 Q/K/V 三分法的数学实质:匹配和内容分离、为什么需要三个不同的投影矩阵,以及自注意力与 cross attention 的差别。
-
稀疏注意力谱系:从 Longformer 到 BigBird
把注意力矩阵的大部分位置置零就能压复杂度,但随便置零会把表达能力一起丢掉。BigBird 给出关键结果:窗口 + 全局 + 少量随机边的稀疏图,保持全连接的图论性质(常数直径、良好扩展性),稀疏注意力因此仍是序列 universal 函数逼近器。这篇梳理谱系并推导这个结果。
-
PyTorch 实现 multi-head attention 逐行讲解
用 nn.Module 手写一个 multi-head attention,每行标注 shape 变化,讲清 fused QKV 投影、head 维折叠、scaled_dot_product_attention 的三种后端选择,以及和 nn.MultiheadAttention 的对应关系。
-
位置编码与注意力分辨率的极限
位置编码给每个距离分配的「区分度」是有预算的:RoPE 的相位导数随频率线性衰减,超出一定距离后相邻距离在 logits 上不可分辨。这篇算这笔分辨率账。
-
相对位置编码谱系:Shaw 到 T5 bias
在 RoPE 成为标配之前,相对位置编码走过一条"把偏移量直接塞进注意力"的路线:Shaw 给 key 加偏移向量,Transformer-XL 拆成四项,T5 干脆在 logits 上加一张标量偏置表。这篇按时间推一遍它们的数学形式、各自的动机,以及为什么这条路线最终让位给乘性方案。
-
注意力矩阵的秩与表达能力
softmax 前的打分矩阵 S=QKᵀ/√d 秩不超过 d,softmax 后的 P 却满秩但谱集中——"低秩瓶颈"到底卡在哪。这篇分清两个秩的层次,并说明线性注意力路线如何从秩的视角绕开 O(n²)。
-
线性注意力:用核函数视角把 O(n²) 降到 O(n)
softmax(q·k) 是点积上的指数核,换成可分解的特征映射 φ,就能用矩阵乘法结合律把 (QKᵀ)V 改写成 Q(KᵀV),O(n²) 直接降为 O(n)。这篇推导改写过程、盘点常用 φ 的取舍,并说明递归形式与表达能力代价。
-
注意力权重的熵动力学:什么时候广撒网、什么时候单点突破
注意力每一行是一个概率分布,熵是它的"混合程度"度量。这篇定义行熵、给出它与 logit 尺度的解析关系,梳理熵在层间和序列上的典型动力学,并连接到 RL 微调里的熵坍塌问题。
-
注意力机制的分步反向传播:Q/K/V 的梯度如何穿过 softmax 回传
把 scaled dot-product attention 拆成 S=QKᵀ、P=softmax(S)、O=PV 三段,逐段推 VJP,给出 dQ、dK、dV 的闭式,并解释 causal mask 与 FlashAttention 反向的处理。
-
ALiBi:线性偏置的极简方案
ALiBi 不给每个位置生成向量,只在注意力 logits 上减一个与距离成正比的偏置:score(i,j) = q·k/√d − s·|i−j|。零位置参数、逐头分配斜率、外推免费。这篇推它的形式、为什么线性函数比查表更适配外推,以及它和 RoPE 的加性/乘性分野。
-
正弦位置编码的原始设计与性质
Transformer 原论文的位置编码 PE(pos,2i)=sin(pos/10000^{2i/d}) 不是拍脑袋:多尺度波长覆盖从局部到全局的相对距离,且 PE(pos+k) 可以写成 PE(pos) 的线性变换——相对位置信息对注意力天然可及。这篇推这两个性质的代数来源,以及它为什么后来被认为不够。
-
-
自注意力的矩阵化:从两两点积到一次矩阵乘
自注意力概念的原始形态是"每个词看所有词"的双重循环,把它写成 QKᵀ 一个矩阵乘是 Transformer 能落地的关键一步。这篇对比两种写法,讲清矩阵化带来的复杂度与硬件红利。
-
RoPE 外推的高频失效分析
直接外推 RoPE 时注意力打分变成 Σ|q||k|cos(Δθᵢ+φ) 的无约束组合:波长 ≳L 的维度相位从未见过、贡献系统性错误,波长远大于 L 的维度相对距离信息丢失。这篇把"哪里先坏"拆到单维度层面,这也是 NTK/YaRN 只压低频的理论根据。
-
从零手写注意力:60 行 NumPy 跑通自注意力
抛开框架,用 NumPy 把自注意力、因果掩码、多头重组逐个写出来并和 PyTorch 对拍。每段代码都标注 shape 变化和对应的概念——写完一遍,注意力就从"听说过"变成"见过每一步的形状"。
-
滑动窗口注意力与全局 token
语言的局部性让注意力矩阵天然带状化:只算窗口内的交互就把复杂度压到 O(n·w)。但纯窗口丢掉全局信息,Longformer 的答案是少数"全局 token"——这篇推导窗口注意力的复杂度账,讲清全局 token 怎么补全局性,以及它给系统实现留下的麻烦。
-
FlashAttention 原理:分块与在线 softmax
注意力的瓶颈不是 FLOPs 而是 HBM 访存。这篇从 IO 复杂度推出 FlashAttention 的分块设计,推导在线 softmax 的重缩放公式,并说明反向传播为什么要重算而不是存中间矩阵。
-
causal mask 的实现与梯度流:下三角掩码如何阻断信息泄漏
decoder-only 模型的因果掩码到底怎么实现、为什么反向时不需要额外处理、masked 位置的训练动力学是什么。这篇把 addmask、masked_fill、is_causal 三种写法对齐到同一个数学对象,并给出梯度流的完整分析。
-
多头注意力:多头真的学到不同模式吗
把 d 维表示切成 h 个子空间并行做注意力,参数没省、FLOPs 没省,多头的设计动机是什么?这篇从低秩分解与表示多样性的角度分析,并整理实证上观察到的头分工。
-
cross attention 与 encoder-decoder 之争
Transformer 原典是 encoder-decoder 加 cross attention 的双塔结构,GPT 范式却让 decoder-only 统一了江湖。这场更替不是 cross attention 本身输了,而是"两套参数两种预训练目标"的结构性成本输给了规模——这篇按时间线梳理争论的证据。