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

8491 字
42 分钟
信息论基础:熵、交叉熵与 KL 散度——LLM 推理中无处不在的数学

AI 生成内容声明

背景:为什么做推理的人也要懂信息论#

翻开任何一篇 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-\log p#

从”惊讶程度”出发#

信息论的一切都从一个问题开始:一个事件的发生,携带了多少信息?

直觉上,答案和事件的概率有关:

  • 明天太阳从东边升起——概率几乎是 1 的事件,它的发生毫无悬念,携带的信息量约等于 0;
  • 一枚均匀硬币掷出正面——概率 1/2,得到 1 个 bit 的信息;
  • 彩票中大奖——概率千万分之一,它的发生携带了巨大的信息量(所以新闻里全是它)。

所以”信息量”本质上是”惊讶程度”(surprisal):事件越不可能,发生时越惊讶,携带的信息越多

假设用 I(p)I(p) 表示”概率为 pp 的事件发生时的信息量”,香农要求它满足三条看起来非常自然、也和日常直觉一致的性质:

  1. 非负I(p)0I(p) \ge 0,事件不可能”负惊讶”;
  2. 单调pp 越小,I(p)I(p) 越大;
  3. 可加:两个独立事件同时发生(概率 pqpq)的信息量等于各自信息量之和,I(pq)=I(p)+I(q)I(pq) = I(p) + I(q)。这一点很关键——同时听到”掷硬币正面”和”掷骰子 6 点”,收获的信息应该等于两件事各自的信息之和。

第二条和第三条一起,加上 II 是连续函数,就能把 I(p)I(p) 的形式完全定死。第三条说 II 把乘法变成加法,即 II 是一个把 (0,1](0,1](概率)映到 [0,)[0,\infty) 的连续函数且满足 I(pq)=I(p)+I(q)I(pq)=I(p)+I(q)。令 f(x)=I(ex)f(x) = I(e^{-x}),则 f(x+y)=f(x)+f(y)f(x+y) = f(x)+f(y),连续的解只有 f(x)=cxf(x) = cx,于是

I(p)=clogpI(p) = -c \log p

比例常数 cc 只决定单位:取 c=1c=1 时用自然对数,单位叫奈特(nat);取 c=1/ln2c = 1/\ln 2、即底数为 2 时,单位叫比特(bit)。比特是信息论默认单位:一个概率 1/2 的事件携带 I(1/2)=log22=1I(1/2) = \log_2 2 = 1 比特,正好对应”一个二进制位”。

另一个视角:最优编码的长度#

“惊讶程度”是心理视角,信息论还有一个更硬的视角——编码长度

假设要把一条消息的每个符号压缩成二进制码字再传输:总共有 NN 种符号,如果给每个符号分配等长的码字,需要 log2N\log_2 N 位。但如果符号出现的概率不同,显然应该给高频符号分配短码字、低频符号分配长码字——这正是摩尔斯电码的做法(常用字母 e 是单点,罕见的 q 是一长串)。

那么给概率为 pp 的符号分配多长的码字最合适?直观上,如果每个符号码长 L(x)L(x),那么 2L(x)2^{L(x)} 个码字能编码 2L(x)2^{L(x)} 种情况,而”出现概率 pp 的符号应该用掉码空间中占比 pp 的那部分”,于是

L(x)log21p(x)L(x) \approx \log_2 \frac{1}{p(x)}

也就是说,概率为 pp 的事件,最优码长就是 log2p-\log_2 p 比特。这个”编码长度”解释和”惊讶程度”解释殊途同归——所以”信息量 = logp-\log p“不是拍脑袋定义的,而是”码长必须与概率匹配”这一要求逼出来的。

与 LLM 的第一个联系:损失函数就是平均惊讶度#

一个自回归语言模型在每个位置做的事,就是输出一个概率分布 q(x<t)q(\cdot \mid x_{<t}):预测下一个 token 的概率。真实数据给出真实的下一个 token xtx_t,模型给它的概率是 q(xt)q(x_t),那么模型对这一事件的惊讶程度就是 logq(xt)-\log q(x_t)——它低估真实 token(给的概率小)时惊讶值大,高估时惊讶值小。训练时最小化的东西正是这个惊讶度的平均。所以下一篇要讲的交叉熵,本质上就是”平均惊讶度”。

熵:一个分布的平均信息量#

定义与第一个例子#

单个事件的信息量是 logp-\log p,那么一个分布的平均信息量就是把每个事件的 logpi-\log p_i 按概率加权求期望:

H(p)=EXp[logp(X)]=ipilogpiH(p) = \mathbb{E}_{X \sim p}\left[-\log p(X)\right] = -\sum_{i} p_i \log p_i

这就是熵(entropy)。注意这里默认对数底为 2,熵的单位是比特;如果论文里的 loss 用自然对数(nats),熵的单位就是奈特。一个”公平硬币”分布的熵:

H=12log21212log212=1 bitH = -\frac{1}{2}\log_2\frac{1}{2} - \frac{1}{2}\log_2\frac{1}{2} = 1 \text{ bit}

一个”99% 正面”的偏硬币熵只有约 0.081 比特——几乎每次都是正面,基本没有不确定性,也就不怎么携带信息。均匀六面骰子是 log262.585\log_2 6 \approx 2.585 比特。均匀分布的范围越大,熵越大:均匀词表大小 V=100,000V=100{,}000 时,熵是 log2100,00016.6\log_2 100{,}000 \approx 16.6 比特。

Chris Olah 在《Visual Information Theory》里把熵画成了这样一张图——熵就是”以最优码长编码消息时的平均码长”:

熵 = 平均码长:每个符号按 log(1/p) 分配码长,熵是这些码长的概率加权平均
熵 = 平均码长:每个符号按 log(1/p) 分配码长,熵是这些码长的概率加权平均

图里每一个符号 x 都有一个”概率大小决定的长方块”——码长 log2(1/p(x))\log_2(1/p(x)),把它们按概率加权相加,就是熵。这张图想表达的直觉是:熵 = 最优无损压缩下每个符号的平均码长(比特)。这是香农源编码定理(source coding theorem)的结论:任何无损压缩方案的平均码长都不可能低于熵,而算术编码(arithmetic coding)/霍夫曼编码(Huffman coding)可以无限逼近这个下界。这个结论非常重要,后面讲”语言模型 = 压缩器”时会用到。

熵的两个性质:范围与为什么均匀分布最大#

熵有两个基本性质:

  1. 非负,且确定分布(某个 pi=1p_i = 1)的熵为 0——完全没有不确定性;
  2. 均匀分布熵最大,最大值为 log2N\log_2 N

性质 2 的证明只需要一条 Jensen 不等式。f(x)=logxf(x)=\log x 是凹函数,E[f(X)]f(E[X])E[f(X)] \le f(E[X]),取 XX 为取值 1/pi1/p_i 的随机变量(概率 pip_i):

H(p)=ipilog21pilog2(ipi1pi)=log2NH(p) = \sum_i p_i \log_2 \frac{1}{p_i} \le \log_2 \left(\sum_i p_i \cdot \frac{1}{p_i}\right) = \log_2 N

等号当且仅当所有 1/pi1/p_i 相等,即 pi=1/Np_i = 1/N 均匀分布。这个结论的直觉是:越”拿不准”,熵越大;什么都不确定时熵达到最大 log2N\log_2 N

条件熵:知道了一部分,还剩多少不确定性#

如果两个随机变量 X,YX, Y 有关联,知道 YY 通常会降低 XX 的不确定性。条件熵(conditional entropy)H(XY)H(X \mid Y) 定义为已知 YY 之后 XX 的平均剩余不确定性:

H(XY)=yp(y)H(XY=y)=x,yp(x,y)logp(xy)H(X \mid Y) = \sum_y p(y)\, H(X \mid Y = y) = -\sum_{x,y} p(x,y) \log p(x \mid y)

这里 p(xy)p(x \mid y) 是条件概率,p(x,y)p(x,y) 是联合分布。由条件概率的乘法规则 p(x,y)=p(x)p(yx)p(x,y) = p(x)\, p(y \mid x) 可以推出链式法则(chain rule):

H(X,Y)=H(X)+H(YX)H(X, Y) = H(X) + H(Y \mid X)

即”联合分布的信息量 = X 自己的信息量 + 知道 X 后 Y 还剩的信息量”。直观上,要编码 (X,Y)(X,Y) 两个变量,可以先编码 XX(花 H(X)H(X) 比特),再利用 XX 的信息编码 YY(只需 H(YX)H(Y|X) 比特)。

与 LLM 的联系:模型在”拿不准”的地方熵高#

语言模型在每个位置输出的分布就是一个随时间变化的熵值:

  • 在”3 + 4 = ____“后面,几乎所有概率都压在”7”上,分布接近确定,熵接近 0;
  • 在”明天的天气是____“后面,分布平坦,熵接近 log2V\log_2 V
  • 在”他走进____“后面,熵介于两者之间——模型”知道大概是人称代词或名词,但不确定具体是哪个”。

