到这里,你已经从零训练出了一个会聊天的模型。分词器是自己训练的,权重是从随机数一步步学出来的,对话格式(监督微调)是自己教的。
但多聊几句就会发现,它离"能用"还差得很远。
这一节把差距摆出来:它能做什么、不能做什么,差距来自哪里,又有多大。
学完你能做到:用一个公式估算训练任何模型需要的算力,理解为什么实战中几乎都是在开源基座上微调,以及这一章学到的东西在后面微调时怎么用上。
先说清两个词。"基座"是已经预训练好的模型,读过海量文字,会接话。"开源"是大家习惯的叫法,严格说是上一章讲的"开放权重":权重公开,任何人都能下载来用,比如前面已经下载过的 Qwen3.5-0.8B。
"微调"是在基座的基础上,用自己的一小份数据再训练一会儿,让它学会某件具体的事。
打个比方:从零训练,是从婴儿开始养,一路教到大学毕业;在基座上微调,是招一个已经大学毕业的人,做几天岗前培训就上岗。几乎所有人都选后者。
一、它能做什么,不能做什么
用 chat_mini.py 多问几个问题,大致会看到这样的情况:
| 能做到 | 做不到 |
|---|---|
| 回答的格式像回答,摆出一步步讲道理的架势 | 说出正确的事实,常常一本正经地编 |
| 句子大体通顺,常用的词语搭配正确 | 做算术、做推理 |
| 用默认配置训练后,多数回答能自己停下来 | 回答长一点就跑题、开始重复 |
| 接住"你好"这样的问候,说清自己是谁 | |
| 记住多轮对话里前面说过的话 | |
| 按复杂的要求输出特定格式 |
在我们的 CPU 缩小版测试里,问它几个常识问题,得到的是这样的回答:
你:中国的首都是哪里
模型:首先,中国是一个非常重要的国家。比如,很多国家有很多大人,有小动物和动物。因为在古人,他们喜欢一些新的生物,所以人们都很关心他们的国家。……
你:1加1等于几
模型:首先,我们知道,我们来想一想什么是“我”是什么。我想说:“你知道我,我不知道我。……作为对照,同样两个问题交给已经下载的 Qwen3.5-0.8B,用贪心解码生成,回答的开头是这样的:
中国的首都是哪里 → 中国的首都是**北京**。北京位于中国华北地区,是中华人民共和国的行政中心……
1加1等于几 → 1 加 1 等于 **2**。这是一个非常基础的数学概念,通常被称为加法运算……它只是 Qwen3.5 家族里最小的一个,也是后面课程助教的基座,参数却是我们自己训练的150 倍左右,背后的训练数据更是多出好几个数量级。
缩小版只有 500 万参数,训练也只有几百万 token,表现差在意料之中。用默认配置训练完全部数据,句子会通顺得多,但"事实不准、推理不行"这两条依然存在。
二、差距有多大:算一笔算力账
训练一个模型需要多少计算,有一个很好用的估算公式:
总运算量 ≈ 6 × 参数量 × 训练的 token 数为什么是 6?每个 token 经过模型时,前向传播大约要做"2 × 参数量"次浮点运算,反向传播大约是前向的两倍,合计约 6 倍。
"浮点运算"就是带小数点的乘法和加法。
模型里的参数都是 0.12、-0.53 这样的小数,所以它做的都是浮点运算。
前向为什么是"2 × 参数量"?看一个最小的例子:一个输出 = w1×x1 + w2×x2 + w3×x3。
3 个参数,要做 3 次乘法,再做 2 次加法把乘积加起来。参数一多,加法和乘法的次数几乎一样,所以算成每个参数 1 次乘法、1 次加法,一共 2 次。
反向为什么是前向的两倍?反向传播时,每个参数要算两件事:往前一层传回多少调整信号,以及自己该拧多少。这两件事的计算量都和前向差不多,所以是 2 + 2 = 4 次。
拼起来是这样的:

拿迷你模型试一下:2675 万个参数,训练 1.9 亿个 token,6 × 2675 万 × 1.9 亿 ≈ 3 亿亿次运算。亿亿就是 1 后面跟 16 个 0。
这个公式忽略了注意力计算等细节,但用来估算数量级足够了。
让我们对比一下迷你模型和两个千问模型。新建 compute_budget.py 文件,下面是代码: