音乐
暂未播放
信息论基础:熵、交叉熵与 KL 散度——LLM 推理中无处不在的数学

背景:为什么做推理的人也要懂信息论#
翻开任何一篇 LLM 论文,都会撞见一堆和”信息”有关的词:perplexity(困惑度)、cross-entropy loss(交叉熵损失)、KL divergence(KL 散度)、bits per token(每 token 比特数)、temperature(温度)。它们看起来是几个互不相干的技术名词,其实背后是同一套数学——信息论(information theory),由克劳德·香农(Claude Shannon)在 1948 年发表的《通信的数学理论》(A Mathematical Theory of Communication)中创立。这篇文章快 80 岁了,但它定义的几个量至今仍是语言模型的训练目标、评估指标和部署工具的核心。
对 LLM 推理优化、部署与量化这类工作来说,信息论不是”以后可能用得上”,而是现在就嵌在日常打交道的每样东西里:
- 评估量化模型:llama.cpp 用 perplexity 工具对比量化前后模型的质量,还能输出量化前后 logits 分布的 KL 散度;TensorRT 的 INT8 校准本身就是最小化 KL 散度的过程;
- 投机解码:DSpark、DFlash 这类框架的接受率,数学上直接由草稿分布与目标分布的”接近程度”决定,而”接近程度”的度量就是 KL 散度家族的成员;
- 采样:temperature 到底在调什么?它在调分布熵;
- 压缩视角:语言建模与无损压缩是同一件事的两面,困惑度可以直接换算成压缩率。
这篇文章从概率论的基本概念出发(随机变量、期望、分布),把信息论这套”度量惊讶程度”的语言完整推导一遍,每讲一个概念都立刻落到 LLM 推理中的具体用途上。读完不仅能看懂论文里的 PPL 表格,还能自己解释”为什么投机解码接受率高就快”这类问题。
自信息(self-information):一事件的信息量为什么是 −logp#
从”惊讶程度”出发#
信息论的一切都从一个问题开始:一个事件的发生,携带了多少信息?
直觉上,答案和事件的概率有关:
- 明天太阳从东边升起——概率几乎是 1 的事件,它的发生毫无悬念,携带的信息量约等于 0;
- 一枚均匀硬币掷出正面——概率 1/2,得到 1 个 bit 的信息;
- 彩票中大奖——概率千万分之一,它的发生携带了巨大的信息量(所以新闻里全是它)。
所以”信息量”本质上是”惊讶程度”(surprisal):事件越不可能,发生时越惊讶,携带的信息越多。
假设用 I(p) 表示”概率为 p 的事件发生时的信息量”,香农要求它满足三条看起来非常自然、也和日常直觉一致的性质:
- 非负:I(p)≥0,事件不可能”负惊讶”;
- 单调:p 越小,I(p) 越大;
- 可加:两个独立事件同时发生(概率 pq)的信息量等于各自信息量之和,I(pq)=I(p)+I(q)。这一点很关键——同时听到”掷硬币正面”和”掷骰子 6 点”,收获的信息应该等于两件事各自的信息之和。
第二条和第三条一起,加上 I 是连续函数,就能把 I(p) 的形式完全定死。第三条说 I 把乘法变成加法,即 I 是一个把 (0,1](概率)映到 [0,∞) 的连续函数且满足 I(pq)=I(p)+I(q)。令 f(x)=I(e−x),则 f(x+y)=f(x)+f(y),连续的解只有 f(x)=cx,于是
I(p)=−clogp比例常数 c 只决定单位:取 c=1 时用自然对数,单位叫奈特(nat);取 c=1/ln2、即底数为 2 时,单位叫比特(bit)。比特是信息论默认单位:一个概率 1/2 的事件携带 I(1/2)=log22=1 比特,正好对应”一个二进制位”。
另一个视角:最优编码的长度#
“惊讶程度”是心理视角,信息论还有一个更硬的视角——编码长度。
假设要把一条消息的每个符号压缩成二进制码字再传输:总共有 N 种符号,如果给每个符号分配等长的码字,需要 log2N 位。但如果符号出现的概率不同,显然应该给高频符号分配短码字、低频符号分配长码字——这正是摩尔斯电码的做法(常用字母 e 是单点,罕见的 q 是一长串)。
那么给概率为 p 的符号分配多长的码字最合适?直观上,如果每个符号码长 L(x),那么 2L(x) 个码字能编码 2L(x) 种情况,而”出现概率 p 的符号应该用掉码空间中占比 p 的那部分”,于是
L(x)≈log2p(x)1也就是说,概率为 p 的事件,最优码长就是 −log2p 比特。这个”编码长度”解释和”惊讶程度”解释殊途同归——所以”信息量 = −logp“不是拍脑袋定义的,而是”码长必须与概率匹配”这一要求逼出来的。
与 LLM 的第一个联系:损失函数就是平均惊讶度#
一个自回归语言模型在每个位置做的事,就是输出一个概率分布 q(⋅∣x<t):预测下一个 token 的概率。真实数据给出真实的下一个 token xt,模型给它的概率是 q(xt),那么模型对这一事件的惊讶程度就是 −logq(xt)——它低估真实 token(给的概率小)时惊讶值大,高估时惊讶值小。训练时最小化的东西正是这个惊讶度的平均。所以下一篇要讲的交叉熵,本质上就是”平均惊讶度”。
熵:一个分布的平均信息量#
定义与第一个例子#
单个事件的信息量是 −logp,那么一个分布的平均信息量就是把每个事件的 −logpi 按概率加权求期望:
H(p)=EX∼p[−logp(X)]=−i∑pilogpi这就是熵(entropy)。注意这里默认对数底为 2,熵的单位是比特;如果论文里的 loss 用自然对数(nats),熵的单位就是奈特。一个”公平硬币”分布的熵:
H=−21log221−21log221=1 bit一个”99% 正面”的偏硬币熵只有约 0.081 比特——几乎每次都是正面,基本没有不确定性,也就不怎么携带信息。均匀六面骰子是 log26≈2.585 比特。均匀分布的范围越大,熵越大:均匀词表大小 V=100,000 时,熵是 log2100,000≈16.6 比特。
Chris Olah 在《Visual Information Theory》里把熵画成了这样一张图——熵就是”以最优码长编码消息时的平均码长”:

