这一章先摆好一条自己能走通的主线,再给每块数学配一个最小例子:变成数、猜、打分、找方向、拧一步、考新题。
每一站停下来问一件事:这里的数学到底在做什么。不需要先翻别的章节,也不强迫所有概念共用同一组数字。
这不是前置课,卡住了再翻回来就行。
后面六站都在研究同一件事:拿一批带答案的数据,调整模型里的权重,让它对没见过的新数据也猜得准。这里用一个只有两个特征的小分类器把主线先摆出来。
x:一张小图片
[亮度, 有没有竖线]x = [0.8, 1]
已经是一串可计算的数w = [w亮, w竖]
z = w·x + bz → 概率 p
和答案比,得到损失
你可以把它想成一台只有两个旋钮的机器:两个特征各乘一个权重,再加上偏置 b,得到分数 z;分数再变成“像不像目标”的概率 p。数据还给出正确答案,损失函数把“猜得有多偏”压成一个数。后面说“点积、概率、损失、梯度、步长”,都在拆这条流水线的不同位置。
上面这个两个特征的小分类器,会把表示、点积、概率、损失、梯度、更新和泛化串起来。
学习是一圈六个站:变成数、猜、打分、找方向、拧一步、考新题。 数学的作用,就是给这六站各配一个零件。下面先看零件和站怎么对上,再一站一站打开。
点一块数学:看它撑着学习这一圈的哪几站,拿掉会卡在哪
线性代数让数据能算(①②)。微积分让改进有方向(④⑤)。 概率与信息论让「猜得好不好」和「没见过的数据」能被量出来(③⑥)。
接下来六站逐个打开,每站固定回答三件事:卡在哪、数学做了什么、为什么这样够用又在哪不够, 接下来六站逐个拆开这条小分类器的流水线。
把东西变成数字,叫表示或编码;拿这些数字做加、乘、距离和变换,才是线性代数在做的事。
线性代数不会自己把“猫”认成 49 个数。人或前面的编码器先规定:这张图片看像素,这句话先切成词再查向量;线性代数接手的,是已经排好的一串数。
2×2 灰度图
亮、暗、亮、暗[[1, 0],
[0.8, 0.2]] → [1, 0, 0.8, 0.2]和另一串数
做点积、距离、矩阵乘法但“猫”不会自己带着一串数字。我们先要规定一种表示协议:用相机取多少像素、每个像素记录亮度还是 RGB、矩阵按什么顺序摊平。换一套协议,得到的向量就会不同;向量本身也不会自动保留“这是猫”的意义。
一个手写数字 1,怎样按约定变成向量
这是一个 5×5 的手写“1”:1 表示笔画所在的深色像素,0 表示背景。这里选择“逐行展开”,所以矩阵第一行接着第二行,得到右边那串数。
这一步有两个容易混在一起的词:矩阵是把数字按行列摆好,方便保留“谁挨着谁”;向量是一列数字,方便统一做点积和矩阵乘法。它们装的是同一批数字,只是排法不同。把矩阵打散会让通用的线性代数更方便,却可能丢掉像素的邻近关系,所以 CNN 会保留矩阵的格子,ViT 会先切成小块再变成向量。
文字没有天然的“第几行第几列”。常见做法是先用分词器把句子切成词或词片段,再给每个片段一个整数编号;编号只是标签,305 不比 12 更“像猫”。真正拿来计算的向量,是用这个编号去一张可学习的表里查出来的那一行。
我 喜欢 猫我 | 喜欢 | 猫12 | 87 | 305猫 → [0.21, −0.08,
0.44, 0.17, …]这张表叫嵌入表:每一行对应一个词片段,每一列是一个可学习的坐标。训练会调整这些行,让出现在相似上下文里的词片段在向量空间里更接近;“猫”这个意义不是编号自带的,是训练把它写进了这一行数字里。
所以“文字变成数”至少有两层:编号让机器知道该查哪一行,向量才让点积、距离和矩阵乘法有意义。图片的像素、文字的嵌入,最后都能交给线性代数,但它们前面的表示协议完全不同(可继续看分词和向量嵌入)。
这里不再解释图片或文字的编码,而是用一个数轴上的点 x 演示“同一个输入可以从多个角度写出来”。它先被表示成 8 个数,旋钮才有东西可乘。图片和文字讲清“表示”以后,再看这个更适合做数学实验的版本。
先看这一步最朴素的版本:把一张 7×7 的小图,直接按像素排成 49 个数(亮的记 1,暗的记 0)。再用最直接的办法比两张图:对应的像素逐个相乘再加起来,叫点积,除以两张图各自的“长度”,得到 0 到 1 的相似度。点积正式登场是在下一站。
表示实验:7×7 的数字 1,直接排成 49 个数
上面那个“相似度”,写成式子是下面这一条。把鼠标放到式子里的字母上,上方对应的图会亮。
把「1 往右挪几格」拖到 1 或 −1:人一眼认出还是 1,但按像素直接比,它和原图的相似度比一个 7 还低。
这说明:光把东西排成数还不够,怎么排决定了「近」是不是你想要的近。 后面的词向量、卷积、ViT,做的都是让网络自己学出一种排法,使意思相近的东西真的靠在一起。
这里的“变成 8 个数”不是魔法,也不是把一个数字凭空复制 8 遍。贯穿本章的这个小例子里,x 本来就是一条数轴上的一个数;我们准备 8 个不同的“小镜头”,把 x 分别代进去。这样,后面的 8 个旋钮就能分别看原值、平方趋势、弯曲趋势……再把它们合起来画出弯的曲线。
先展开一格:x = 0.40 怎样算出前 4 个数
这 8 个“小镜头”在数学里叫一组特征;本例用的是一组互相配合的多项式(前几项写在图里)。所以 x=0.40 会得到 [1, 0.40, −0.26, −0.44, …]。它仍然只代表同一个 x,只是从 8 个角度把它写出来,方便后面的旋钮组合。
回到那一圈:8 个特征分别乘上 8 个旋钮,再加起来
上面一直说“离得近”,近要有一把尺。先要一把量“一串数有多大”的尺,叫范数,写作 ‖w‖。
最常用的两把:L2 是直线长度(各项平方相加再开方),L1 是各项绝对值相加(像出租车在街区里走的路程)。
两点之间的距离,就是它们之差的范数。余弦相似度的分母,用的也是 L2 长度(见向量嵌入)。
尺子不是只有量的用处。限定“范数不超过 r”,就是给旋钮划一个活动范围。下图的灰色椭圆是只看练习册时的“错”(圆心是只看数据的最好旋钮), 橙色形状是允许的范围,白点是范围内最好的旋钮。换一把尺,范围的形状就变了。
同一道限制,换一把尺子:范围的形状不同,选出来的旋钮也不同
把 p 拖到 1:范围是个带尖角的菱形,白点正好落在尖角上,第二个旋钮被压成恰好 0,等于被关掉了。
拖到 2(圆):白点停在边上的某处,两个旋钮都不为 0,只是变小了。这就是正则化里“L1 能让旋钮变 0,L2 只能让它变小”的来由:尖角是 L1 的形状带来的。
一个向量有几百上千个数时,空间的性质会变。直觉全部来自二维三维,到了高维要亲手量:随机挑两个方向,夹角到底多少度?
核心大图 · 量一下:随机两个方向,夹角到底多少度
每次拖动都真的生成 1000 组随机向量,真的算点积和夹角。 横轴是夹角,纵轴是有多少次落在这个角度。
把维度 d 从 2 拖到 1000。看那根白色竖线(90°):
d = 2 时,夹角散布在整个 0°~180°;d = 1000 时, 几乎所有夹角都挤在 90° 附近——分布被压成了一根尖刺。
这就是高维最反直觉的一条:在那个世界里,「随机」约等于「正交」。
它解释的是:两个无关的东西,内积几乎是 0,所以一个高维向量里能同时放下很多互不干扰的方向;也解释了为什么高维里「距离」会失去区分度。
内积为什么能当相似度,是 ② 里那张箭头图的事:两个箭头越同向,点积越大。
向量里的「近」有两把尺:距离(差多远)和夹角(方向同不同,② 里的点积箭头图)。 文字和图片没法直接量,所以先编号、再查表换成向量(见分词、向量嵌入)。 不够的地方就是上面那一幕:原始排法里的近不等于意思上的近,得靠训练把排法本身学出来。 高维里随机方向几乎互相垂直(上面那张夹角图),所以一个向量放得下上万种不同的东西而不打架。
一根箭头可以用两个数记下来:从起点到箭头尖,横着走多少、竖着走多少,这就是它的横坐标 x、纵坐标 y;向右、向上记正数,向左、向下记负数。两根箭头做点积,就是横坐标乘横坐标、纵坐标乘纵坐标,最后把两项加起来。
把两根箭头的坐标配成两对:拖到夹角 90°,看两项怎样抵消
两根箭头垂直时,两项会刚好抵消,点积为 0;夹角小于 90° 时点积为正,大于 90° 时为负。长度固定时,越同向点积越大;把 b 拉长也会放大点积,所以它同时受方向和长度影响。
回到“猜”:把 a 当输入、b 当两个权重,横坐标这一对就是“第一个特征 × 第一个权重”,纵坐标这一对就是“第二个特征 × 第二个权重”。加起来得到分数,再加偏置、经过激活函数,就接回本章开头的小分类器。
再看矩阵乘向量:一张表乘一排数 = 每一行和它各做一次点积
把很多个点积叠在一起,就是矩阵乘向量。画在平面上,矩阵是对整块平面的一次拉、转、压。
把很多个点积放在一起看:拖动四个数,看整个平面被怎么拉转压
① 两根彩色箭头=基向量的去向(也就是矩阵的两列)。 ② 方格变成的平行四边形=面积放大几倍就是行列式;变负说明翻了个面。 ③ 两条虚线=特征方向:只有这两个方向不会被转歪,只会被拉长。
点「压扁」那个按钮:行列式会跑到 0,整个平面被压成一条线—— 这就是「秩塌陷」,也是 LoRA 那一章「低秩」说的事。
再点「翻面」:行列式变成负数,数值大小没变,但方向整个镜像了。 「行列式可以是负的」这件事,绝大多数教材只给公式不给画面。
这个小实验里的猜,就是 8 个数各自乘上旋钮、再加起来(一次点积)。点积本身永远只能画直线, 弯是从哪来的?下面拖「折的次数」,看一串折线怎么逼近一条弯曲线。
折几次,才能追上那条弯曲线
“点积 + 折”写成式子:每一段折线是一个“折”,旋钮 w 决定这一折有多陡。
先点「只叠线性层」,再把层数拖到 100:线还是同一条直线,误差一点没变。矩阵乘加偏置,叠多少层都还是一次「拉一拉、转一转」。
切回「加一次折」,每多一个折点,误差就掉一截。弯,全是折出来的,这一站的名字里,「折」才是关键。
一个 20×20 的矩阵有 400 个数。如果它其实只是几个“竖条 × 横条”的图案叠在一起,这 400 个数里大部分是重复的。 奇异值分解(SVD)把任何矩阵拆成一串“图案 × 重要度”,重要度从大到小排。 只留前 k 个图案,就是秩 k 近似:存 k 对竖条和横条(共 k×40 个数)就够了。
只留前 k 个图案:左边是原矩阵,右边是用 k 个图案拼回来的
从 k = 0 往右拖:k = 1 时误差还有 39%,k = 2 是 11%,k = 3 时掉到 2% 以内,只用了 120 个数;再往后加,右图几乎不再变,那些是噪声。
这张表是人造的:我们叠了三个图案再加了噪声,所以柱子在第 3 根之后突然掉下去。真实的权重矩阵不一定这么干净。 LoRA 赌的是:微调时要改的那部分近似低秩,所以只训练两个小矩阵就够了;自编码器的瓶颈层也是同一个想法。
「线性变换 + 折」反复叠,原则上能逼近很多函数,这叫万能逼近。但它只保证存在这样一组旋钮: 不保证你找得到,不保证要多少个旋钮,更不保证它在没见过的数据上也对(那是 ⑥ 的事)。 上图的折线是等距折点的一种做法,不是最优的,真实网络的折点位置是训练出来的。 点积本身就是上一小块那张箭头图:两个箭头越同向,点积越大。
网络最后一层算出来的是一组随便的数,可正可负,叫分数。要当概率用,必须都是正数、加起来等于 1。
softmax 的做法很直接:每个分数先取 exp(保证为正;而且分数每差 1,对应的数就差 e ≈ 2.7 倍,所以猫比狗高 1 分,猫的“份额”就是狗的 2.7 倍),再除以总和(保证加起来是 1)。
四个分数变成四个概率:拖一拖,看哪些量真的有影响
softmax 的式子,T 就是上面的“温度”。
拖「全体加同一个数」:四根概率柱纹丝不动。只有分数之间的差有意义,这一条后面会用来解决数值溢出。
拖「温度」到 0.2:概率几乎全集中在最高分上,接近“直接选最大”;拖到 3:趋近平均。语言模型生成时调的“温度”就是它(文本生成与采样)。
一句话的概率怎么算?不是去数这句话出现过几次,而是一个词一个词地问:“看到前面的,下一个词是它的概率多大”,再把每一步的概率连乘起来:
p(整句) = p(词₁) · p(词₂ | 词₁) · p(词₃ | 词₁词₂) ·…。
竖线读作“在……的条件下”,叫条件概率;这个拆法叫链式分解。语言模型的“下一个词预测”就是这样;扩散模型每一步去一点噪声,也是同样的连乘结构。
一个只有 8 句话的迷你语言模型:每一步的概率,和整句乘起来的结果
先看“我 爱 吃 苹果”,再看“苹果 吃 爱 我”:同样四个词,顺序一乱,整句概率掉了七八个数量级(读数里能看到)。开头和结尾也各算一步。乱序那句每一步只有百分之一二,连乘五次就是十亿分之一。
注意:这个迷你模型只看前一个词,真正的大模型看的是前面全部内容,但“逐步问、再连乘”的结构一样。连乘出来的数小得没法直接用,下面就是为什么要取对数。
硬币抛了 13 次,9 次正面。「正面概率是 p」这个说法,对这批数据解释得有多好?
把每一次的概率乘起来,就是这个说法的似然。再取负对数、除以次数,就是“平均每次有多意外”。
单位提醒:取 e 为底的对数,单位叫奈特;取 2 为底,单位叫比特(后面的“暗号”那一小块用比特)。两者只差一个固定倍数(1 奈特 ≈ 1.44 比特),不影响谁更好。拖 p,再拖抛的次数,看乘出来的数发生了什么。
同一枚硬币,同样的 9/13 正面:似然和「平均意外」随 p 怎么变
把“逐项连乘取负对数”写成式子,就是训练里的损失:
把抛的次数拖到最大:似然小到计算机的小数装不下(双精度最小约 10−308),但「平均意外」依然是个好好的、一眼能比大小的数。
两条曲线的最好点是同一个 p。取负对数没有改变「谁最好」,它只做了两件事:把连乘变成连加,把小到装不下的数变成能比的数。
取了负对数,就能给“意外”一个单位:比特。你给朋友发天气预报,常出现的天气用短暗号,罕见的用长暗号,最省的平均长度就是熵。模型学偏了,相当于拿了一套不合适的暗号表,消息变长,多付的那部分比特叫 KL 散度。
核心大图 · 两排柱子,一条差额
这两排柱子在《损失函数》那一章还会再出现一次:交叉熵的主场在那里。
KL 散度的家在这里。KL 不对称:KL(p‖q) 和 KL(q‖p) 一般不相等,
各章里的哪个在前、哪个在后,决定了它惩罚的是哪种错。
把「模型有多懂」拖到最右边:粉色差额条会真的归零。
再往回拖一点点:只要不是完全一致,KL 就立刻大于 0。 这就是为什么「差不多学对了」和「学对了」差得很远。
上面硬币那张图展示的是下溢:连乘的数小到装不下。softmax 还有上溢的问题:exp(100) 已经超出常用的 32 位浮点数能表示的最大值,变成“无穷大”,一除就成了无意义的 NaN。
办法正是 softmax 那张图里验过的性质(“全体加同一个数,概率不变”):全体减去最大的分数,概率不变,这样最大的那一项变成 exp(0) = 1,不会爆。取对数时同理(log-sum-exp 技巧)。
同样的四个分数,放大它们:直接算会崩,先减最大值就稳
把“分数放大倍数”往右拖,最大分数一过 约 89(放大 30 倍时是 90):上面一行变成 NaN(无意义),下面一行丝毫不变。分数这么大并不罕见:训练刚开始的随机初始化、或者没做归一化的深层网络里都可能出现。
这里的上限是模拟的 32 位浮点(最大约 3.4×1038,即 exp 的参数不能超过约 88.7);混合精度训练里用的 16 位范围更小,更需要这个技巧(归一化层、初始化)。
这条线有条件:模型输出的是一个归一化的概率;样本之间可以连乘;没有额外的惩罚项。加了惩罚项,就成了最大后验(MAP):除了“数据解释得好”,还要求旋钮符合一个事先的偏好(先验),例如“旋钮最好小一点”。正则化里的那场拔河,就是这个。 满足时,「最大似然 = 最小化平均意外 = 最小化交叉熵」是同一件事, 平方误差只是「误差服从固定方差的高斯」时的特例(⑥ 里的中心极限定理解释了高斯为什么常见)。 不是所有损失都这么来:铰链损失、GAN 的对抗目标、强化学习的期望回报、对比学习的目标,都套不进这一句。 「意外」的度量(比特、KL)就是上面那一小块。
「逐个试」就是:把一个旋钮拧一点点,重新算一遍错误,错误变化多少 ÷ 拧了多少,就是这个旋钮的导数(定义本身;⑤ 站里那张放大图讲了它为什么等于切线斜率)。参数越多,逐个试就越贵。 反向传播一遍走完,靠的是链式法则:整串变化的倍数,等于每一段的倍数相乘。先看成本,再看它和「逐个试」算出来的方向是不是一回事。
算出全部旋钮的方向,要付多少次「前向」
“逐个摇一摇”的定义,就是导数的近似:把旋钮拧一点点 ε,看错误变多少。
把旋钮数从 8 一路拖到 1011:上面一根条跟着旋钮数一起长,下面一根纹丝不动。
下方那行读数是真算的:8 个旋钮,「逐个摇」和「链式法则」算出的方向一致到小数点后很多位。省下的不是精度,是时间。
链式法则说:整串变化的倍数,等于每一段的倍数相乘。乘法有个后果:任何一段接近 0,整串就塌;每段都略大于 1,整串就炸。
核心大图 · 四个因子连乘,缺一个就断
拖任意一段的「局部导数」,看最下面那根总责任怎么变。 目标:让总责任不要变成 0。
把任意一段拖到接近 0 —— 不管其他三段多大,总责任立刻塌到 0。
这就是「梯度消失」的完整机制,不需要任何公式: 二十层就是二十个数连乘,只要它们平均小于 1,乘到最后就没了。
反过来,把四段都拖到 1.4 左右 —— 总责任会指数级炸掉。这就是梯度爆炸。 残差连接、归一化、精心设计的初始化,全都是在跟这一根乘法链条做斗争。
一个输出、海量输入的时候,从输出端往回走,每一步只做「向量乘矩阵」,总成本是一次前向的几倍; 代价是要记住前向时每一层的中间结果(显存就是花在这里)。 要小心两个常见说法:反向传播只负责算方向,不是整套学习,走多远是 ⑤ 的事; 它不是「把责任分摊」,而是沿路径把局部放大倍数乘起来,所以某一段接近 0,整串就塌了(上面那张连乘图能拖着看)。
任何光滑的曲线,放大到足够近都像一条直线(地球是圆的,你脚下那块却是平的)。“直线”是我们唯一真正会算的东西,所以沿坡走一小步是可信的。
核心大图 · 同一个函数,放大三次
三段画的是同一个函数,只是视野越缩越小。注意绿色虚线—— 它是那一点处的切线;放到最后,曲线和切线已经分不出来了。
切到第 ③ 段,再拖动「放大的中心点」:每次放大后得到的那条「直线」,斜率都不一样。
那个斜率就是导数。「不同位置有不同的直线」这件事,就是「函数在变化」的严格说法。
这里切到数值实验室的 8 个旋钮:下面是它的「弯度」(海森矩阵的特征值),和不同步长下的 40 步训练。主线里的两个权重只是同一件事的最小版本。
拖步长:同一个问题,40 步之后错误变成多少(对数刻度)
“沿坡走一步”写成式子,右边是不会发散的步长上限:
把步长一点点拖过 1 倍:错误从稳稳往下,变成来回震荡、越震越大。这个上限是算出来的,等于 2 ÷ 最弯方向的弯度。
再看左边:步长再小,曲线也下降得很慢。因为最平的方向弯度比最弯的小两百倍左右,最弯的方向限制步子,最平的方向决定要走多久。
真正的方向要把练习册里每一条的错都平均一遍。数据有几百万条,每走一步都算全部,太贵。 办法:每次随机抽一小把(一批),用这一把的平均当方向。算不动的平均,用随机样本的平均去代替,这种做法统称蒙特卡洛。 同一个想法还出现在 VAE 的采样、强化学习估计回报、扩散模型的训练目标里。
每批抽 b 条,重复 200 次:200 个“估出来的方向”落在哪
批大小 = 1:200 个点散得很开,平均夹角余弦只有 0.35,方向几乎是乱的,但平均下来仍围着十字转,没有系统性偏向某边。
批大小 = 64:点缩成一团,余弦到 0.96。读数里能自己验:批大 64 倍,散布缩小约 8 倍(√64)。这条 1/√n 的规律,⑥ 会用另一个例子再讲一遍。
每一步是“新位置 = 旧位置 − 步长 × 方向”。如果把步长缩到无限小,一步一步连成一条光滑的线,这条线满足:位置变化的速度,等于当前位置处的方向,
写作 dw/dt = −∇L。这类“速度由当前位置决定”的方程叫常微分方程(ODE)。
梯度下降就是用欧拉法(每次沿当前方向直走一小段)去解它;前面那条“步子不能超过 2÷最弯方向的弯度”,就是欧拉法稳不稳的边界。
一个会旋转着缩进中心的系统:用 N 步欧拉法去走,和真实轨迹比
把步数 N 一路往左拖:N 大时橙线贴着蓝色螺旋缩进去;拖到 21 附近,橙线不再缩,开始越转越远。这个边界是算出来的(步长 < 2λ÷(λ²+1)),和梯度下降里“步长 < 2÷弯度”是同一类现象。
扩散模型和流匹配生成图片,也是从噪声出发,沿着一个学出来的速度场解方程;“采样步数”就是这里的 N,更好的求解器能让 N 更小(一致性模型想一步到位)。 这里的系统是人造的线性例子,真实的速度场是网络学出来的,扩散里还带随机项。
局部是直线,所以沿负梯度走一小步,错误一定下降;「一小步」多小,由弯度决定,这就是学习率要调的原因。 真实网络的弯度分布、以及「鞍点比局部极小更常见」(Dauphin 等 2014,是统计物理式的论证,不是定理)会让情况更复杂; Adam 之类的优化器就是在给每个方向配不同的步子(优化器谱系)。 「放大就变直」在不可导的点上不成立(比如 ReLU 在 0 处没有切线),上面那张放大图永远挑一个光滑的点给你看。
这里仍是数值实验室的 8 个旋钮,这次变的是练习册有多厚。每个厚度重复 31 次(每次重新抽点),取中位数;这里直接解出每次最好的 8 个旋钮,不是一步步拧(所以 8 个点时能被 8 个旋钮完全穿过)。
数值实验室:练习册厚度 vs 练习册错误 / 新题错误(8 个旋钮固定)
把厚度拖到最左(8 个点):8 个旋钮正好能把 8 个点全穿过去,练习册上的错是 0,新题上的错却很大。
慢慢加厚:蓝线上升、橙线下降,两条线最后贴到同一条灰线上。灰线是噪声决定的底,再好的模型也低不过它。
本小节一条因果链:大数定律(会靠近)→ 中心极限定理(怎么靠近)→ 正态分布(靠近时的形状)
先把三个词说成人话。整体:所有可能遇到的题。样本:你手上这一批练习册。 期望:整体的平均错(比如平均错 1);方差:各题的错散得多开(有的题错 0.1,有的错 5,散得越开方差越大)。 统计学只回答一个问题:只看到样本,能对整体说什么,说得有多准。
样本越多,样本平均越准:每次抽 n 个,重复 500 次,看这 500 个平均散成多宽
把 n 从 1 拖到 400:直方图变窄,也变得对称。读数里“实测的散布”和“理论 σ÷√n”会贴在一起。
想让估计准一倍,要多收四倍的数据,不是两倍。评测里的“误差棒”(评测与基准)、归一化和初始化里的“方差相加”,用的都是这一条。
| 定理 | 在上图里是哪一块 | 说的是什么 |
|---|---|---|
| 大数定律 | 直方图的中心(橙线) | 抽得越多,样本平均越靠近整体的平均。所以“练习册上的平均错”才能估计“新题的平均错” |
| 中心极限定理 | 直方图的宽度和形状 | 样本平均怎么围着整体平均散开:宽度是 σ÷√n,形状越来越像钟。不管整体本身是什么形状(上图的整体是偏的),只要抽得够多、互相独立 |
| 正态分布 | 最后那个钟形 | 上面两条合起来的结果。“误差默认是高斯”并不是谁规定的,而是很多小原因加起来,必然长这样 |
再换一个整体看一遍:下面是骰子。一个骰子是平的(1 到 6 每个概率一样);把很多个骰子的点数加起来,形状自己长成钟。 这是一次精确计算,不是模拟(把每个骰子的分布一次次卷积)。
核心大图 · 拖骰子个数,看形状自己长出来
柱状图是精确算出来的(把每个骰子的分布一次次卷积),不是模拟。 白色曲线是理论上的高斯分布。骰子越多,两者越贴合。
把骰子数从 1 拖到 12,盯住两件事: ① 形状从平的变成钟形;② 白色理论曲线越来越和柱子重合。
一个误差往往是很多个小原因加起来的结果,所以它常常长成钟。
评测的误差棒用中心极限定理:取平均则除以 n,散布按 1/√n 缩小。 初始化和归一化里“方差被乘了几次”用的是方差相加:独立的随机量加起来,方差也相加。 “噪声默认是高斯”让平方误差等于最大似然(见 ③)。不成立的地方:这三条都要求样本互相独立;同一批训练数据里相关的样本越多,有效样本数越少,估计就没有看上去那么准。
同样的道理用在旋钮上:换一批练习册,拧出来的旋钮就不一样。下面还是数值实验室这 8 个旋钮的曲线,同一条真实规律,每次抽一批新点重拧,一次画 12 条。
同一条规律,换 12 批练习册,12 套旋钮拧出 12 条曲线
换一批练习册会晃多少,写成式子。下面的读数只取了 x = 0.5 这一个点,所以是这一点的偏差² 和方差;完整的分解还有一项“噪声”,这里单独不看:
点数在 8~12 时,12 条曲线乱飞:每条都穿过自己的练习册,彼此却差得很远。这就是方差大,也是此前新题错那么大的原因。
点数拖到 160:曲线挤成一束,而且贴着蓝线(x = 0.5 处晃动从 5.7 降到 0.04)。读数里的两个量:偏差是 30 批预测的平均偏离真值多少,方差(读数里取了平方根)是换一批会晃多少。点数多了,两个都趋近 0。 “过拟合”说的就是这种方差大;正则化是故意让旋钮受约束,换来方差下降,代价是引入一点偏差。
「练习册 ≈ 新题」靠的是独立同分布这条假设:每个样本互不影响,且都来自同一个整体。一旦新题和练习册不是一个来源(或者抽样互相有关联),整个保证就没了(数据增强与迁移、评测)。 在旋钮比数据少时,上图就是经典讲法:正则化是给旋钮加约束。 但现代网络的旋钮常常远多于数据,仍能泛化,测试误差还会出现「双下降」, 这一块经典理论只能解释一部分,仍是研究前沿;本章只借这个小实验展示它为什么会出现。 高维直觉(① 里随机夹角那张图)解释的是另一件事:数据其实只住在高维空间里很薄的一层。
| 身份 | 它在哪 | 它的作用 | 怎么对待 |
|---|---|---|---|
| ① 数据里的噪声 | 标签错、测量误差,本来就在数据里 | 模型一旦把它当规律记住,就是过拟合(⑥) | 要被忽略:加数据、加约束 |
| ② 路上的噪声 | 每次只抽一小批估方向,方向有抖动(⑤) | 有时帮忙(跳出窄谷),有时添乱(停不下来) | 用批大小和学习率调 |
| ③ 人为加的噪声 | Dropout、数据增强、扩散模型的加噪 | 让模型别依赖任何一个具体细节;扩散里它是生成的原料 | 是工具,要调幅度 |
想象一条一维的山路,有两个坑。左边的坑又深又窄(训练集上最低),右边的坑稍浅但很宽。 训练集和真正的新题总有一点点差异(数据换一批,坑的位置会偏一点):窄坑一偏,你就掉到坑壁上去了;宽坑偏一点,仍在坑里。 下面让一个球从窄坑旁出发,每一步沿坡走,再加一点随机抖动(噪声)。拖噪声大小,看球最后停在哪。
噪声从 0 加到很大:球停在哪个坑,训练和“新题”各是多少
噪声 0 到 0.4:球全都留在窄坑,训练分最高(−1.0),但在偏移后的“新题”上只有 −0.49,差了 0.5。
噪声到 0.6:几乎全都跑到宽坑,训练分降了(−0.70),新题分却升到 −0.69,两者几乎相等。这就是“噪声帮你泛化”的最小版本。
再往右拖到 3:噪声大到什么坑都留不住,训练和新题都接近 0。噪声太大,等于什么都没学。
| 说法 | 状态 |
|---|---|
| Dropout、数据增强这样人为加的噪声能降低过拟合 | 有明确证据,广泛使用(正则化、数据增强) |
| 扩散模型把噪声当生成的原料 | 事实,不是争议(扩散模型) |
| 小批量噪声按 1/√B 下降,批越大方向越准 | 有定论,上面⑤站的图自己能验 |
| 小批量噪声倾向于带你去平坦的极小值,平坦的泛化更好 | 有理论和实验,但有争议:平坦度可以被“重新参数化”改变而不影响函数(Dinh 等 2017)。上图是人造的一维地形,只说明在这种地形上会这样,不能直接搬到真实网络 |
| 噪声能帮助逃离鞍点 | 有理论(Ge 等 2015),实践中占多大作用不确定 |
| SGD 的噪声本身起了正则化作用(“隐式正则”) | 研究前沿,没有定论 |
所以,“噪声是好的”这句话只在有条件时成立:噪声要有合适的大小,要加在对的位置,并且模型确实面对着“训练集和真实世界有差异”。 数据里的噪声永远要被忽略;而路上的、人为加的噪声,是你手里可以调的旋钮。
读到别的章遇到不熟的数学,从这里反查。每块一句话,指回上面讲它的那一站;表里最后一列是哪些章用它。
| 一句话 | 在哪一站讲 | 你会在哪见到它 |
|---|---|---|
| Ⅰ 放大到足够近,曲线就变直 微积分的起点:直线是唯一真正会算的东西 | ⑤ 顺着坡走 | 感知机 · MLP(每个神经元是局部线性 + 一次折)· 梯度下降 · 优化器(二阶方法看“坡怎么弯”)· 扩散 · 流匹配(连续时间的“一小步”) |
| Ⅱ 点积与矩阵 量两个东西有多像,一次做很多个点积;矩阵 = 拉转压 | ② 猜 | 感知机 · MLP · 词向量 · 向量嵌入 · 注意力 · Transformer · LoRA · 自编码器 · 机械可解释性 |
| Ⅲ 链式法则 倒着走一遍,整串变化的倍数 = 每段倍数相乘 | ④ 找方向 | 反向传播(全站三处完整推导之一)· 激活函数 · 初始化 · 归一化(都在改这条乘法链的乘数)· RLHF · DPO(走的是另一条路,见④站) |
| Ⅳ 信息论:越来越不意外 熵、交叉熵、KL | ③ 打分 | 损失函数 · 文本生成 · VAE(有一项 KL)· RLHF · DPO(KL 惩罚)。GAN 不能写成这个形式 |
| Ⅴ 概率与统计 大数定律、中心极限、正态;期望、方差;独立同分布 | ⑥ 考新题 · ③ 打分 | 初始化 · 归一化(方差相加)· VAE · 扩散(高斯)· 评测(误差棒 1/√n)· 正则化(先验) |
| Ⅵ 高维不是低维的放大版 高维里随机两个方向几乎垂直 | ① 变成数 | 优化器(鞍点比极小值多,这是统计物理式的论证,不是定理)· 词向量 · 向量嵌入(无关的词内积几乎为 0)· 机械可解释性(叠加现象只在高维发生) |
拖到你正在读的那一章:左边亮着的,就是你已经碰到过的数学
| 你现在的状态 | 怎么用这一章 |
|---|---|
| 刚开始,什么都不懂 | 花 5 分钟从头走一遍六站,每站只看那张能拖的图。然后直接去看第一章 |
| 读到某个符号或数学名词卡住了 | 上面的表里找到它在哪一站,翻过去看那一站的图和公式卡 |
| 想看懂论文 | 去符号速查:最常见的 12 个符号 + 全部记号,带搜索框 |
| 想系统补数学 | 这一页故意不够。它的定位是认路,不是教材 |
一圈六站是最常见的一条路,不是深度学习的全部。强化学习、GAN、对比学习、扩散模型,打分和找方向的方式都不完全套得进「负对数似然 + 反向传播」。
下面六块也是按「你会在哪儿用到」切的,不是数学自己的分法。
和 知识地图 一样:地图不是疆域。
| 它帮你的地方 | 它会骗你的地方 |
|---|---|
| 把「微积分 / 线性代数 / 概率 / 信息论」这四个对新手毫无意义的名字, 换成四句能记住的话 | 这四条脉络是我们按「你会用在哪」切的,数学本身没有这个分法。 同一条定理常常同时属于两条——它不是一棵正经的分类树 |
| 每块开头一段话说清它在干什么,十秒钟抓住 | 那是挂点,不是定义。比如「导数」的严格定义要先讲极限, 这一页只提了两次、没有展开——它负责让你认得它,不负责让你证明它 |
| 每块都配一张能拖的图,拖一次比看十行公式管用 | 图是玩具规模:2×2 的矩阵、最多 1000 维的随机向量、几个骰子。 真实的权重是 768×768、上下文是几十万维—— 规模一变,有些结论要重新想 |
| 「放大就变直」让导数的直觉一秒到位 | 这是直觉,不是定义;而且它在不可导的点上直接不成立 (ReLU 在 0 处就没有切线)。正文那张图永远挑一个光滑的点给你看 |
| 每块末尾那张「你会在哪见到它」表,把符号和章节对上号 | 它只回答「在哪见过」,不回答「怎么推出来」。 全站只有三处完整推导(链式法则 · QKV · 交叉熵求导), 其余全是结论 |
| 一张点阵图 + 六块,随时回来查 | 它不适合从头读到尾。顺读下来的手感会是 「什么都讲了,又什么都没讲」——那是地图的正常手感,不是这一页没写好。 它是回查用的。 |
在正文里遇到不认识的符号或公式,翻回来查两分钟,然后回去,不要在这里停留。
真正要学进去,去每块末尾那几张表指向的章节:那里才是主场,这里只是地名。
论文里最常见的 12 个符号和全部记号(每条都写了怎么念、什么意思、在图上是哪块), 连同一个搜索框,都在符号速查那一页。这一页只留一条最常用的约定:
斜体小写 x = 一个数(标量) ·
粗体小写 x = 一串数(向量) ·
粗体大写 X = 一张表(矩阵)
这一页是地图,不是教材。真的学进去,要去下面这几个来源。
| 想要什么 | 去哪 |
|---|---|
| 看懂正文里的公式 | 本页对应那一块的「🧰 最小技能」卡(矩乘 / 导数 / 概率对数 / Σ) |
| 某个具体符号不认识 → 符号速查,或正文里直接悬停 | |
| 看懂公式怎么推出来的 | 全站只有三处完整推导:链式法则 · 注意力的 QKV · 交叉熵求导 ∂L/∂z = p − y |
| 术语(不是符号)看不懂 | 术语索引(95 条),正文里悬停灰色术语名同样能弹卡 |
| 想系统补数学 | 这一页故意不够。四个来源见每块末尾的表格与各章「拓展阅读」 |
| 还是卡住了 | 多半是正文跳过了某一步,不怪你。把那句原文记下来,那是最重要的反馈 |
认完路,下一章《感知机》动手切第一刀。