机器怎么从例子里学到规律?
本课一问:我们想要一个程序:给它「小猫 喜欢 吃」,它告诉你下一个词大概是什么。这个程序里的「规律」从哪来?人写进去,还是让机器从例子里学?学,又是在学什么?
这一课先不碰:怎么量「错了多少」(第 2 课)、机器具体怎么调(第 3–4 课)、模型内部长什么样(第 5 课)、词怎么变成数(第 7 课)。这一课把它们都当成黑箱,只看一整圈「例子 → 调数字 → 规律」。
从已有出发
整章只用一句话打底:「小猫 喜欢 吃 ___」。它来自一次真实的学习对话,老师在那里说:模型看到「小猫 喜欢 吃」,正确答案是「鱼」;它猜错了,就产生一个 loss,再用反向传播把参数「往对的方向改一点点」。这一章把这句话里的每个词都拆开:loss 是什么(第 2 课)、往哪改(第 3 课)、梯度怎么算(第 4 课)……第一课先问最根本的:为什么要「调参数」,而不是直接把规律写下来?
- 手写规则 / 把例子背成一张表
- 带参数的模型:用例子调数字
- 交叉熵:正确答案概率的负对数
- 梯度下降
- 反向传播(反向模式自动微分)
- 非线性多层网络
- 验证集、早停与正则化
- 深度学习为什么是经验性的
- 词向量:按编号查表
按词切只是为了演示(「小猫 / 喜欢 / 吃」),真实模型怎么切分见 C1。
先自己设计:把例子背下来
最直接的程序是一张表:见过「小猫 喜欢 吃 → 鱼」,就记下来;以后遇到同样的前文,查表回答。人手写规则(「前面是小猫,后面填鱼」)是它的手工版。
它在见过的例子上一个字都不会错。问题在没见过的输入。拿一份真语料试:把《三國志演義》前 24,000 字当例子,背成「前 k 个字 → 下一个字」的表,再拿同一本书后面的 3,000 字去查:
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
数字来源:浏览器实时训练(纯 JS,Float64)。模型、语料、种子写在上方;同一组对照里所有 run 共用初始化和取批顺序,只改被比较的那一项。换种子重跑能看到噪声多大——差异小于种子间波动时不下结论。
换一种思路:不存例子,存一个带着可调数字的函数。先给这些数字随便的值,再拿例子去调,调到它对例子的回答尽量对。这样的函数对任何输入都给得出答案——包括从没见过的。下面的迷你模型只有 60 个可调的数,先让你亲手调其中两个。
上下文越长,越能猜准(「曰」后面几乎一定是「:」),也越不可能见过。背例子的办法两头堵死:短上下文见过但猜不准,长上下文猜得准但没见过。
数字来源:浏览器实时计算(纯 JS,Float64)。例子、初始化与种子写在组件说明里;按词切只为演示,真实切分见 C1。已用 Python 独立实现逐位核对默认设置下的全部读数。
试三件事:① 在左图里拖动圆点(「小猫」的两个数):右边三根绿条是三个小猫例子的正确答案拿到的概率,拖到最绿的地方也只有一成左右——点「只动这两个数:最好能到哪」,精确值是 8.0% / 8.3% / 9.1%;② 点「让机器把 60 个数一起调」:圆点和底色一起动(底色变,是因为另外 58 个数也在变),400 步后三个概率连乘从 0.00033 升到 0.904;③ 看下面表格的最后三行:「小猫 想 吃」「小猫 爱 喝」「小狗 爱 喝」都不在例子里,查表那一栏是「没见过」,模型照样给出答案:鱼 82.7%、奶 95.6%、水 96.7%。
改进:模型是一个带参数的函数
上面的迷你模型,写出来就是一行:
三个要点:
- 模型 = 一个函数 + 一组参数。 式子本身(相加、打分、softmax)是人设计的,固定不变;里面的 60 个数一开始是随机的。对话样本那句话说得对:这些数字不是人写进去的,是训练出来的。
- 学习 = 调参数,让函数的输出贴近例子。 上面第 ② 件事里,机器把 60 个数一起调了 400 步。它怎么知道往哪调?要先有一把量「错了多少」的尺子(第 2 课),再有算方向的办法(第 3–4 课)。
- 规律存在参数里,所以能用在没见过的输入上。 「小猫 想 吃」从没出现过,但「小猫」那两个数被 3 个小猫例子推向了「和鱼、奶打分高」的位置,「想」「吃」那几个数也各自被别的例子调过,加起来仍然指向「鱼」。查表存的是一条条例子,函数存的是被许多例子共同塑造的参数 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条「带参数的模型在没见过的输入上更好」不是定理:这里是迷你模型(教学构造)和下面的真语料小网络上的实测;模型设计得不好,同样会在新输入上胡说,第 6 课就会看到。 出处待补 。
参数常被比作「旋钮」。映射:每个旋钮 = 一个参数,转旋钮 = 改这个数,调台 = 让输出贴近例子。失效点:收音机的每个旋钮都有人能说清的作用(音量、频率),模型的单个参数没有——「小猫」的第 1 个数不代表「猫性」,换一个随机种子,训练出来的数完全不同,效果却差不多;而且旋钮是人一个一个拧的,几百亿个参数是按梯度同时挪的(第 3 课)。
真语料上也一样。下面是本章的「第三层」:一个 24,896 个参数的小网络(结构第 5 课再拆开),在浏览器里用《三國志演義》前 24,000 字从随机开始真训练:
数字来源:浏览器实时训练(纯 JS,Float64)。模型、语料、种子写在上方;同一组对照里所有 run 共用初始化和取批顺序,只改被比较的那一项。换种子重跑能看到噪声多大——差异小于种子间波动时不下结论。
试三件事:① 看表格第一行「」後主曰 → :」:第 0 步前 5 名全是 0%(随机猜),第 50 步「:」已经 75%,第 600 步 100%——「曰」后面跟冒号,这条规律没有人写进去;② 第三行「一萬五千 → 兵」到 600 步仍然没学会(第一名是「。」),模型学到的是高频规律,不是全部;③ 看验证 loss:从 5.550(和「在 256 个字里平均猜」的 ln 256 = 5.545 差不多)降到 3.606,而这些验证位置的 4 字上下文 97% 以上从没见过。换种子 2、3 再跑,数字会略有不同。
常见误解一:「模型把训练例子存起来,用的时候去查。」
不是。迷你模型只有 60 个数,真语料小网络 24,896 个数,存不下 24,000 条例子;它们给出的是一个对任何上下文都能算的函数。锚点模型 Qwen3.8 有 27,781,427,952 个参数,训练它的文本远比这多,道理相同。(模型确实可能把某些高频片段记得很牢,第 6 课的「过拟合」就是记过头了。)
常见误解二:「规律是人写进模型的。」
人写的只有式子的形状(相加、打分、softmax,以及后面几章的注意力、FFN);规律都在参数里,而参数是用例子调出来的。
常见误解三:「每个参数都有人能读懂的含义。」
「小猫」的两个数从 [0.20, 0.70] 被调到了 [3.24, 2.02],它没有「第 1 维 = 猫性」这种含义;换一个种子,调出来是另一对数。C1 第 6 课会用真模型再看一次。
🔍 「学习」这个词在这里的精确意思
机器学习里的「学习」只指一件事:按一个明确的目标,自动调整参数。目标是「让例子的答案概率尽量大」(第 2 课把它变成一个数),调整的办法是沿梯度的反方向挪一小步(第 3 课),梯度由反向传播算出(第 4 课)。它和人「理解」一件事不是一回事:模型学到「曰」后面接冒号,不代表它懂标点。
证据三问
| 问 | 本课的回答 |
|---|---|
| ① 它解决什么问题? | 例子只覆盖极少数输入:真语料上 4 字上下文只有 2.9% 见过。需要一个对任何输入都能给答案、又能用例子调整的东西 |
| ② 数学上为什么可能有效? | 查表对没见过的输入没有答案,这是定义 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条查表只存见过的键,没见过的键没有值;不需要实验。 出处待补 ;带参数的函数对任何输入都有输出,而一个参数被很多例子共同调整,所以它能把「小猫 → 鱼」这类共性带到新上下文里——这只是动机,不保证带对 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条参数共享让「在新输入上也对」成为可能,但不保证;什么样的函数形状能泛化得好,是后面各章的主题。 出处待补 |
| ③ 实验上呢? | 迷你模型:没见过的「小猫 想 吃」给鱼 82.7%;真语料小网络:4 字上下文 97% 没见过的验证集上,loss 从 5.550 降到 3.606 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条浏览器实训,默认设置;迷你模型种子 3,真语料小网络种子 1。换种子数字会变,结论不变。 出处待补 |
一句话
模型是一个带着可调数字的函数;学习就是用例子去调这些数字——规律存在数字里,所以没见过的输入也有答案。
先停在这里:记住「模型 = 函数 + 参数,学习 = 调参数」,就可以往下走。
再深一层:展开上面的 Dig;在迷你模型里换几个种子,看「开局」有多随机、训练后又有多一致。
下一个缺口
调参数得有个目标:怎么用一个数衡量「错了多少」? → 第 2 课:怎么量「错了多少」?
这一课让机器「一起调了 60 个数」,却没说它按什么调。第 2 课先造尺子,第 3 课再讲往哪走。
你可能会问
- 「为什么不直接写规则?人类语言学家不是总结过很多语法吗?」 规则能写,但写不全:上面真语料里 97% 的 4 字上下文是新的,任何规则表都会遇到没写到的情况;而且语言里大量规律是「概率」而不是「必然」(「小猫 喜欢 吃」后面可以是鱼,也可以是肉)。把规律变成可调的数,让例子去决定这些数,是整条深度学习路线的起点。它的代价在第 6 课:数调得太贴例子,也会出问题。
- 「这个迷你模型和 Qwen3.8 差在哪?」 形状一样(词变数 → 一个函数 → 每个词一个概率),规模差了几个数量级:Qwen3.8 的词表 248,320 个 token,每个 token 5,120 个数,参数 27,781,427,952 个;中间的函数也复杂得多(C2–C4)。
- 「深度学习的方法有多少是证明出来的?」 这一章会一路标出来,岔路课专门回答:深度学习为什么是经验性的?