图里每一个符号 x 都有一个”概率大小决定的长方块”——码长 log2(1/p(x)),把它们按概率加权相加,就是熵。这张图想表达的直觉是:熵 = 最优无损压缩下每个符号的平均码长(比特)。这是香农源编码定理(source coding theorem)的结论:任何无损压缩方案的平均码长都不可能低于熵,而算术编码(arithmetic coding)/霍夫曼编码(Huffman coding)可以无限逼近这个下界。这个结论非常重要,后面讲”语言模型 = 压缩器”时会用到。
熵的两个性质:范围与为什么均匀分布最大#
熵有两个基本性质:
- 非负,且确定分布(某个 pi=1)的熵为 0——完全没有不确定性;
- 均匀分布熵最大,最大值为 log2N。
性质 2 的证明只需要一条 Jensen 不等式。f(x)=logx 是凹函数,E[f(X)]≤f(E[X]),取 X 为取值 1/pi 的随机变量(概率 pi):
H(p)=i∑pilog2pi1≤log2(i∑pi⋅pi1)=log2N等号当且仅当所有 1/pi 相等,即 pi=1/N 均匀分布。这个结论的直觉是:越”拿不准”,熵越大;什么都不确定时熵达到最大 log2N。
条件熵:知道了一部分,还剩多少不确定性#
如果两个随机变量 X,Y 有关联,知道 Y 通常会降低 X 的不确定性。条件熵(conditional entropy)H(X∣Y) 定义为已知 Y 之后 X 的平均剩余不确定性:
H(X∣Y)=y∑p(y)H(X∣Y=y)=−x,y∑p(x,y)logp(x∣y)这里 p(x∣y) 是条件概率,p(x,y) 是联合分布。由条件概率的乘法规则 p(x,y)=p(x)p(y∣x) 可以推出链式法则(chain rule):
H(X,Y)=H(X)+H(Y∣X)即”联合分布的信息量 = X 自己的信息量 + 知道 X 后 Y 还剩的信息量”。直观上,要编码 (X,Y) 两个变量,可以先编码 X(花 H(X) 比特),再利用 X 的信息编码 Y(只需 H(Y∣X) 比特)。
与 LLM 的联系:模型在”拿不准”的地方熵高#
语言模型在每个位置输出的分布就是一个随时间变化的熵值:
- 在”3 + 4 = ____“后面,几乎所有概率都压在”7”上,分布接近确定,熵接近 0;
- 在”明天的天气是____“后面,分布平坦,熵接近 log2V;
- 在”他走进____“后面,熵介于两者之间——模型”知道大概是人称代词或名词,但不确定具体是哪个”。
生成式 AI 的”随机性”本质上是分布熵的表现:一个模型的采样输出越多样,说明它在那些位置的预测分布熵越高。后面会看到,temperature 这个参数就是直接拧分布熵的旋钮。
交叉熵:用”错误的分布”去编码的代价#
定义:错配码长的期望#
熵假设用正确的分布 p 设计码长(码长 log2(1/pi))。但现实里手里往往是另一个分布——模型的预测分布 q——而真实情况服从 p。
如果码长是按 q 设计的(符号 i 的码长 log2(1/qi)),但消息实际来自 p,那么平均码长是:
H(p,q)=−i∑pilog2qi这就是交叉熵(cross entropy)。注意它和熵 H(p) 的区别:熵里是 logpi,交叉熵里是 logqi,但加权平均用的是 pi。只有当 p=q 时两者相等。
“多出来的那一截”(交叉熵减熵)就是下一节要讲的 KL 散度——下一节讨论 KL 散度时,会把 Olah 的可视化图一并给出,把交叉熵和熵的差画出来。这里先记住一个结论:交叉熵永远大于等于熵,因为用错配的码长方案不会比用最优方案更短。
这个"≥"的结论(Gibbs 不等式)可以由对数不等式严格证明:对任意 x>0 有 −lnx≥1−x(等号当 x=1),取 x=qi/pi 得到 −ln(qi/pi)≥1−qi/pi,乘 pi 求和:
i∑pilnqipi≥i∑(pi−qi)=0左边正是下一节的 KL 散度(自然对数版本)。这个不等式贯穿整个信息论,值得记住。
与 LLM 的联系:交叉熵就是训练损失#
语言模型训练时,真实下一个 token 是确定的 xt,所以真实分布 p 是 one-hot(p 只在 xt 处为 1,其余为 0)。此时交叉熵大幅简化:
H(p,q)=−i∑pilogqi=−logq(xt)只取决于模型给真实 token 的概率。所以:
- “最大化对数似然”和”最小化交叉熵”是同一件事——最小化 −logq(xt) 就是在让模型把真实 token 的概率推高;
- LLM 训练曲线上的 loss 就是每个 token 交叉熵的平均值(用自然对数时单位是 nats/token,可以换算成 bits/token,见困惑度一节);
- 交叉熵对 logits 的梯度形式是 q−p(预测分布减 one-hot 真值),这正是 softmax 交叉熵好用的原因之一——梯度不会因为”真值位置概率接近 1”而消失。
顺带一提:标签平滑(label smoothing)在信息论视角下就是把 one-hot 的 p 换成一个小熵版本——one-hot 的熵是 0,模型被逼到”过度自信”;平滑后目标分布有了一点熵,模型就不必把概率推到 1,泛化更好。
KL 散度:两个分布差多少(以及为什么不对称)#
定义:平均多付的比特数#
从上面的推导可以直接读出:交叉熵减去熵,剩下的就是”因为用错分布而多付的平均码长”,这就是KL 散度(Kullback-Leibler divergence):
DKL(p∥q)=H(p,q)−H(p)=i∑pilog2qipi读作”p 对 q 的 KL 散度”(从 p 到 q),或者”用 q 近似 p 的额外代价”。三个量排在一起的关系式值得刻在脑子里:
H(p,q)=H(p)+DKL(p∥q)交叉熵 = 熵(不可压缩的下界)+ KL(模型错配的代价)。
非负性:KL 散度永远 ≥ 0#
上面 Gibbs 不等式的推导直接给出 DKL(p∥q)≥0,等号当且仅当 p=q。注意这里只用了 lnx≤x−1 这一条凹函数性质,没有任何假设——所以 KL 散度确实是”差异”的合理度量:两个分布一样时为 0,越不一样越大。
不对称性:KL 不是距离,方向很重要#
KL 散度最大的坑是:它不是对称的,DKL(p∥q)=DKL(q∥p)。所以它不能叫”距离”(度量),只能叫”散度”。两个方向差了多远,看 Olah 的对比图最直观:


