锻造层 · 第 12 / 25 课 · 开始讲训练
预训练在算什么:损失与交叉熵
学完这课你能
- 说清预训练的唯一任务:把「猜下一个词」这一件事,在整座语料山上重复亿万次。
- 会算交叉熵:loss = -log(正确 token 的概率),概率越低罚越重,对数让「自信地错」被重罚。
- 对训练 loss 曲线建立体感:它就是这条判分公式在亿万次重复上的平均,会读陡降段与磨蹭段。
想象一座射箭场:每支箭离靶心越远,扣分越狠——脱靶的箭几乎清零。模型的每一次预测都是一箭,靶心是那个真正出现的词,而「扣多少分」这张记分牌,就叫损失。
01亿万次完形填空
第 3 课你看过了「做一次」:给模型一串 token,它给词表里 50304 个候选各打一个分,softmax 之后就是概率。预训练做的事没有任何玄机——把这一次判分,在整座语料山上重复亿万次。取一段文本,让模型猜下一个词,用「正确答案」判分,按分数微调权重,挪到下一段,再来。语料 × 判分 × 微调,循环到底,这就是全部。
「微调权重」这一步具体怎么改,是下一课反向传播的事;本课先把「判分」这一环看透——它决定模型朝着什么方向变好。
02判分规则:-log p
判分公式叫交叉熵,白话版只有一行:看模型给「正确词」的概率 p,罚 0 到 10 分上下——罚分 = -log p(自然对数)。概率 0.9,罚约 0.1 分;概率 0.01,罚约 4.6 分;概率 0.0001,罚约 9.2 分。取对数是个精明的选择:把「自信地错」变成重罪——你把正确词的分数压得越低,惩罚涨得越快。
先记住结论:答对了也可能被扣分,因为 p 从来不是 1。等会儿你亲手当一回模型,就能摸到这个手感的底线在哪。
03你来当一次模型
下面的实验台给了 5 道真题。每道题给一句上文和 6 个候选词——概率全部是从 pythia-14m 真实前向里导出的,不是编的。你点选一个你猜的词,实验台现场算出 -log p,扣分条应声落下。连做 5 题,平均分就是「你的交叉熵」。
值得玩味的是第 4、5 题:你明明知道正确答案,概率条却薄得可怜——14M 的小模型确实还没学会世界知识,正确答案只能拿到万分之几的概率。训练要填的坑,就是这些。
04从一道题到一条曲线
一次判分只是一个点,训练曲线上的一滴水。把亿万次扣分做滑动平均,再按训练步数画出来,就是你在论文里常见的那条「loss 曲线」。真曲线带着噪声——因为每一批题不一样,平均分自然上下抖——但大势一目了然。
读曲线有个窍门:开头陡降,是模型在学会高频搭配和固定格式,最容易摘的果子;后面越降越慢,是在抠长尾细节。实验台里那条可播放的曲线是一条真实训练记录(微模型,300 步),你可以拖着进度反复看这两个阶段。
05权重怎么被改
到目前为止,loss 只回答了「差多少」。它像裁判手里的记分牌——但记分牌本身不会教箭手射准。怎么把「差多少」翻译成「每颗参数往哪边调、调多少」,是反向传播的工作,下一课你就在浏览器里亲手训一只模型,看 loss 在你自己眼前掉下去。
交互实验:你来当模型 + 真训练曲线回放
组件加载中…
组件一:5 道题的候选概率是从 pythia-14m 真实前向导出的真值(2026-10-14,本站引擎,词表 50304),你点选后扣分 -log p 由浏览器现场计算——不加载模型也能玩。组件二:训练曲线是微模型(3.5 万参数)真实离线训练的记录回放,数据来自 tools/study-phase2/gen-zoo.mjs(seed 42,2026-10-13),进本实验区才开始加载(~290KB,与第 16 课共用)。
组件加载中…(你来当模型 + 曲线回放需要 JavaScript;正文不受影响)
组件加载失败。
降级方案:曲线包加载失败时自动切换内置真实导出数据(同一条曲线的降采样)继续回放;判分组件为纯本地计算不受影响。图文正文不受影响。