世界太吵,来原声听播客

Andrej Karpathy

训练语言模型本质上是在训练一个文本压缩器

交叉熵损失之所以被选中,是因为数学上可以证明它是唯一能保证「模型输出等于数据真实分布时损失最小」的函数形式,而这恰好等价于把模型训练成逼近香农极限的文本压缩器。

信息论交叉熵语言模型训练模型蒸馏压缩KL散度
把「下一词预测」和「压缩」这两个听起来毫不相干的框架用一条公式钉在一起,适合想搞懂损失函数为什么长这样、而不只是会调用它的人。

核心论点 · 点时间戳可跳到原声

0:00

gzip能画出语言家族树

一篇2002年的论文只用gzip这种通用文件压缩,就能给不同语言的文本自动聚类,甚至还原出语系之间的谱系树,全程不依赖任何语言学先验知识。方法是把文档B的一个片段接到文档A末尾再压缩,比较这个结果和单独压缩A的文件大小差异——这个差值本质上是在问「为A优化的压缩方案,处理B的片段效果有多好」,同样的思路后来也被用来做文本作者识别。

— Grant Sanderson
6:13

旧编码遇上新分布的代价

如果一套编码方案是为某个分布Q优化的(比如给机器人指令up/down/left/right分配1/2、1/4、1/8、1/8的概率并设计对应比特长度),但实际数据变成了新分布P,继续用旧编码会产生浪费。按新分布重新加权计算这套旧编码平均要用掉的比特数,这个值就叫做「Q相对于P的交叉熵」——它衡量的正是「为一种情境优化的压缩方案,搬到另一种情境下表现如何」。

— Grant Sanderson
10:22

交叉熵的最小值就是熵本身

把交叉熵公式想象成固定P、让Q变化画出的曲线,会发现这条曲线总在Q等于P的地方取得最小值,而这个最小值恰好就是P的熵。这是因为交叉熵问的问题——「为一种设定优化的编码,在另一种设定下表现如何」——只有在两种设定完全一致时,压缩效率才能达到理论最优。这条性质是后面整个论证的枢纽。

— Grant Sanderson
17:28

预训练损失就是每个token的平均信息量

训练语言模型时,对训练数据里每一个真实出现的下一个token,取模型给它分配的概率的负对数,再对所有token取平均,这就是整个预训练的损失函数。模型越「聪明」,对真实发生的token给出的概率越高,对应的负对数值(信息量/惊讶程度)就越低;一个训练很差的模型则会对什么都不自信,处处感到「意外」。

— Grant Sanderson
20:33

为什么必须是负对数,而不是随便一个递减函数

常见的解释是「交叉熵公式里除了真实token那一项全是0,剩下的自然就是负对数」,但这解释不了为什么一开始要选交叉熵。更扎实的论证是:如果只要求某个函数F满足「全体训练样本的平均损失只有在模型输出分布等于数据真实统计分布时才取得最小值」,用拉格朗日乘子做约束优化可以证明F必须是对数函数——选择权其实并不在你手里,负对数是被数学逼出来的,而这时的平均损失公式恰好就是交叉熵的定义。

— Grant Sanderson
26:41

蒸馏:把大模型的整个概率分布喂给小模型

普通预训练每个token只给「真实发生的那一个」满权重,其余全是0;蒸馏则是让小模型对每个位置的预测去匹配大模型给出的完整概率分布,损失定义为小模型分布相对大模型分布的交叉熵。这样一个训练样本传递的信息量远大于普通预训练——好比学下棋不是只看一步实际走法,而是有个更强的人把每一步的所有候选走法和权重都讲给你听。

— Grant Sanderson
29:48

交叉熵损失等价于训练一个文本压缩器

从压缩的角度看,交叉熵天然衡量「一种压缩方案搬到另一种情境下有多浪费」;从语言模型训练的角度看,损失函数就是每个token的平均信息量。只要能把一个通用的预测器(比如语言模型)转化成一个压缩器——用大约等于该文本在模型看来的信息量那么多的比特去编码它——这两条线索就完全对上了:用交叉熵损失训练模型,等价于把它训练成尽可能好的文本压缩器。