两张图里,深色块是熵(各自的最优码长),浅色块是交叉熵(错配码长),中间的差就是 KL。可以发现两个方向的”额外高度”明显不同。为什么?
一个极端例子最说明问题。设 p = “99% 正面”的硬币,q = “99% 反面”的硬币:
DKL(p∥q)=0.99log20.010.99+0.01log20.990.01≈6.50 bitDKL(q∥p)=0.99log20.010.99+0.01log20.990.01≈6.50 bit对称的例子居然相等——换个不对称的例子。设 q 是确定分布(q(正)=1),p 是均匀分布(p(正)=p(反)=1/2):
DKL(p∥q)=21log211/2+21log201/2=+∞无穷大。为什么?因为 q 说”反面永远不会发生”(概率 0),而真实世界 p 里反面有一半概率。用 q 的码本去编码真实世界的事件时,反面事件根本无法编码——它分配了 0 个码字。反过来:
DKL(q∥p)=1⋅log21/21+0=1 bit有限。直觉总结成一句话:用”更宽”的分布去近似”更窄”的分布代价小(多花一点点),用”更窄”的分布去近似”更宽”的分布代价可能无穷大(把可能事件判成不可能)。这就是为什么在 RLHF 里要限制”新策略相对于旧策略的 DKL(新∥旧)“而不是反过来——新策略如果给旧策略认为几乎不可能的动作赋予高概率,惩罚必须爆炸式增长。
与 LLM 的联系之一:量化质量评估(llama.cpp 与 TensorRT)#
评估一个量化模型”掉没掉精度”,最常见的做法是拿量化前后模型的 perplexity 比一比(llama.cpp 的 perplexity 工具就是这么用的,跑在 WikiText-2 上)。但 perplexity 只反映”正确 token 的预测概率”这一个数,量化可能让整体分布悄悄变形、而正确 token 的概率没怎么变。llama.cpp 社区有人专门论证过这一点:PPL 作为量化损失指标不够敏感,KL 散度是更好的数据点——因为 KL 直接度量”量化后的概率分布相对 FP16 参考分布变了多少”,而 PPL 只度量”平均而言押对没有”。
llama.cpp 的 perplexity 工具也提供了 --kl-divergence 模式:在同一个提示上记录 FP16 与量化模型的 logits,计算两个 softmax 分布之间的 KL 散度,0 表示分布完全一致。它还会输出”正确 token 概率的平均变化”以及变化百分位数——如果概率变化在正负两个方向对称分布,说明量化只是加了对称噪声;如果负方向(正确 token 概率下降)显著偏多,说明有真实的质量损失。
工业界做 INT8 量化时的校准(calibration)也是同一个数学:TensorRT 的熵校准就是收集 FP32 激活值的直方图作为真实分布 p,然后选一个缩放阈值让 INT8 可表示出的分布 q 与 p 的 KL 散度最小。所以”量化丢了多少信息”这件事,从香农 1948 年就给出了度量工具。
与 LLM 的联系之二:投机解码的接受率#
投机解码(speculative decoding;Leviathan 等人 2023 年发表在 ICML 的《Fast Inference from Transformers via Speculative Decoding》)的数学核心就是两个分布的 KL 关系。流程回顾:小模型(草稿模型)按分布 q 快速自回归生成 γ 个候选 token,大模型(目标模型)并行验证,输出分布是 p。验证时对每个候选 token x,以概率
min(1,q(x)p(x))接受它。
为什么是这个形式?想一下:草稿模型采样到 x 的概率是 q(x),乘以接受概率,x 被”接受并输出”的总概率质量是 q(x)⋅min(1,p(x)/q(x))=min(p(x),q(x))。对所有 token 求和,得到平均接受率:
α=x∑min(p(x),q(x))=1−21x∑∣p(x)−q(x)∣最后一个等号是恒等式:∑min(p,q)=21(∑p+∑q−∑∣p−q∣)=1−21∥p−q∥1,其中 ∥p−q∥1 是 L1 范数(也叫总变差距离,total variation distance)。所以:
- 如果 p=q(草稿分布完全等于目标分布),接受率 α=1,所有候选全被接受——投机解码退化成”直接快速生成”;
- 如果 q 是 one-hot 贪婪(只押 argmax),接受率退化为 α=p(x∗)——当目标分布平坦时这个数可能很低;
- 分布差得越远,接受率越低,速度提升越小。而”分布差多远”正是 KL 散度要度量的量(总变差距离与 KL 之间还有 Pinsker 不等式 TV(p,q)2≤21DKL(p∥q) 联系着,粗略地说 KL 越小接受率越高)。
更漂亮的性质是:只要拒绝时从归一化的残差分布 max(0,p−q)/∑max(0,p−q) 重采样,最终输出分布就精确等于目标分布 p(论文的 Theorem 3.5)——所以投机解码是无损加速,输出分布和直接采样目标模型一模一样。下图是论文里的原图:绿色是草稿模型提出的候选,紫色是目标模型验证,红叉是被拒绝的 token:


第二张 trace 图解释了加速的来源:紫色块(昂贵的目标模型)出现次数 = 验证轮数,蓝色块(便宜草稿模型)每轮 γ 次。接受率高时每轮能拿下接近 γ+1 个 token,目标模型调用次数大幅下降。这就是为什么 DSpark、EAGLE 这类工作拼命让草稿分布贴近目标分布——贴近程度(KL 的反义词)直接兑换成吞吐。
与 LLM 的联系之三:RLHF 与蒸馏的 KL 惩罚#
信息论里 KL 散度的”方向性”在 RLHF 里用得很妙。InstructGPT(OpenAI,2022)的强化学习目标是在奖励之外加一项对初始策略的 KL 惩罚:
θmax Ex∼πθ[r(x)]−β⋅DKL(πθ∥πSFT)方向是”新策略对旧策略”(πθ∥πSFT),而不是反过来。原因正是上面那个不对称性:新策略如果在旧策略认为几乎不可能的地方给出高概率,KL 会爆炸——惩罚很重;而新策略把旧策略的高概率动作概率压一点,代价相对小。于是 β 越大,新策略越不敢偏离旧策略,输出越”保守”。知识蒸馏(knowledge distillation)同理:学生模型的目标是让它的分布 q 逼近教师分布 p,即最小化 DKL(p∥q)(或等价地最小化交叉熵 H(p,q),因为 H(p) 是常数)。
困惑度:把交叉熵翻译成”有效词表大小”#
定义与推导#
困惑度(perplexity, PPL)是交叉熵取指数:
PPL(p,q)=2H(p,q)如果交叉熵用自然对数算,就是 eH(p,q),两种写法等价(都是同一个数的不同底)。对一个长为 N 的测试文本,交叉熵是逐 token 平均的 −log2q(xt),所以困惑度可以展开成:
PPL=exp(−N1t=1∑Nlnq(xt))=(t=1∏Nq(xt))−1/N困惑度 = 模型给每个真实 token 概率的几何平均的倒数。
直觉:模型在多少个词之间”犹豫”#
困惑度最有用的直觉是”有效词表大小”:一个均匀分布在 K 个 token 上的模型(每个概率 1/K),困惑度恰好是 K。所以”PPL = 10”可以读作”模型平均在 10 个候选 token 之间拿不准”——困惑度越大,模型越”犹豫”。语言模型论文里报告 PPL 时,数值含义就是:这个模型平均相当于在多大的一堆词里均匀瞎猜。
把困惑度换算成每 token 比特数非常常用:
bits per token=log2PPL- GPT-2 最小模型(117M,2019)在 WikiText-2 测试集上 PPL ≈ 29.41,即平均每个 token 约 4.88 bit——比均匀词表(约 16.6 bit)低得多,说明它学到了大量语言结构;
- GPT-2 1.5B 模型 PPL ≈ 18.34,约 4.20 bit/token;
- Llama 2(2023)在 WikiText-2 上:7B 为 5.47(约 2.45 bit/token),13B 为 4.88,70B 为 3.31(约 1.73 bit/token)。
从 2019 年的 4.9 bit 到 2023 年的 1.7 bit,这就是语言建模进步在信息论标尺上的刻度。
困惑度直接就是压缩率#
信息论最漂亮的结论之一:一个概率模型 + 算术编码 = 无损压缩器,且压缩率由交叉熵决定。DeepMind 2023 年的论文《Language Modeling Is Compression》把这件事做到了极致:用 Chinchilla 70B 作为概率模型做算术编码,把 enwik9(10 亿字节的英文维基百科数据)压缩到原大小的 8.3%;对图像数据压到 43.4%(PNG 是 58.5%),对音频数据压到 16.4%(FLAC 是 30.3%)——一个”只训练过文本”的模型在图像和音频上击败了领域专用压缩器。下图是论文的 Figure 2:不同规模的 Transformer 在 enwik8 上的压缩率(对数坐标),曲线先降后升,说明每个数据集都有最优模型规模——模型太小记不住规律,模型太大”背模型参数”本身也要比特数:

另一张图(Figure 4)展示了上下文越长压缩率越好——每字节比特数随序列长度下降:

这两张图解释了一个日常都会观察到的现象:为什么 KV cache 越来越大、长上下文推理成本越来越高——因为上下文就是信息,模型在用它压缩”下一个 token”的不确定性。困惑度从 29 降到 3.3,对应每 token 从 4.9 bit 降到 1.7 bit,这就是”压缩”的量化含义。顺带一提,KV cache 本身也可以从信息论视角看:KV 向量是模型已学语言的产物,理论上可压缩到接近每 token 的熵(约 3.3-4.3 bit/token,对应 PPL 10-20)——这正是 KV 量化工作(如 2-3 bit 每向量元素)背后的理论支撑。
使用困惑度的三个坑#
- 跨 tokenizer 不可比:PPL 按 token 平均,而不同 tokenizer 切出的 token 粒度不同(BPE 越细,每 token 信息越少,PPL 越低)。跨模型比较要用 BPB(bits per byte)——按原始字节平均的比特数,HuggingFace 的评估工具里 PPL 和 BPB 会同时给出;
- PPL 低 ≠ 生成质量高:困惑度只度量”押中真实 token 的能力”,不度量事实正确、指令遵循、安全性。一个只会背高频套话的模型 PPL 可能很低但回答完全没用;
- 遇到零概率词直接爆炸:测试文本里任何一个 token 的 q(xt)=0 都会让交叉熵无穷大、PPL 无穷大。所以评估时要么用子词级别的覆盖率保证不出现 OOV,要么平滑处理。
温度与采样:熵的旋钮#
softmax 温度在数学上做了什么#
解码时面对的是一个 logits 向量 z∈RV,标准 softmax 给出分布 pi∝ezi。加温度参数 T 后:
pi(T)=∑jezj/Tezi/T三个特殊点:
- T=1:原分布;
- T→0:分布收敛到 one-hot(argmax)。推导:设 zmax 是唯一最大 logit,把分子分母同除 ezmax/T,
因为 zj−zmax<0 时指数项趋于 0。所以温度越低越”贪婪”;
- T→∞:所有 ezj/T→1,pi→1/V——均匀分布。
温度在信息论意义上就是熵的旋钮:T 单调地控制分布熵从 0(T=0,确定)到 log2V(T=∞,完全均匀)。“temperature”这个名字来自统计力学里的玻尔兹曼分布(Boltzmann distribution)——同样的数学(p∝e−E/kT)在物理里描述了粒子按能量 E 的分布,能量越低概率越高,温度越高分布越均匀。LLM 的 logits 就是”负能量”,温度调的就是这个物理类比。
Gumbel-max trick:怎么从分布里采样#
从 softmax 分布采样,最直观的做法是轮盘赌(按概率累积区间扔一个 [0,1) 均匀随机数),但数值上有个更优雅的等价方法——Gumbel-max trick:给每个 logit 加一个独立的标准 Gumbel 噪声再取 argmax:
x=argimax(zi+Gi),Gi∼Gumbel(0,1)其中标准 Gumbel 分布的 CDF 是 F(g)=e−e−g。证明这个采样结果确实服从 softmax(z):对任意输出 k,
Pr(k=argimax(zi+Gi))=∫j=k∏Pr(Gj≤g+zk−zj)dF(g)代入 F(g)=e−e−g 化简(中间需要用到 e−e−g 的积分等于 1 的恒等式),结果是:
Pr(k)=∑jezjezk(完整推导见 Gumbel-softmax 论文,Jang et al., 2017。)温度版本也顺理成章:T 温度采样等价于 argmaxi(zi/T+Gi)=argmaxi(zi+TGi)。
采样与压缩是同一枚硬币#
Gumbel-max trick 看起来只是个小技巧,但它和算术编码之间有深刻的等价关系:一个均匀随机数 u∈[0,1) 通过分布的累积区间决定采样结果,这正是算术解码的过程——算术编码也用一个 [0,1) 里的实数,按模型的累积概率逐段切分区间来编解码符号。两者用的是同一个机制:
- 算术编码:给定符号序列,找一个落在对应嵌套区间里的实数,输出它的二进制表示;
- 从分布采样:扔一个均匀实数,看它落在哪个累积区间,输出对应的符号。
所以”从一个分布采样一个 token”和”按这个分布压缩一个 token”是同一个操作的两个方向。语言模型训练得越好(熵越低),采样的 token 越可预测,压缩它需要的比特越少(熵下界),每 token 比特数越低——困惑度、熵、压缩率、采样成本,四个概念共享同一个数。这也是为什么 DeepMind 说”语言建模就是压缩”:预测下一个 token 的概率模型天然就是一个算术编码器。
采样还有个常被忽略的工程含义:从一个熵为 H 的分布采样一个 token,至少需要 H 比特的随机数(无偏采样时)。GPU 上生产高质量随机数的带宽有限,这也是低熵场景(贪婪解码)更省随机数开销的原因之一。
top-p / top-k 截断的熵效应#
实际解码还要做 top-k / top-p 截断:只保留概率最高的 k 个或累积概率达 p 的 token,其余概率清零重归一化。信息论视角下,截断就是在缩小”有效词表”:被截掉的尾部 token 概率被清零后,分布的熵下降(剩下的概率要重新归一化,头部更突出)。top-p = 0.9 意味着”保留占 90% 概率质量的候选”,其有效词表大小和熵都远小于完整的 V=100k 词表。采样质量调参(温度、top-p、top-k)本质上都是在给”预测分布的熵”做整形。
互信息:两个变量共享多少信息#
最后补一个相关量。互信息(mutual information)I(X;Y) 度量”知道 Y 之后,X 的不确定性减少了多少”:
I(X;Y)=H(X)−H(X∣Y)=H(X)+H(Y)−H(X,Y)第二个等号由链式法则推来。它还有第三种写法——Y 给 X 带来的信息等于联合分布与”假设两者独立”的分布之间的 KL:
I(X;Y)=DKL(p(x,y)∥p(x)p(y))Olah 的这张总览图把熵、条件熵、联合熵(joint entropy)、互信息的关系画全了(深色区是互信息):

