从0训练LLM · 现代大模型体系 阅读 + 实验 ≈ 30 分钟 页内实验 ×3
D 深度学习地基:机器怎么从例子里学会规律 第 1 课

机器怎么从例子里学到规律?

从例子里学
想让程序补全「小猫 喜欢 吃 ___」,最直接的办法是把例子背下来查表——可《三國志演義》验证集里,前 4 个字在训练里原样出现过的只有 2.9%。改成一个带可调数字的函数:先随机,再用例子去调,规律存在数字里,没见过的输入也有答案。
❓

本课一问:我们想要一个程序:给它「小猫 喜欢 吃」,它告诉你下一个词大概是什么。这个程序里的「规律」从哪来?人写进去,还是让机器从例子里学?学,又是在学什么?

这一课先不碰:怎么量「错了多少」(第 2 课)、机器具体怎么调(第 3–4 课)、模型内部长什么样(第 5 课)、词怎么变成数(第 7 课)。这一课把它们都当成黑箱,只看一整圈「例子 → 调数字 → 规律」。

从已有出发

整章只用一句话打底:「小猫 喜欢 吃 ___」。它来自一次真实的学习对话,老师在那里说:模型看到「小猫 喜欢 吃」,正确答案是「鱼」;它猜错了,就产生一个 loss,再用反向传播把参数「往对的方向改一点点」。这一章把这句话里的每个词都拆开:loss 是什么(第 2 课)、往哪改(第 3 课)、梯度怎么算(第 4 课)……第一课先问最根本的:为什么要「调参数」,而不是直接把规律写下来?

从已有出发 · 从例子里学的一整圈(点任一环节看它在迷你模型和 Qwen/Qwen3.8-27B 里多大) 本课本章后面的课
训练一个网络要的东西,是一件一件被真数字逼出来的(点名字去那一课;完整版在章首页)
  1. 手写规则 / 把例子背成一张表
  2. 带参数的模型:用例子调数字
  3. 交叉熵:正确答案概率的负对数
  4. 梯度下降
  5. 反向传播(反向模式自动微分)
  6. 非线性多层网络
  7. 验证集、早停与正则化
  8. 深度学习为什么是经验性的
  9. 词向量:按编号查表
第一代带参数的模型:用例子调数字最小二乘 Legendre 1805、Gauss 1809;感知机 Rosenblatt 1958你在这里
解决了迷你模型的 60 个数一起调,训练里没出现过的「小猫 想 吃」也给「鱼」82.7%。
卡在「调到多好」要一个数来量。数错题:训练第 1 步平均 loss 从 2.583 降到 2.306,错题数还是 7/7——台阶上没有坡度(第 2 课)。
数字口径:one-hot 维数与乘加次数由锚点 Qwen3.8 的 config 构建时现算;迷你模型(种子 3)、四句组合题(种子 3)、真语料小网络(种子 1)的数字来自本章各课组件的默认设置,浏览器里现场复算;4.771 / 6.906 来自项目真实日志 d00-foundations.json。年份按原始文献核对(2026-09-26)。

按词切只是为了演示(「小猫 / 喜欢 / 吃」),真实模型怎么切分见 C1。

先自己设计:把例子背下来

最直接的程序是一张表:见过「小猫 喜欢 吃 → 鱼」,就记下来;以后遇到同样的前文,查表回答。人手写规则(「前面是小猫,后面填鱼」)是它的手工版。

它在见过的例子上一个字都不会错。问题在没见过的输入。拿一份真语料试:把《三國志演義》前 24,000 字当例子,背成「前 k 个字 → 下一个字」的表,再拿同一本书后面的 3,000 字去查:

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案把例子背成一张表(查表 / 手写规则)
把例子背成一张表:新文本里有几成能查到? 字级 MLP · 24,896 参数 · 《三國志演義》24,000 字 · 浏览器内真训练
等待开始(滚动到这里会自动开始)

数字来源:浏览器实时训练(纯 JS,Float64)。模型、语料、种子写在上方;同一组对照里所有 run 共用初始化和取批顺序,只改被比较的那一项。换种子重跑能看到噪声多大——差异小于种子间波动时不下结论。

上下文越长,越能猜准(「曰」后面几乎一定是「:」),也越不可能见过。背例子的办法两头堵死:短上下文见过但猜不准,长上下文猜得准但没见过。

你来调两个数 vs 机器调 60 个数:「小猫」的例子拟合得怎样? 迷你模型 · 12 个词 · 60 个参数 · 教学构造 · 浏览器现算