生成式 AI 的”随机性”本质上是分布熵的表现:一个模型的采样输出越多样,说明它在那些位置的预测分布熵越高。后面会看到,temperature 这个参数就是直接拧分布熵的旋钮。

交叉熵:用”错误的分布”去编码的代价#

定义:错配码长的期望#

熵假设用正确的分布 p 设计码长(码长 log2(1/pi)\log_2(1/p_i))。但现实里手里往往是另一个分布——模型的预测分布 qq——而真实情况服从 pp

如果码长是按 qq 设计的(符号 ii 的码长 log2(1/qi)\log_2(1/q_i)),但消息实际来自 pp,那么平均码长是:

H(p,q)=ipilog2qiH(p, q) = -\sum_i p_i \log_2 q_i

这就是交叉熵(cross entropy)。注意它和熵 H(p)H(p) 的区别:熵里是 logpi\log p_i,交叉熵里是 logqi\log q_i,但加权平均用的是 pip_i。只有当 p=qp = q 时两者相等。

“多出来的那一截”(交叉熵减熵)就是下一节要讲的 KL 散度——下一节讨论 KL 散度时,会把 Olah 的可视化图一并给出,把交叉熵和熵的差画出来。这里先记住一个结论:交叉熵永远大于等于熵,因为用错配的码长方案不会比用最优方案更短。

这个"\ge"的结论(Gibbs 不等式)可以由对数不等式严格证明:对任意 x>0x>0lnx1x-\ln x \ge 1 - x(等号当 x=1x=1),取 x=qi/pix = q_i/p_i 得到 ln(qi/pi)1qi/pi-\ln(q_i/p_i) \ge 1 - q_i/p_i,乘 pip_i 求和:

ipilnpiqii(piqi)=0\sum_i p_i \ln \frac{p_i}{q_i} \ge \sum_i (p_i - q_i) = 0

左边正是下一节的 KL 散度(自然对数版本)。这个不等式贯穿整个信息论,值得记住。

与 LLM 的联系:交叉熵就是训练损失#

语言模型训练时,真实下一个 token 是确定的 xtx_t,所以真实分布 pp 是 one-hot(pp 只在 xtx_t 处为 1,其余为 0)。此时交叉熵大幅简化:

H(p,q)=ipilogqi=logq(xt)H(p, q) = -\sum_i p_i \log q_i = -\log q(x_t)

只取决于模型给真实 token 的概率。所以:

  • “最大化对数似然”和”最小化交叉熵”是同一件事——最小化 logq(xt)-\log q(x_t) 就是在让模型把真实 token 的概率推高;
  • LLM 训练曲线上的 loss 就是每个 token 交叉熵的平均值(用自然对数时单位是 nats/token,可以换算成 bits/token,见困惑度一节);
  • 交叉熵对 logits 的梯度形式是 qpq - p(预测分布减 one-hot 真值),这正是 softmax 交叉熵好用的原因之一——梯度不会因为”真值位置概率接近 1”而消失。

顺带一提:标签平滑(label smoothing)在信息论视角下就是把 one-hot 的 pp 换成一个小熵版本——one-hot 的熵是 0,模型被逼到”过度自信”;平滑后目标分布有了一点熵,模型就不必把概率推到 1,泛化更好。

KL 散度:两个分布差多少(以及为什么不对称)#

定义:平均多付的比特数#

从上面的推导可以直接读出:交叉熵减去熵,剩下的就是”因为用错分布而多付的平均码长”,这就是KL 散度(Kullback-Leibler divergence)

DKL(pq)=H(p,q)H(p)=ipilog2piqiD_{KL}(p \,\|\, q) = H(p, q) - H(p) = \sum_i p_i \log_2 \frac{p_i}{q_i}

读作”p 对 q 的 KL 散度”(从 p 到 q),或者”用 q 近似 p 的额外代价”。三个量排在一起的关系式值得刻在脑子里:

H(p,q)=H(p)+DKL(pq)H(p, q) = H(p) + D_{KL}(p \,\|\, q)

交叉熵 = 熵(不可压缩的下界)+ KL(模型错配的代价)。

非负性:KL 散度永远 ≥ 0#

上面 Gibbs 不等式的推导直接给出 DKL(pq)0D_{KL}(p\|q) \ge 0,等号当且仅当 p=qp = q。注意这里只用了 lnxx1\ln x \le x-1 这一条凹函数性质,没有任何假设——所以 KL 散度确实是”差异”的合理度量:两个分布一样时为 0,越不一样越大

不对称性:KL 不是距离,方向很重要#