互信息在 LLM 里的影子:下一个 token Xt 与上下文 X<t 之间的互信息,衡量”上下文到底提供了多少信息”——互信息高说明上下文对预测至关重要,这正是”长上下文有价值”的数学形式。像 H2O(Heavy-Hitter Oracle,2023)这类 KV cache 驱逐策略,用注意力分数近似”哪些历史 token 对预测贡献最大”,本质上是把”高互信息的 token”留在缓存里。检索增强(RAG)的数学动机也相同:补充检索到的文档,就是为了提高条件概率中的互信息。
小结:一张表串起所有概念#
信息论的五个核心量可以画成一张换算表:
| 概念 | 公式 | 一句话直觉 | 在 LLM 里的落点 |
|---|---|---|---|
| 自信息 | −logp | 惊讶程度 / 最优码长 | 单 token 的损失项 |
| 熵 | H(p)=−∑pilogpi | 平均惊讶 / 压缩下界 | 分布不确定性的度量 |
| 交叉熵 | H(p,q)=−∑pilogqi | 用 q 的码本编码 p 的平均码长 | 训练损失、PPL 原料 |
| KL 散度 | DKL(p∥q)=∑pilogqipi | 用 q 近似 p 多付的比特 | 量化评估、投机解码、RLHF |
| 困惑度 | 2H(p,q) | 有效词表大小 | 模型评估、换算 bits/token |
核心关系只有三个式子,其余全是推论:
H(p,q)=H(p)+DKL(p∥q),PPL=2H(p,q),bits/token=log2PPL把这套语言记住,再看任何一篇 LLM 论文都会发现:训练(交叉熵损失)、评估(困惑度)、量化(KL 校准)、投机解码(接受率 = 1−TV(p,q))、采样(温度与熵)——全部是香农 1948 年那套”度量惊讶”数学的变体。
信息论是”用得上的数学基础”里的一块。同一量级的基础还有:数值线性代数里的条件数与病态问题(和量化误差、数值稳定性直接相关),以及服务系统里的排队论(和推理服务的吞吐、时延分析直接相关)。
参考资料#
- Shannon, A Mathematical Theory of Communication (1948) —— 信息论的奠基论文,熵、源编码定理的原始出处
- Chris Olah, Visual Information Theory (2015) —— 本文配图的来源,用可视化讲熵/交叉熵/KL/互信息的经典博客
- Leviathan et al., Fast Inference from Transformers via Speculative Decoding (ICML 2023) —— 投机解码原论文,接受概率 min(1, p/q) 与 Theorem 3.5
- Delétang et al., Language Modeling Is Compression (2023) —— 语言模型 = 无损压缩器的实证论文,Chinchilla 70B 把 enwik9 压到 8.3%
- Radford et al., Language Models are Unsupervised Multitask Learners (GPT-2, 2019) —— GPT-2 论文,WikiText-2 PPL 29.41/18.34 的数据来源
- Touvron et al., Llama 2: Open Foundation and Fine-Tuned Chat Models (2023) —— Llama 2 论文,WikiText-2 测试困惑度表格(7B 5.47 / 13B 4.88 / 70B 3.31)
- llama.cpp perplexity 工具文档 —— PPL 与 —kl-divergence 模式的说明
- llama.cpp Discussion #4110: Perplexity 作为量化损失指标不准确,KL 散度是更好的数据点 —— 社区对 PPL vs KL 评估量化的讨论
- NVIDIA TensorRT Developer Guide: INT8 校准 —— TensorRT 熵校准(最小化 KL)的官方文档
- HuggingFace 文档:Perplexity of fixed-length models —— 困惑度定义与 BPB 换算的官方说明
- Ouyang et al., Training language models to follow instructions with human feedback (InstructGPT, 2022) —— RLHF 的 KL 惩罚项出处
- Jang et al., Categorical Reparameterization with Gumbel-Softmax (2017) —— Gumbel-max trick 与 Gumbel-softmax 原论文
- Zhang et al., H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models (2023) —— 用注意力分数近似 token 重要性的 KV 驱逐策略
- Cover & Thomas, Elements of Information Theory (Wiley) —— 信息论标准教材,熵/KL/互信息的所有性质与证明
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分内容可能已过时
评论区
分享你的想法,与大家交流讨论
音乐
暂未播放