数字来源:浏览器实时计算(纯 JS,Float64)。例子、初始化与种子写在组件说明里;按词切只为演示,真实切分见 C1。已用 Python 独立实现逐位核对默认设置下的全部读数。

🎯

试三件事:① 在左图里拖动圆点(「小猫」的两个数):右边三根绿条是三个小猫例子的正确答案拿到的概率,拖到最绿的地方也只有一成左右——点「只动这两个数:最好能到哪」,精确值是 8.0% / 8.3% / 9.1%;② 点「让机器把 60 个数一起调」:圆点和底色一起动(底色变,是因为另外 58 个数也在变),400 步后三个概率连乘从 0.00033 升到 0.904;③ 看下面表格的最后三行:「小猫 想 吃」「小猫 爱 喝」「小狗 爱 喝」都不在例子里,查表那一栏是「没见过」,模型照样给出答案:鱼 82.7%、奶 95.6%、水 96.7%。

改进:模型是一个带参数的函数

上面的迷你模型,写出来就是一行:

迷你模型:给「小猫 喜欢 吃」后面的每个词一个概率(教学构造,60 个参数)
= ( · () + )
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
θ = {e、U、c} 一共 60 个数,就是这个模型的全部「知识」。同一个式子、不同的 θ,就是不同的模型;学习 = 找一组让例子的答案概率尽量大的 θ。

三个要点:

  1. 模型 = 一个函数 + 一组参数。 式子本身(相加、打分、softmax)是人设计的,固定不变;里面的 60 个数一开始是随机的。对话样本那句话说得对:这些数字不是人写进去的,是训练出来的。
  2. 学习 = 调参数,让函数的输出贴近例子。 上面第 ② 件事里,机器把 60 个数一起调了 400 步。它怎么知道往哪调?要先有一把量「错了多少」的尺子(第 2 课),再有算方向的办法(第 3–4 课)。
  3. 规律存在参数里,所以能用在没见过的输入上。 「小猫 想 吃」从没出现过,但「小猫」那两个数被 3 个小猫例子推向了「和鱼、奶打分高」的位置,「想」「吃」那几个数也各自被别的例子调过,加起来仍然指向「鱼」。查表存的是一条条例子,函数存的是被许多例子共同塑造的参数 。

参数常被比作「旋钮」。映射:每个旋钮 = 一个参数,转旋钮 = 改这个数,调台 = 让输出贴近例子。失效点:收音机的每个旋钮都有人能说清的作用(音量、频率),模型的单个参数没有——「小猫」的第 1 个数不代表「猫性」,换一个随机种子,训练出来的数完全不同,效果却差不多;而且旋钮是人一个一个拧的,几百亿个参数是按梯度同时挪的(第 3 课)。

真语料上也一样。下面是本章的「第三层」:一个 24,896 个参数的小网络(结构第 5 课再拆开),在浏览器里用《三國志演義》前 24,000 字从随机开始真训练:

从 24,000 个字里学:loss 和预测怎么变 字级 MLP · 24,896 参数 · 《三國志演義》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 课)。它和人「理解」一件事不是一回事:模型学到「曰」后面接冒号,不代表它懂标点。这条区分会一直用到后面:C12 讲后训练时,「学会听话」同样是按某个目标调参数。

证据三问

问本课的回答
① 它解决什么问题?例子只覆盖极少数输入:真语料上 4 字上下文只有 2.9% 见过。需要一个对任何输入都能给答案、又能用例子调整的东西
② 数学上为什么可能有效?查表对没见过的输入没有答案,这是定义 ;带参数的函数对任何输入都有输出,而一个参数被很多例子共同调整,所以它能把「小猫 → 鱼」这类共性带到新上下文里——这只是动机,不保证带对
③ 实验上呢?迷你模型:没见过的「小猫 想 吃」给鱼 82.7%;真语料小网络:4 字上下文 97% 没见过的验证集上,loss 从 5.550 降到 3.606

一句话

📌

模型是一个带着可调数字的函数;学习就是用例子去调这些数字——规律存在数字里,所以没见过的输入也有答案。

🚦

先停在这里:记住「模型 = 函数 + 参数,学习 = 调参数」,就可以往下走。
再深一层:展开上面的 Dig;在迷你模型里换几个种子,看「开局」有多随机、训练后又有多一致。

下一个缺口

调参数得有个目标:怎么用一个数衡量「错了多少」? → 第 2 课:怎么量「错了多少」?

这一课让机器「一起调了 60 个数」,却没说它按什么调。第 2 课先造尺子,第 3 课再讲往哪走。

你可能会问