KL 散度最大的坑是:它不是对称的DKL(pq)DKL(qp)D_{KL}(p\|q) \neq D_{KL}(q\|p)。所以它不能叫”距离”(度量),只能叫”散度”。两个方向差了多远,看 Olah 的对比图最直观:

KL 散度方向 1:D_KL(P||Q) —— 用 Q 的码长方案编码 P 的事件(交叉熵 H(P,Q) 比熵 H(P) 多出的部分)
KL 散度方向 1:D_KL(P||Q) —— 用 Q 的码长方案编码 P 的事件(交叉熵 H(P,Q) 比熵 H(P) 多出的部分)

KL 散度方向 2:D_KL(Q||P) —— 用 P 的码长方案编码 Q 的事件(交叉熵 H(Q,P) 比熵 H(Q) 多出的部分)
KL 散度方向 2:D_KL(Q||P) —— 用 P 的码长方案编码 Q 的事件(交叉熵 H(Q,P) 比熵 H(Q) 多出的部分)

两张图里,深色块是熵(各自的最优码长),浅色块是交叉熵(错配码长),中间的差就是 KL。可以发现两个方向的”额外高度”明显不同。为什么?

一个极端例子最说明问题。设 pp = “99% 正面”的硬币,qq = “99% 反面”的硬币:

DKL(pq)=0.99log20.990.01+0.01log20.010.996.50 bitD_{KL}(p \| q) = 0.99 \log_2 \frac{0.99}{0.01} + 0.01 \log_2 \frac{0.01}{0.99} \approx 6.50 \text{ bit}DKL(qp)=0.99log20.990.01+0.01log20.010.996.50 bitD_{KL}(q \| p) = 0.99 \log_2 \frac{0.99}{0.01} + 0.01 \log_2 \frac{0.01}{0.99} \approx 6.50 \text{ bit}

对称的例子居然相等——换个不对称的例子。设 qq 是确定分布(q()=1q(正)=1),pp 是均匀分布(p()=p()=1/2p(正)=p(反)=1/2):

DKL(pq)=12log21/21+12log21/20=+D_{KL}(p \| q) = \frac{1}{2}\log_2\frac{1/2}{1} + \frac{1}{2}\log_2\frac{1/2}{0} = +\infty

无穷大。为什么?因为 qq 说”反面永远不会发生”(概率 0),而真实世界 pp 里反面有一半概率。用 q 的码本去编码真实世界的事件时,反面事件根本无法编码——它分配了 0 个码字。反过来:

DKL(qp)=1log211/2+0=1 bitD_{KL}(q \| p) = 1 \cdot \log_2\frac{1}{1/2} + 0 = 1 \text{ bit}

有限。直觉总结成一句话:用”更宽”的分布去近似”更窄”的分布代价小(多花一点点),用”更窄”的分布去近似”更宽”的分布代价可能无穷大(把可能事件判成不可能)。这就是为什么在 RLHF 里要限制”新策略相对于旧策略的 DKL()D_{KL}(新 \| 旧)“而不是反过来——新策略如果给旧策略认为几乎不可能的动作赋予高概率,惩罚必须爆炸式增长。

与 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 激活值的直方图作为真实分布 pp,然后选一个缩放阈值让 INT8 可表示出的分布 qqpp 的 KL 散度最小。所以”量化丢了多少信息”这件事,从香农 1948 年就给出了度量工具。

与 LLM 的联系之二:投机解码的接受率#

投机解码(speculative decoding;Leviathan 等人 2023 年发表在 ICML 的《Fast Inference from Transformers via Speculative Decoding》)的数学核心就是两个分布的 KL 关系。流程回顾:小模型(草稿模型)按分布 qq 快速自回归生成 γ\gamma 个候选 token,大模型(目标模型)并行验证,输出分布是 pp。验证时对每个候选 token xx,以概率

min(1,p(x)q(x))\min\left(1, \frac{p(x)}{q(x)}\right)

接受它。

为什么是这个形式?想一下:草稿模型采样到 xx 的概率是 q(x)q(x),乘以接受概率,xx 被”接受并输出”的总概率质量是 q(x)min(1,p(x)/q(x))=min(p(x),q(x))q(x) \cdot \min(1, p(x)/q(x)) = \min(p(x), q(x))。对所有 token 求和,得到平均接受率

α=xmin(p(x),q(x))=112xp(x)q(x)\alpha = \sum_x \min(p(x), q(x)) = 1 - \frac{1}{2}\sum_x |p(x) - q(x)|

