笃行
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
  • 向量入门

    • 看得见的机器学习数学
    • 向量是什么
    • 向量的加减与数乘
    • 线性组合与张成
  • 矩阵与变换

    • 矩阵是一次变换
    • 矩阵乘法
  • 度量与求解

    • 行列式与面积
    • 解方程组就是倒着走回去
    • 特征向量的直觉
    • 点积与相似度
  • 高维与结构

    • 高维空间的直觉
    • 正交基与投影
    • 秩与低秩
    • 长度与归一化
    • 线性与非线性
  • 概率与信息

    • 概率分布与采样
    • 期望与方差
    • 指数与 softmax
    • 对数与信息量
    • 交叉熵
  • 学习与优化

    • 导数就是坡度
    • 梯度下降
    • 链式法则与反向传播

平均等 5 分钟:一家次次准时,一家忽快忽慢

两家奶茶店都写着"平均等 5 分钟"。A 店次次都是 5 分钟,B 店有时 1 分钟就好、有时让你干等 20 分钟。平均数一模一样,体验差了十万八千里。

🧠 一句话结论

期望是"长期下来平均落在哪",方差是"每次离那个平均有多远、抖得有多厉害"。两组数可以期望完全相同而体验天差地别。最关键的一条:把 n 个各自独立的抖动加起来,总抖动只长 √n 倍,不是 n 倍——这正是很多"要除以一个根号"的做法的来源。


场景问题

放学后你想喝奶茶,校门口有两家店。

你查了查大众点评,两家的"平均等待时间"都写着 5 分钟。看起来一样,随便挑一家好了。

可老同学拦住你:"别去 B 家。"

"不是都 5 分钟吗?"

"平均是 5 分钟。但 A 家次次都 5 分钟,你踩着点去,5 分钟后一定拿到手。B 家看运气——运气好 1 分钟就好了,运气差能让你站 20 分钟。"

你算了算:要是 6 点半上课,6 点 20 到店,A 家稳稳当当;B 家有可能让你迟到。

一个"平均数"根本不够描述这两家店的差别。 你还得知道另一件事:它每次离平均有多远?

这就是这一篇的两个主角:一个说"平均落在哪",一个说"抖得有多厉害"。

实现方案

期望:长期下来平均落在哪

先说简单的那个。

期望,就是"这件事重复很多很多次之后,平均下来是多少"。奶茶店的期望等待时间是 5 分钟,意思就是你去个一百次,总时长除以一百,大概是 5 分钟。

用上一篇切蛋糕的说法:每种结果乘上它那段蛋糕的宽度,全部加起来,就是期望。机会大的结果在期望里说话声音大,机会小的声音小。

它有时候写成 E[等待时间] = 5,那个 E 就是"期望"的记号——这行的意思是"等待时间长期平均下来是 5 分钟",跟你平时说的"平均"是一回事,别被字母唬住。

有件事要提前说清:期望不一定是一个真会发生的值。掷一个正常的骰子,期望是 3.5——可骰子上根本没有 3.5 这一面。期望描述的是一大堆结果的重心落在哪,不是"最可能出现哪个"。

方差:每次离平均有多远

现在说那个更有意思的。

把两家店的等待时间画在数轴上,每一次去就是一个点:

同样的平均值,两种完全不同的体验A 店:每次都紧贴平均B 店:散得到处都是两条的平均都在这儿1 分钟20 分钟

上面那排点(A 店)紧紧挤在一起,下面那排(B 店)散得到处都是。紫色虚线是两家共同的平均值——一模一样。

衡量"散得有多开"的那个数,就叫方差:把每个点到平均值的距离取平方,再求平均。距离取平方是为了让"偏左"和"偏右"都算数(不然一正一负会互相抵消掉)。

方差开个根号,叫标准差——它和原来的数是同一个单位,读起来更顺口:"B 店平均 5 分钟,上下浮动大概 7 分钟",说的就是标准差。

有时候会写成 Var[等待时间],那个 Var 就是"方差"的记号——这行的意思是"等待时间抖得有多厉害"。

期望说"重心在哪",方差说"摊得有多开"。两个数一起,才把一件事描述完整。

把很多个抖动加起来,抖动只长 √n 倍

现在到了这一篇真正值钱的地方。

假设你要连着买 100 杯奶茶(给全班带),每杯都去 B 店。总共要等多久?