— Grant Sanderson
31:49

KL散度:编码浪费了多少比特

交叉熵减去熵,就得到KL散度(Kolbach-Leibler divergence),它专门衡量「用一套没优化好的编码方案,平均每个符号浪费了多少比特」。在机器学习里KL散度常被当作两个分布之间的「距离」,两分布相同时为0,差异越大越大,但它不对称——Q相对P的KL散度不等于P相对Q的KL散度,这也是为什么蒸馏时用交叉熵而非KL散度是一个值得琢磨的选择。

— Grant Sanderson

原话 · 已逐字校验

But whenever you see the same formula pop up in two separate contexts, it's math's way of kind of winking at you and hinting at a connection.

但每当你看到同一个公式在两个不相关的场景里冒出来,这就是数学在向你眨眼睛,暗示背后有一层联系。

Grant Sanderson2:05

for an optimal code, the number of bits that you allocate to a given symbol looks like the negative log base 2 of the probability for that symbol showing up.

对于最优编码而言,分配给某个符号的比特数,看起来就是该符号出现概率的负的以2为底的对数。

Grant Sanderson4:09

A very nice way to think about the loss function we use in this case is that you measure the average information per token from the model's perspective.

理解这里所用损失函数的一个很好的方式是:你衡量的是从模型视角看,每个token的平均信息量。

Grant Sanderson17:28

You might think this loss function would go by a name like information loss, or log loss, but in fact, people call it cross-entropy loss, which at first might sound really strange, given that nowhere in the explanation have we actually used the cross-entropy formula.

你可能以为这个损失函数会被叫做「信息损失」或「对数损失」,但实际上人们把它叫做「交叉熵损失」,这一开始听起来会很奇怪,因为前面的解释里我们根本没用到交叉熵公式。

Grant Sanderson20:33

you would like it to be the case that the full average loss over all of the examples is minimized only when the model's output matches the statistics that show up in the data, there's actually a really nice mathematical argument for why F has to be a logarithm.

如果你希望所有样本上的平均损失只在模型输出与数据中呈现的统计分布相匹配时才取得最小值,那么其实有一个很漂亮的数学论证,可以说明F必须是对数函数。

Grant Sanderson24:38

it's the difference between trying to learn chess just by watching a game versus having someone better than you talk through all the possible good moves and how heavily they would weight them at each new turn.

这就好比只是看一盘棋来学下棋,和有一个比你厉害的人把每一步所有可能的好棋以及他们会赋予的权重都讲给你听,这两者之间的区别。

Grant Sanderson27:42

And once you understand this, it makes clear how using cross-entropy loss is actually equivalent to training the model to be the best possible text compressor.

一旦理解了这一点,就能看清使用交叉熵损失,实际上等价于把模型训练成尽可能好的文本压缩器。

Grant Sanderson29:48

In the language of compression, you would think of it as describing how many bits per symbol are you wasting by using a poorly optimized code.

用压缩的语言来说,你可以把它理解为:使用一套没有优化好的编码方案,每个符号平均浪费了多少比特。

Grant Sanderson31:49

数字与实体

机器人指令旧编码应对新分布时的交叉熵2.625 bits/符号6:13
90/10偏态分布编码用于50/50均匀分布时的交叉熵约1.74 bits/符号9:20
《Language Trees and Zipping》论文发表年份2002年0:00

术语

cross-entropy交叉熵
用为分布Q优化的编码去编码分布P的数据时,平均每个符号所需的比特数
KL divergenceKL散度(相对熵)
交叉熵减去熵,衡量一套编码方案相对最优方案浪费了多少比特
distillation模型蒸馏
用大模型输出的完整概率分布而非单一正确答案来训练小模型
Lagrange multiplier拉格朗日乘子
求带约束条件下函数极值的一种数学方法
Shannon limit香农极限
无损压缩理论上能达到的最优比特数下界

收听指南

谁该听

对损失函数设计、信息论与深度学习交叉点感兴趣的工程师和研究者,尤其是想搞懂「交叉熵损失」命名由来的人。

可跳过

24:38处拉格朗日乘子的严格推导可跳过,不影响后续结论。