最后一个等号是恒等式:min(p,q)=12(p+qpq)=112pq1\sum \min(p,q) = \frac{1}{2}(\sum p + \sum q - \sum |p-q|) = 1 - \frac{1}{2}\|p-q\|_1,其中 pq1\|p-q\|_1 是 L1 范数(也叫总变差距离,total variation distance)。所以:

  • 如果 p=qp = q(草稿分布完全等于目标分布),接受率 α=1\alpha = 1,所有候选全被接受——投机解码退化成”直接快速生成”;
  • 如果 qq 是 one-hot 贪婪(只押 argmax),接受率退化为 α=p(x)\alpha = p(x^*)——当目标分布平坦时这个数可能很低;
  • 分布差得越远,接受率越低,速度提升越小。而”分布差多远”正是 KL 散度要度量的量(总变差距离与 KL 之间还有 Pinsker 不等式 TV(p,q)212DKL(pq)\mathrm{TV}(p,q)^2 \le \frac{1}{2}D_{KL}(p\|q) 联系着,粗略地说 KL 越小接受率越高)。

更漂亮的性质是:只要拒绝时从归一化的残差分布 max(0,pq)/max(0,pq)\max(0, p-q)/\sum\max(0,p-q) 重采样,最终输出分布就精确等于目标分布 pp(论文的 Theorem 3.5)——所以投机解码是无损加速,输出分布和直接采样目标模型一模一样。下图是论文里的原图:绿色是草稿模型提出的候选,紫色是目标模型验证,红叉是被拒绝的 token:

投机解码示意图(Leviathan et al., ICML 2023):草稿模型按 q 提出候选,目标模型按 p 验证,接受率取决于两个分布的重合程度
投机解码示意图(Leviathan et al., ICML 2023):草稿模型按 q 提出候选,目标模型按 p 验证,接受率取决于两个分布的重合程度

投机解码 trace 图:每次调用目标模型(紫色块)之前有 γ 次草稿模型调用(蓝色块),接受率越高,每个目标模型调用产出的 token 越多
投机解码 trace 图:每次调用目标模型(紫色块)之前有 γ 次草稿模型调用(蓝色块),接受率越高,每个目标模型调用产出的 token 越多

第二张 trace 图解释了加速的来源:紫色块(昂贵的目标模型)出现次数 = 验证轮数,蓝色块(便宜草稿模型)每轮 γ\gamma 次。接受率高时每轮能拿下接近 γ+1\gamma+1 个 token,目标模型调用次数大幅下降。这就是为什么 DSpark、EAGLE 这类工作拼命让草稿分布贴近目标分布——贴近程度(KL 的反义词)直接兑换成吞吐

与 LLM 的联系之三:RLHF 与蒸馏的 KL 惩罚#

信息论里 KL 散度的”方向性”在 RLHF 里用得很妙。InstructGPT(OpenAI,2022)的强化学习目标是在奖励之外加一项对初始策略的 KL 惩罚:

maxθ Exπθ[r(x)]βDKL(πθπSFT)\max_\theta \ \mathbb{E}_{x \sim \pi_\theta}\left[r(x)\right] - \beta \cdot D_{KL}\left(\pi_\theta \,\|\, \pi_{\text{SFT}}\right)

方向是”新策略对旧策略”(πθπSFT\pi_\theta \| \pi_{\text{SFT}}),而不是反过来。原因正是上面那个不对称性:新策略如果在旧策略认为几乎不可能的地方给出高概率,KL 会爆炸——惩罚很重;而新策略把旧策略的高概率动作概率压一点,代价相对小。于是 β\beta 越大,新策略越不敢偏离旧策略,输出越”保守”。知识蒸馏(knowledge distillation)同理:学生模型的目标是让它的分布 qq 逼近教师分布 pp,即最小化 DKL(pq)D_{KL}(p\|q)(或等价地最小化交叉熵 H(p,q)H(p,q),因为 H(p)H(p) 是常数)。

困惑度:把交叉熵翻译成”有效词表大小”#

定义与推导#

困惑度(perplexity, PPL)是交叉熵取指数:

PPL(p,q)=2H(p,q)\mathrm{PPL}(p, q) = 2^{H(p,q)}

如果交叉熵用自然对数算,就是 eH(p,q)e^{H(p,q)},两种写法等价(都是同一个数的不同底)。对一个长为 NN 的测试文本,交叉熵是逐 token 平均的 log2q(xt)-\log_2 q(x_t),所以困惑度可以展开成:

PPL=exp(1Nt=1Nlnq(xt))=(t=1Nq(xt))1/N\mathrm{PPL} = \exp\left(-\frac{1}{N}\sum_{t=1}^{N} \ln q(x_t)\right) = \left(\prod_{t=1}^{N} q(x_t)\right)^{-1/N}