期望好算:每杯平均 5 分钟,100 杯就是 500 分钟。期望是老老实实按倍数长的。

那抖动呢?每杯上下浮动 7 分钟,100 杯是不是浮动 700 分钟?

不是。总抖动只有 70 分钟左右——是 7 乘以 10,也就是 7 乘以"100 开根号"。

投的次数一路涨:1 倍 → 4 倍 → 9 倍 → 16 倍平均线一动不动;散开的宽度只长了 1 → 2 → 3 → 4 倍次数涨 16 倍,抖动只涨 4 倍 —— 差的正是那个开根号

盯住这个动画:投的次数一路涨到 16 倍,散开的宽度却只长到 4 倍。次数和抖动之间差着一个开根号。

为什么?因为这些抖动是各自独立的——这杯排队久了,下一杯不会因此也排久。它们各抖各的,有的往上有的往下,加起来的时候互相抵消掉了一大半。全部往同一个方向抖才会是 n 倍,但那样它们就不是独立的了。

n 个独立抖动加起来,总抖动是原来的 n 倍n \text{ 个独立抖动加起来,总抖动是原来的 } \sqrt{n} \text{ 倍} n 个独立抖动加起来,总抖动是原来的 n​ 倍

这行的意思是:把 n 个各抖各的东西加起来,总抖动不是长 n 倍,而是长"n 开根号"倍。

这个"√n"到处都是。100 杯奶茶的总等待、100 项相加的一个总分、几百维箭头做一次点积——只要是"很多个独立的东西加起来",抖动就按开根号长。

所以要除以一个根号

现在能解释一件在大模型里到处出现的事了。

第九篇讲过:点积是对应位置相乘再相加。如果箭头有 64 根量尺,那就是把 64 个数加起来。

这 64 项各自独立、各抖各的——按上面的规律,总抖动是单项抖动的 8 倍(64 开根号是 8)。量尺换成 512 根,总抖动就变成大约 23 倍。

麻烦在于:这些点积算出来之后要拿去分蛋糕(第十七篇会讲)。抖动太大,蛋糕会被切得极端——一段几乎占满,其余全成了细丝。而且量尺根数一变,极端程度就跟着变,同一套做法在不同尺寸的模型上表现完全不同。

修法很直接:算完点积,除以"量尺根数开根号"。64 根量尺就除以 8,512 根就除以约 23。除完之后,抖动的大小和量尺根数脱钩了——不管模型多大,这一步的脾气都一样。

这就是那个著名的"除以 √d" 的来历。它不是什么玄学系数,就是把这一篇的 √n 规律反着用一次:加起来涨了 √n 倍,那就除掉 √n 倍。

为什么这么做

为什么光有平均值不够,非要再来一个方差?

因为平均值把"分布"整个压成了一个数,压掉的东西可能恰恰是你最在乎的。奶茶店的例子里,两家平均都是 5 分钟,但一家能保证你不迟到、一家不能——这个差别在平均值里一点影子都没有,全在方差里。

为什么方差要把距离取平方?

因为不取平方的话,偏左(负)和偏右(正)会互相抵消,散得再开也可能算出 0 来。取平方之后左右两边都变成正的,都算数。开根号变回标准差,是为了让单位跟原来的数对上,好读。

为什么加起来的抖动是 √n 倍而不是 n 倍?

因为它们各抖各的:有的往上有的往下,加起来时互相抵消掉一大半。要是所有抖动步调一致地往同一个方向抖,那才会是 n 倍——但那样它们就不叫独立了。独立 = 会互相抵消 = 只长 √n 倍。

为什么别的选择不行

错误直觉一:以为平均值一样就等价

两家奶茶店的例子已经说明白了:平均都是 5 分钟,一家能让你踩点不迟到,一家可能让你迟到。平均值只说了重心在哪,没说摊得有多开。

这个疏漏在很多场合都很贵:只看平均响应时间,会漏掉那些偶尔卡上好几秒的情况;只看平均成绩,会漏掉一个人是次次稳定还是忽高忽低。看到平均值,永远该顺口问一句:那它抖得厉害吗?

错误直觉二:以为把 n 个抖动加起来,总抖动就是 n 倍

这是最容易想当然的一步——期望是按 n 倍长的,抖动看着也该按 n 倍长。

但期望和抖动的长法不一样:期望按 n 倍长,抖动按 √n 倍长。 因为期望是老老实实累加,而抖动有正有负会互相抵消。

