注意力矩阵 $P$ 的每一行 $p_i$ 是概率分布:非负、和为 1。概率分布有个天然的"形状"度量——熵 $H(p_i)=-\sum_j p_{ij}\log p_{ij}$。熵高,注意力在广撒网,输出是多个 value 的平均;熵低,注意力单点突破,输出基本复制某一个 value。这个标量比肉眼盯热力图可靠得多,这篇把它的解析性质和实测行为整理出来。
解析起点:熵由 logits 的离散程度决定
softmax 的行分布由 logits $s_i\in\mathbb{R}^n$(已含 $1/\sqrt d$ 缩放)决定,行熵是 $s_i$ 的 Schur-concave 函数:logits 越分散,分布越尖,熵越低。极限情形有两个锚点:所有 logits 相等时 $p$ 是均匀分布,熵取最大值 $\log n$($n$ 是 key 个数);一个 logit 领先其他几十个标准差时 $p$ 逼近 one-hot,熵趋于 0。
中间地带的定量感觉是温度给出的:把 logits 写成 $s/\tau$,$\tau\to\infty$ 时 $p$ 均匀、$H\to\log n$;$\tau\to 0$ 时 one-hot、$H\to 0$。缩放点积里的 $1/\sqrt d$ 就是一个初始温度设定(第 4020 篇推过方差账),模型训练中真正在学的是"每个位置的 logits 该有多分散",行熵是这个学习结果的直接读数。
一个有用的分解:把行熵写成
$$ H(p_i) = \log Z_i - \langle s_i, p_i\rangle,\qquad Z_i=\sum_j e^{s_{ij}}, $$
即"配分函数的对数减去平均 logit"。这个式子把熵和 logsumexp 统计量直接挂钩——FlashAttention 恰好缓存的就是每行 $\log Z_i$(反向那篇出现过),所以行熵可以从缓存的统计量离线重建,不需要额外存 $P$。
层间动力学:从钝到尖的粗线条
对预训练 Transformer 逐层统计平均行熵,能观察到一个相当稳定的粗线条(GPT-2/BERT 系论文的共识):浅层熵偏高、深层熵偏低,且层间方差逐渐拉大。
- 浅层(1~3 层)的行分布往往接近均匀或只有轻度集中。这些层的注意力大量是位置性的(投向前一个 token、句首),匹配信号弱,softmax 输出天然平。
- 中层(约占一半深度)熵下降最快,句法头、指代头在这附近定型——模型此时学会了"该看哪个"的判别模式。
- 深层熵的分布变成双峰:一部分头高度尖锐(检索型,指代消解、复制黏贴),一部分保持高熵(聚合型,收集全局上下文供 logits 用)。attention sink(大量权重给第一个 token)会把行熵的账记乱——sink 权重 $p_{i,\text{sink}}$ 常达 0.3~0.8,剩余质量在其余 key 上重新分配,单独剔除 sink 再算熵才能看到"有效检索"的真实混合度。
序列位置动力学:前缀越长越尖
同一个头在同一层内,行熵随 query 位置 $i$ 系统性下降。原因部分来自 causal mask 的约束:位置 $i$ 只能看 $j\le i$,候选集随 $i$ 线性增多,但模型对远距离 key 的 logit 往往更分散(位置编码的远距离衰减),一增一减之后净效应是局部位置的注意力更尖。解码阶段的实际后果:越往后生成,每步的信息来源越集中在少数几个位置上——这对 KV cache 压缩(StreamingLLM 类方法)是个好消息,因为"反正远处也被看得少"。
与 RL 微调的熵坍塌同构
语言模型 RL 微调(对齐篇会详推)里有个著名问题:策略熵随训练骤降,模型输出趋于确定性,多样性死亡。注意力的行熵动力学是它的结构性预演——softmax 分布的熵对 logit 尺度高度敏感,而梯度下降天然偏好"把置信的选择推得更自信"(降低损失的方向就是放大已选中项的 logit)。RL 阶段没有预训练那么大的数据噪声兜底,这个自我强化的尖化过程失控,就是熵坍塌。两处的处方也同构:对 logit 尺度加约束(温度下限、logit 惩罚)、或对熵本身加奖励。熵作为诊断量,从注意力分析到 RL 训练监控是同一把尺子。
小结
行熵把注意力的"混合程度"变成一个可监控的标量:解析上由 logits 离散度决定,与 logsumexp 统计量同账本;实测上呈浅层高熵、深层尖化且双峰、序列后段更尖的粗线条。它和 RL 微调熵坍塌共享同一个 softmax 结构根源——梯度偏好把已有置信推得更自信。用法上:训模型时把逐层平均行熵画进监控面板,异常尖化(熵骤降)往往先于 loss 异常出现。