困惑度 = 模型给每个真实 token 概率的几何平均的倒数

直觉:模型在多少个词之间”犹豫”#

困惑度最有用的直觉是”有效词表大小”:一个均匀分布在 KK 个 token 上的模型(每个概率 1/K1/K),困惑度恰好是 KK。所以”PPL = 10”可以读作”模型平均在 10 个候选 token 之间拿不准”——困惑度越大,模型越”犹豫”。语言模型论文里报告 PPL 时,数值含义就是:这个模型平均相当于在多大的一堆词里均匀瞎猜。

把困惑度换算成每 token 比特数非常常用:

bits per token=log2PPL\text{bits per token} = \log_2 \mathrm{PPL}
  • 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 上的压缩率(对数坐标),曲线先降后升,说明每个数据集都有最优模型规模——模型太小记不住规律,模型太大”背模型参数”本身也要比特数:

压缩率 vs 模型规模(Language Modeling Is Compression, Figure 2):每个数据集存在最优模型规模,模型参数也要计入压缩成本
压缩率 vs 模型规模(Language Modeling Is Compression, Figure 2):每个数据集存在最优模型规模,模型参数也要计入压缩成本

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

enwik9 上的压缩率随上下文长度下降(Language Modeling Is Compression, Figure 4):上下文越长,模型预测越准,每字节所需比特越少
enwik9 上的压缩率随上下文长度下降(Language Modeling Is Compression, 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 每向量元素)背后的理论支撑。

使用困惑度的三个坑#

  1. 跨 tokenizer 不可比:PPL 按 token 平均,而不同 tokenizer 切出的 token 粒度不同(BPE 越细,每 token 信息越少,PPL 越低)。跨模型比较要用 BPB(bits per byte)——按原始字节平均的比特数,HuggingFace 的评估工具里 PPL 和 BPB 会同时给出;
  2. PPL 低 ≠ 生成质量高:困惑度只度量”押中真实 token 的能力”,不度量事实正确、指令遵循、安全性。一个只会背高频套话的模型 PPL 可能很低但回答完全没用;
  3. 遇到零概率词直接爆炸:测试文本里任何一个 token 的 q(xt)=0q(x_t)=0 都会让交叉熵无穷大、PPL 无穷大。所以评估时要么用子词级别的覆盖率保证不出现 OOV,要么平滑处理。

温度与采样:熵的旋钮#

softmax 温度在数学上做了什么#

解码时面对的是一个 logits 向量 zRVz \in \mathbb{R}^V,标准 softmax 给出分布 piezip_i \propto e^{z_i}。加温度参数 TT 后:

pi(T)=ezi/Tjezj/Tp_i(T) = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}}

三个特殊点:

  • T=1T = 1:原分布;
  • T0T \to 0:分布收敛到 one-hot(argmax)。推导:设 zmaxz_{\max} 是唯一最大 logit,把分子分母同除 ezmax/Te^{z_{\max}/T}
pmax(T)=11+jmaxe(zjzmax)/TT01p_{\max}(T) = \frac{1}{1 + \sum_{j \neq \max} e^{(z_j - z_{\max})/T}} \xrightarrow{T \to 0} 1

因为 zjzmax<0z_j - z_{\max} < 0 时指数项趋于 0。所以温度越低越”贪婪”;

  • TT \to \infty:所有 ezj/T1e^{z_j/T} \to 1pi1/Vp_i \to 1/V——均匀分布。

温度在信息论意义上就是熵的旋钮TT 单调地控制分布熵从 0(T=0T=0,确定)到 log2V\log_2 VT=T=\infty,完全均匀)。“temperature”这个名字来自统计力学里的玻尔兹曼分布(Boltzmann distribution)——同样的数学(peE/kTp \propto e^{-E/kT})在物理里描述了粒子按能量 EE 的分布,能量越低概率越高,温度越高分布越均匀。LLM 的 logits 就是”负能量”,温度调的就是这个物理类比。

Gumbel-max trick:怎么从分布里采样#

从 softmax 分布采样,最直观的做法是轮盘赌(按概率累积区间扔一个 [0,1)[0,1) 均匀随机数),但数值上有个更优雅的等价方法——Gumbel-max trick:给每个 logit 加一个独立的标准 Gumbel 噪声再取 argmax:

x=argmaxi(zi+Gi),GiGumbel(0,1)x = \arg\max_i (z_i + G_i), \qquad G_i \sim \mathrm{Gumbel}(0, 1)

