平均等 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 店)散得到处都是。紫色虚线是两家共同的平均值——一模一样。
衡量"散得有多开"的那个数,就叫方差:把每个点到平均值的距离取平方,再求平均。距离取平方是为了让"偏左"和"偏右"都算数(不然一正一负会互相抵消掉)。
方差开个根号,叫标准差——它和原来的数是同一个单位,读起来更顺口:"B 店平均 5 分钟,上下浮动大概 7 分钟",说的就是标准差。
有时候会写成 Var[等待时间],那个 Var 就是"方差"的记号——这行的意思是"等待时间抖得有多厉害"。
期望说"重心在哪",方差说"摊得有多开"。两个数一起,才把一件事描述完整。
把很多个抖动加起来,抖动只长 √n 倍
现在到了这一篇真正值钱的地方。
假设你要连着买 100 杯奶茶(给全班带),每杯都去 B 店。总共要等多久?
期望好算:每杯平均 5 分钟,100 杯就是 500 分钟。期望是老老实实按倍数长的。
那抖动呢?每杯上下浮动 7 分钟,100 杯是不是浮动 700 分钟?
不是。总抖动只有 70 分钟左右——是 7 乘以 10,也就是 7 乘以"100 开根号"。
盯住这个动画:投的次数一路涨到 16 倍,散开的宽度却只长到 4 倍。次数和抖动之间差着一个开根号。
为什么?因为这些抖动是各自独立的——这杯排队久了,下一杯不会因此也排久。它们各抖各的,有的往上有的往下,加起来的时候互相抵消掉了一大半。全部往同一个方向抖才会是 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",而是"这个方差是不是超出了我能接受的范围"。 前者是在跟事实较劲,后者才是在做决定。
沉淀结论
- 期望 = 长期下来平均落在哪(每种结果乘上它那段蛋糕的宽度再加起来),它不一定是真会发生的值(骰子期望 3.5)
- 方差 = 每次离平均有多远(距离取平方再求平均),开根号叫标准差,和原来的数同单位
- 期望相同、方差不同的两组数,体验可以天差地别——看到平均值要顺口问一句"抖得厉害吗"
- n 个独立抖动加起来,总抖动只长 √n 倍,不是 n 倍——因为有正有负互相抵消了一大半
- "除以 √量尺根数"就是把这条规律反着用一次,让抖动大小和模型尺寸脱钩
记忆口诀
期望说重心在哪,方差说摊得有多开。
平均一样,体验可以天差地别。
期望按 n 倍长,抖动只按 √n 倍长。
因为各抖各的,有正有负互相抵消。
加起来涨了 √n,那就除掉 √n。
延伸阅读
- Attention 打分为什么要除以 √d_k:点积是几百项相加,总抖动按 √项数 长,不除掉的话蛋糕会被切得极端,而且换个模型尺寸脾气就变。除一次正好抵消。详见大模型核心原理。
- 参数初始化为什么讲究:每一层都是"很多项加起来",初始值的抖动定得不合适,逐层放大或衰减,几十层之后就没法收拾了。详见大模型核心原理。
自测:合上资料能说清楚吗?
- 两家奶茶店都"平均等 5 分钟",为什么老同学让你别去 B 家?
参考答案
因为平均值只说了重心在哪,没说摊得有多开。A 家次次都 5 分钟(方差小),踩着点去一定不迟到;B 家有时 1 分钟有时 20 分钟(方差大),有可能让你迟到。
平均值一样,方差不同,体验天差地别。看到平均值要顺口问一句:它抖得厉害吗?
- 骰子的期望是 3.5,可骰子上没有 3.5 这一面。这矛盾吗?
参考答案
不矛盾。 期望描述的是一大堆结果的重心落在哪,不是"最可能出现哪一个",更不需要是一个真会发生的值。掷很多很多次,总点数除以次数会靠近 3.5——这就是期望的含义。
- 100 杯奶茶,每杯上下浮动 7 分钟。总共浮动多少?
参考答案
大约 70 分钟,不是 700 分钟。因为 100 开根号是 10,7 × 10 = 70。
原因是这些抖动各抖各的:有的往上有的往下,加起来时互相抵消掉一大半。只有所有抖动步调一致往同一方向抖才会是 n 倍,但那样它们就不独立了。期望按 n 倍长,抖动按 √n 倍长。
- Attention 打分为什么要除以一个根号?
参考答案
因为点积是几百项相加,按 √n 规律,总抖动是单项抖动的"量尺根数开根号"倍(512 根量尺就是约 23 倍)。
抖动太大有两个坏处:分蛋糕时会切得极端(一段几乎占满,其余成细丝);而且量尺根数一变极端程度就变,同一套做法在不同尺寸模型上表现完全不同。除以"量尺根数开根号"就把抖动和模型尺寸脱钩了——这就是把 √n 规律反着用一次。
- 方差大是不是说明哪里出错了?
参考答案
不是,方差是事实不是毛病。 有些事天生就抖:客流有多有少,语言里下一个字本来就有很多种合理接法。
把方差当错误去消,会消掉本该有的多样性(比如硬把输出压成每次一模一样,结果话千篇一律还原地打转)。该问的不是"方差为什么不是 0",而是"这个方差有没有超出我能接受的范围"。