语言建模目标
预测下一个 token 不是对 LLM 行为的比喻,而是它精确的训练目标。这个目标怎么定义,以及它为什么不需要人工标注。
语言模型的每一项能力,都追溯到同一个训练目标:给真正出现的下一个 token 高概率。 不是「理解文本」,也不是「有用」——就是预测下一个 token。把这个目标精确地搞清楚,就能解释为什么这些模型能用几乎无限的数据训练,以及为什么它们的能力是副产品而不是目的。
把目标说清楚
随便拿一段文本,切成 token,然后从左到右走一遍。在每个位置,模型看到前面的全部内容,并要为接下来是什么,输出一个覆盖整个词表的概率分布。
对序列 the cat sat,模型面对三个预测问题:
- 已知
the,预测cat - 已知
the cat,预测sat - 已知
the cat sat,预测后面接什么
训练信号很简单:模型得到的奖励,与它压在正确的下一个 token 上的概率成正比。在 cat 上压 0.9,基本就对了;压 0.001,就会被重重扣分。形式上这叫最大似然——调整参数,让真实的训练文本在模型看来概率尽可能高。
为什么它不需要标注
正是这个性质让规模化成为可能。大多数机器学习都需要标注样本:一张标着「猫」的照片、一条标着「正面」的评论。总得有人把这些标签造出来,这就给可用数据量设了上限。
语言建模没有这个上限。每个位置的标签就是下一个 token,而它本来就躺在文本里。数据自己给自己打标。这叫自监督学习,意思是任何写下来的文本都是现成的训练数据——没有标注环节,没有人在回路。
这就是为什么这个目标可以对着互联网上相当大一部分书面内容用。瓶颈从「有没有标签」转移到了算力,而这是一个完全不同、也宽松得多的约束。这个目标大规模跑起来是什么样,见模型是怎么预训练的。
怎么衡量误差
模型为正确的 token 输出一个概率,训练需要把它变成一个可以最小化的数字。标准做法是交叉熵损失:对真实下一个 token 所分配的概率取负对数。
对数在这里很关键。如果模型给正确 token 的概率是 1.0,损失就是 0——完美。随着这个概率往 0 掉,损失往无穷大爬。自信地答错,受到的惩罚远重于犹犹豫豫。一个分散下注的模型只受中等惩罚;一个把全部筹码压在错 token 上的模型,惩罚极其巨大。
在数十亿个位置上取平均,这个损失就是训练唯一往下压的量。模型最终变成什么样,全都是在为这一次下降服务。
目标本身很平凡,做好它很难
这一点值得多想想。目标本身是机械的,但把它满足好会逼着模型搭出真正的机器。
要预测 The trophy would not fit in the suitcase because it was too 的最后一个词——是 big 还是 small?——模型必须跟踪 it 指的是什么,并对「装不装得下」做推理。要预测一个代码块的收尾 token,它必须跟踪很多行之前打开的语法结构。没有捷径。在足够多样的文本上把损失压低,只能靠把语法、事实和逻辑内化进去。
这就是为什么能力被描述为涌现的。没人训练模型做算术。只是当文本里出现算术时,想预测下一个 token 就得会算——算术只是所需能力之一。完整论证值得一读,而机制就是:这个目标在逼。
教师强制
训练里有一个细节常让人意外。训练时,模型并不是自由生成、再拿自己的输出被打分。在每个位置,喂给它的都是训练文本里真实的前序 token,然后让它预测下一个。
这叫教师强制(teacher forcing)。它意味着每个位置都能并行训练——模型不必等自己前一步的猜测——这也是训练高效的很大一部分原因。麻烦在于训练和生成并不一致:生成时模型必须吃自己前面吐出来的输出,错误也一并吃下。这个落差,就是生成过程可能以训练中从未出现过的方式跑偏的原因之一。
目标没有规定的东西
这个目标说的是「预测训练数据里的下一个 token」。它没说要真实、要有用、要安全。纯按这个目标训出来的模型只是在模仿它的数据,包括数据里的自相矛盾和错误。如果它的训练文本倾向于用提问回应提问,它就会乐呵呵地接着问。
让模型表现得像个助手,是叠加在上面的另一个阶段,见基座模型 vs 对话模型。语言建模目标造出的是原始能力;它不负责瞄准。
要点回顾
- 目标就是最大化真实下一个 token 的概率——最大似然,仅此而已。
- 它是自监督的:标签就是下一个 token,本来就写在文本里,所以任何文字都是不用标注的训练数据。
- 交叉熵损失对自信的错误预测惩罚很重,训练最小化的就是它的平均值。
- 广泛的能力是涌现出来的——是在多样文本上把预测做好的必然结果,而不是一个单独的目标。
- 这个目标造出能力,但不瞄准能力;助手行为是之后的训练阶段。
下一篇: logit 与 softmax——模型的原始分数如何变成这个目标所要打分的概率分布。