想当然按 n 倍算的后果是把风险估得高得离谱:100 杯奶茶实际总浮动 70 分钟左右,按 n 倍算会得出 700 分钟,差了整整十倍。

错误直觉三:以为方差大就是"出错了"

方差是一个事实,不是一个毛病。有些事天生就抖:奶茶店客流有多有少,语言里下一个字本来就有很多种合理的接法。

把方差当错误来消,会消掉本来就该有的多样性——比如硬把模型的输出压成每次都一模一样(上一篇讲过这会让话千篇一律、原地打转)。

该问的不是"方差为什么不是 0",而是"这个方差是不是超出了我能接受的范围"。 前者是在跟事实较劲,后者才是在做决定。

沉淀结论

  1. 期望 = 长期下来平均落在哪(每种结果乘上它那段蛋糕的宽度再加起来),它不一定是真会发生的值(骰子期望 3.5)
  2. 方差 = 每次离平均有多远(距离取平方再求平均),开根号叫标准差,和原来的数同单位
  3. 期望相同、方差不同的两组数,体验可以天差地别——看到平均值要顺口问一句"抖得厉害吗"
  4. n 个独立抖动加起来,总抖动只长 √n 倍,不是 n 倍——因为有正有负互相抵消了一大半
  5. "除以 √量尺根数"就是把这条规律反着用一次,让抖动大小和模型尺寸脱钩

记忆口诀

期望说重心在哪,方差说摊得有多开。
平均一样,体验可以天差地别。
期望按 n 倍长,抖动只按 √n 倍长。
因为各抖各的,有正有负互相抵消。
加起来涨了 √n,那就除掉 √n。

延伸阅读

  • Attention 打分为什么要除以 √d_k:点积是几百项相加,总抖动按 √项数 长,不除掉的话蛋糕会被切得极端,而且换个模型尺寸脾气就变。除一次正好抵消。详见大模型核心原理。
  • 参数初始化为什么讲究:每一层都是"很多项加起来",初始值的抖动定得不合适,逐层放大或衰减,几十层之后就没法收拾了。详见大模型核心原理。

自测:合上资料能说清楚吗?

  1. 两家奶茶店都"平均等 5 分钟",为什么老同学让你别去 B 家?
参考答案

因为平均值只说了重心在哪,没说摊得有多开。A 家次次都 5 分钟(方差小),踩着点去一定不迟到;B 家有时 1 分钟有时 20 分钟(方差大),有可能让你迟到。

平均值一样,方差不同,体验天差地别。看到平均值要顺口问一句:它抖得厉害吗?

  1. 骰子的期望是 3.5,可骰子上没有 3.5 这一面。这矛盾吗?
参考答案

不矛盾。 期望描述的是一大堆结果的重心落在哪,不是"最可能出现哪一个",更不需要是一个真会发生的值。掷很多很多次,总点数除以次数会靠近 3.5——这就是期望的含义。

  1. 100 杯奶茶,每杯上下浮动 7 分钟。总共浮动多少?
参考答案

大约 70 分钟,不是 700 分钟。因为 100 开根号是 10,7 × 10 = 70。

原因是这些抖动各抖各的:有的往上有的往下,加起来时互相抵消掉一大半。只有所有抖动步调一致往同一方向抖才会是 n 倍,但那样它们就不独立了。期望按 n 倍长,抖动按 √n 倍长。

  1. Attention 打分为什么要除以一个根号?
参考答案

因为点积是几百项相加,按 √n 规律,总抖动是单项抖动的"量尺根数开根号"倍(512 根量尺就是约 23 倍)。

抖动太大有两个坏处:分蛋糕时会切得极端(一段几乎占满,其余成细丝);而且量尺根数一变极端程度就变,同一套做法在不同尺寸模型上表现完全不同。除以"量尺根数开根号"就把抖动和模型尺寸脱钩了——这就是把 √n 规律反着用一次。

  1. 方差大是不是说明哪里出错了?
参考答案

不是,方差是事实不是毛病。 有些事天生就抖:客流有多有少,语言里下一个字本来就有很多种合理接法。

把方差当错误去消,会消掉本该有的多样性(比如硬把输出压成每次一模一样,结果话千篇一律还原地打转)。该问的不是"方差为什么不是 0",而是"这个方差有没有超出我能接受的范围"。

最近更新: 2026/9/10 11:38
Prev
概率分布与采样
Next
指数与 softmax