其中标准 Gumbel 分布的 CDF 是 F(g)=eegF(g) = e^{-e^{-g}}。证明这个采样结果确实服从 softmax(z)\mathrm{softmax}(z):对任意输出 kk

Pr(k=argmaxi(zi+Gi))=jkPr(Gjg+zkzj)dF(g)\Pr\left(k = \arg\max_i (z_i + G_i)\right) = \int \prod_{j \neq k} \Pr(G_j \le g + z_k - z_j)\, dF(g)

代入 F(g)=eegF(g) = e^{-e^{-g}} 化简(中间需要用到 eege^{-e^{-g}} 的积分等于 1 的恒等式),结果是:

Pr(k)=ezkjezj\Pr(k) = \frac{e^{z_k}}{\sum_j e^{z_j}}

(完整推导见 Gumbel-softmax 论文,Jang et al., 2017。)温度版本也顺理成章:TT 温度采样等价于 argmaxi(zi/T+Gi)=argmaxi(zi+TGi)\arg\max_i (z_i/T + G_i) = \arg\max_i (z_i + T G_i)

采样与压缩是同一枚硬币#

Gumbel-max trick 看起来只是个小技巧,但它和算术编码之间有深刻的等价关系:一个均匀随机数 u[0,1)u \in [0,1) 通过分布的累积区间决定采样结果,这正是算术解码的过程——算术编码也用一个 [0,1)[0,1) 里的实数,按模型的累积概率逐段切分区间来编解码符号。两者用的是同一个机制:

  • 算术编码:给定符号序列,找一个落在对应嵌套区间里的实数,输出它的二进制表示;
  • 从分布采样:扔一个均匀实数,看它落在哪个累积区间,输出对应的符号。

所以”从一个分布采样一个 token”和”按这个分布压缩一个 token”是同一个操作的两个方向。语言模型训练得越好(熵越低),采样的 token 越可预测,压缩它需要的比特越少(熵下界),每 token 比特数越低——困惑度、熵、压缩率、采样成本,四个概念共享同一个数。这也是为什么 DeepMind 说”语言建模就是压缩”:预测下一个 token 的概率模型天然就是一个算术编码器。

采样还有个常被忽略的工程含义:从一个熵为 HH 的分布采样一个 token,至少需要 HH 比特的随机数(无偏采样时)。GPU 上生产高质量随机数的带宽有限,这也是低熵场景(贪婪解码)更省随机数开销的原因之一。

top-p / top-k 截断的熵效应#

实际解码还要做 top-k / top-p 截断:只保留概率最高的 kk 个或累积概率达 pp 的 token,其余概率清零重归一化。信息论视角下,截断就是在缩小”有效词表”:被截掉的尾部 token 概率被清零后,分布的熵下降(剩下的概率要重新归一化,头部更突出)。top-p = 0.9 意味着”保留占 90% 概率质量的候选”,其有效词表大小和熵都远小于完整的 V=100kV=100\text{k} 词表。采样质量调参(温度、top-p、top-k)本质上都是在给”预测分布的熵”做整形。

互信息:两个变量共享多少信息#

最后补一个相关量。互信息(mutual information)I(X;Y)I(X;Y) 度量”知道 YY 之后,XX 的不确定性减少了多少”:

I(X;Y)=H(X)H(XY)=H(X)+H(Y)H(X,Y)I(X; Y) = H(X) - H(X \mid Y) = H(X) + H(Y) - H(X, Y)

第二个等号由链式法则推来。它还有第三种写法——YYXX 带来的信息等于联合分布与”假设两者独立”的分布之间的 KL:

I(X;Y)=DKL(p(x,y)p(x)p(y))I(X; Y) = D_{KL}\left(p(x,y) \,\|\, p(x)p(y)\right)

Olah 的这张总览图把熵、条件熵、联合熵(joint entropy)、互信息的关系画全了(深色区是互信息):

熵家族总览图(Chris Olah):H(X) 与 H(Y) 的交叠区是互信息 I(X;Y),两侧的月牙是条件熵,外框是联合熵 H(X,Y)
熵家族总览图(Chris Olah):H(X) 与 H(Y) 的交叠区是互信息 I(X;Y),两侧的月牙是条件熵,外框是联合熵 H(X,Y)

互信息在 LLM 里的影子:下一个 token XtX_t 与上下文 X<tX_{<t} 之间的互信息,衡量”上下文到底提供了多少信息”——互信息高说明上下文对预测至关重要,这正是”长上下文有价值”的数学形式。像 H2O(Heavy-Hitter Oracle,2023)这类 KV cache 驱逐策略,用注意力分数近似”哪些历史 token 对预测贡献最大”,本质上是把”高互信息的 token”留在缓存里。检索增强(RAG)的数学动机也相同:补充检索到的文档,就是为了提高条件概率中的互信息。

小结:一张表串起所有概念#

信息论的五个核心量可以画成一张换算表:

概念公式一句话直觉在 LLM 里的落点
自信息logp-\log p惊讶程度 / 最优码长单 token 的损失项
H(p)=pilogpiH(p) = -\sum p_i \log p_i平均惊讶 / 压缩下界分布不确定性的度量
交叉熵H(p,q)=pilogqiH(p,q) = -\sum p_i \log q_i用 q 的码本编码 p 的平均码长训练损失、PPL 原料
KL 散度DKL(pq)=pilogpiqiD_{KL}(p\|q) = \sum p_i \log \frac{p_i}{q_i}用 q 近似 p 多付的比特量化评估、投机解码、RLHF
困惑度2H(p,q)2^{H(p,q)}有效词表大小模型评估、换算 bits/token

核心关系只有三个式子,其余全是推论:

H(p,q)=H(p)+DKL(pq),PPL=2H(p,q),bits/token=log2PPLH(p,q) = H(p) + D_{KL}(p \,\|\, q), \qquad \mathrm{PPL} = 2^{H(p,q)}, \qquad \text{bits/token} = \log_2 \mathrm{PPL}

把这套语言记住,再看任何一篇 LLM 论文都会发现:训练(交叉熵损失)、评估(困惑度)、量化(KL 校准)、投机解码(接受率 = 1TV(p,q)1 - \mathrm{TV}(p,q))、采样(温度与熵)——全部是香农 1948 年那套”度量惊讶”数学的变体。

信息论是”用得上的数学基础”里的一块。同一量级的基础还有:数值线性代数里的条件数与病态问题(和量化误差、数值稳定性直接相关),以及服务系统里的排队论(和推理服务的吞吐、时延分析直接相关)。

参考资料#

  1. Shannon, A Mathematical Theory of Communication (1948) —— 信息论的奠基论文,熵、源编码定理的原始出处
  2. Chris Olah, Visual Information Theory (2015) —— 本文配图的来源,用可视化讲熵/交叉熵/KL/互信息的经典博客
  3. Leviathan et al., Fast Inference from Transformers via Speculative Decoding (ICML 2023) —— 投机解码原论文,接受概率 min(1, p/q) 与 Theorem 3.5
  4. Delétang et al., Language Modeling Is Compression (2023) —— 语言模型 = 无损压缩器的实证论文,Chinchilla 70B 把 enwik9 压到 8.3%
  5. Radford et al., Language Models are Unsupervised Multitask Learners (GPT-2, 2019) —— GPT-2 论文,WikiText-2 PPL 29.41/18.34 的数据来源
  6. 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)
  7. llama.cpp perplexity 工具文档 —— PPL 与 —kl-divergence 模式的说明
  8. llama.cpp Discussion #4110: Perplexity 作为量化损失指标不准确,KL 散度是更好的数据点 —— 社区对 PPL vs KL 评估量化的讨论
  9. NVIDIA TensorRT Developer Guide: INT8 校准 —— TensorRT 熵校准(最小化 KL)的官方文档
  10. HuggingFace 文档:Perplexity of fixed-length models —— 困惑度定义与 BPB 换算的官方说明
  11. Ouyang et al., Training language models to follow instructions with human feedback (InstructGPT, 2022) —— RLHF 的 KL 惩罚项出处
  12. Jang et al., Categorical Reparameterization with Gumbel-Softmax (2017) —— Gumbel-max trick 与 Gumbel-softmax 原论文
  13. Zhang et al., H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models (2023) —— 用注意力分数近似 token 重要性的 KV 驱逐策略
  14. Cover & Thomas, Elements of Information Theory (Wiley) —— 信息论标准教材,熵/KL/互信息的所有性质与证明

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

信息论基础:熵、交叉熵与 KL 散度——LLM 推理中无处不在的数学
https://pinghaoyang.com.cn/aigc/posts/information-theory-for-llm/
作者
平昊阳
发布于
2026-08-24
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
平昊阳
乘长风,破巨浪, 展鸿图于未央!
--
总访问量
--
访客数
公告
欢迎来到我的个人博客!欢迎关注交流吖!
更多相关公告,见
社交-留言」。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
站点统计
文章
66
分类
16
标签
93
总字数
477,284
运行时长
0
最后活动
0 天前

文章目录