第 13 课给这个模型下了诊断:装不下。装不下的解法是把它放大 —— 但在动手放大之前,有个更笨、也更该先做完的问题:你到底要喂给它多少道题?这一课我们把题库一道不落地数清楚(13,699 道), 把模型逐项放大(798,720 → 2,677,632 个参数), 然后真的训出来看乘除那两栏动不动。
先把话说死:这一课的题库不是「抽样」出来的。两位数只有 90 个(10~99)、一位数只有 8 个(2~9), 所以加法一共有 90 × 90 = 8,100 道、乘法 90 × 8 = 720 道 —— 这些数都是能拿计算器验的。 四类加起来 13,699 道,我们打算一道不漏地全喂进去。 下面第一站就先回答一个看起来最不像问题的问题:这一万三千多道,到底是哪一万三千多道?
训练之前,你至少得知道自己在训什么。 四类题目各自的数目都可以用一个整数算式写出来 —— 不是估的,是数出来的。 点每一张卡片下面的「这个数怎么来的?」,能看到那条算式的每一步。
数完还得能亲眼翻一遍。下面这个浏览器把 13,699 道题 按类分页列出来,编号从 1 连到总数:
你可能会问:第 3 课明明说语料是 4,000 条,这里怎么变成 13,699 了?两份都对,只是用途不同:
两份的读数规则完全一样(都是第 3 课那套 numToCn)、 词表也完全一样(那 21 个格子)。差别只在覆盖范围: 一个是抽样给你看的,一个是全量喂给模型的。 后面凡是出现「语料」「题库」这两个词, 在这一课里指的都是这份 13,699 道的全量版。
题库出全了,接下来是第 13 课开的第二副药:减小容量是治过拟合的, 可我们这里是反过来的病 —— 容量不够。 所以这一站要做的不是砍,是加。但加多少得有账: 模型的参数不是一坨,它能被拆成「一层的三个零件 × 层数 + 头尾」。
| 零件 | 算式 | 参数个数 |
|---|---|---|
| 一层 · 注意力块 | 4×128² + 4×128 | 66,048 |
| 一层 · FFN | 128×512 + 512 + 512×128 + 128 | 131,712 |
| 一层 · LayerNorm | 2×2×128 | 512 |
| 一层合计 | 66,048 + 131,712 + 512 | 198,272 |
| × 4 层 | 198,272 × 4 | 793,088 |
| 嵌入表 | 21 × 128(每个字一条向量) | 2,688 |
| 输出头 | 21 × 128(把向量打回词表分数) | 2,688 |
| 末尾 LayerNorm | 2 × 128 | 256 |
| 整个模型 | 上面这些全部加起来 | 798,720 |
还有一件事必须先钉死:词表真的只有 21 个格子吗。 训练之前把字典数清楚,和数题库一样重要 —— 因为词表大小 直接决定嵌入表和输出头这两块的参数(各是 vocab × d)。 这也是第 13 课那个 798,720 里唯一没变过的部分: 题库从 4,000 涨到 13,699,词表一个格子都不用改 —— 因为我们只教规则,不教「第 34 号符号」这种死记的东西。
题目和模型都齐了,可「喂进去」这一步还有个容易做错的地方: 一条样本是一整句「三十四加十二等于?四十六」, 但损失不是整句一起算的。 这一站把一条样本摊开,标出哪几个位置要算损失、哪几个必须置零。
最后那四根条形值得单独说一句:它们是同一条刻度(满格 = 100% 的训练样本)。 加法和减法几乎撑满,乘法只剩 4.35%、除法 4.84%。 所以「模型乘除差」这件事,在还没开始训之前就已经埋下了一半的伏笔 —— 它练乘法的机会只有练加法的 1 / 13.9。
前面三站都是「当场算」的账。这一站换一种数:真跑出来的实测记录。极速版在 Kaggle 单张 T4 上跑了 2,000 步(20~30 秒),每 500 步拿同一张 600 道的考卷考一遍。 下面这些数就是结果,页面上不重算 —— 训练结果没法「当场算」。
| 步数 | 训练 loss | 考卷(600 道) |
|---|---|---|
| 2,000 | 0.038 | 57.5% |
| 4,000 | 0.030 | 63.5% |
| 6,000 ★ | 0.004 | 67.3% |
| 8,000 | 0.002 | 66.5% |
| 版本 | 层数 | d | FFN | 参数 | 步数 | 训练时间 |
|---|---|---|---|---|---|---|
| ⚡ 极速版 | 4 | 128 | 512 | 798,720 | 2,000 | 20~30 秒 |
| 🐢 完整版 | 6 | 192 | 768 | 2,677,632 | 20,000 | 2~3 分钟 |
那完整版到底行不行?这一课只把账算到这里(2,677,632 个参数、6 层 d=192, 训练时间 2~3 分钟)。第 14、15 课接着走: 先解决「怎么把题目问得像人话」(对话格式与损失掩码), 再解决「这么大的模型怎么塞进一张显卡」(量化与 LoRA)。
训练之前,先把你手里的东西数清楚。题库是 8,100 + 4,095 + 720 + 784 = 13,699 道(加法一门就占 59.1%),考卷扣 600 道、训练集 13,099 道 —— 这几个数都能拿计算器复现。 模型是「一层三个零件 × 层数 + 头尾」,从 798,720 放大到 2,677,632 个参数(3.35 倍)。 一条样本里约 74% 的位置(题干) 要把损失屏蔽掉,只有答案才算账。 而实测表给出的判决是:加减 99.0%、乘除 34.0%,训练 loss 降到 0.002 也拉不动乘除 ——这不是没练够,是装不下。所以这一课的下一步是把模型放大。