武辰作品索引

知乎作品库

文章 · 1

知乎原文

分享几道考研概率论中的秒杀直觉题

考研数学里有些概率论题,如果老老实实去算,可能要算半天。但换个角度,从直觉出发,有时候一两分钟就搞定了。今天分享三道这样的题。

第一题:2024 年考研数学(三)第 8 题

设随机变量 X 的概率密度在 0 < x < 1 时为 f(x) = 6x(1 − x),其余地方为 0。求 E[(X − EX)³]。

A. −1/32  B. 0  C. 1/16  D. 1/2

这道题一眼看过去,里面套着一个 EX,外面还有个三次方。如果要正儿八经算,得先积出 EX,再带进去算一次积分。做得对吗?对。考场上值不值?我觉得不值。你花 5 分钟算这个积分,万一算错一个符号,5 分钟就没了。有没有更好的办法?先画一下这个密度函数。

6x(1 − x) 就是个开口朝下的抛物线。它在 0 和 1 处落到横轴上,正好关于 x = 0.5 对称。你把密度想成压在数轴上的重量,两边一样重,重心自然就在 0.5。EX 就看出来了。

现在把 X 减去 0.5,相当于把图往左挪 0.5。拿 −0.1 和 0.1 这一对来说,它们的密度一样,立方以后一负一正,大小也一样。整个区间都可以这么配对,左边和右边加起来刚好抵消。所以 (X − 0.5)³ 的期望是 0,选 B。

原文配图

第二题:2026 年考研数学(三)第 8 题

设 X、Y 独立同分布。X 的概率密度在 x > 0 时为 f(x) = 1/(1 + x)²,其余地方为 0。求 P(XY ≤ 1)。

A. 3/4  B. 1/2  C. 1/3  D. 1/6

这题照常做,可以画出第一象限里的 y = 1/x,算曲线下方那块的二重积分。我在考研时就最烦算二重积分了。有没有更爽的办法?

原文配图

把 XY ≤ 1 改写成 X ≤ 1/Y,就变成比较两个数谁大了。

先看 X 和 Y 的分布函数。F(t) = t/(1 + t)(t > 0),求个导就能验算,正好是题目给的密度。那 1/Y 服从什么分布呢?1/Y ≤ t,说的就是 Y ≥ 1/t。

F(1/t) 算的是 Y 落在 1/t 左边的概率。我们要的是右边,所以用 1 减它。

P(1/Y ≤ t) = 1 − F(1/t) = 1 − 1/(1 + t) = t/(1 + t)。

这不就是 F(t) 吗?Y 取了倒数以后,居然还是原来那个分布。

X 和 Y 独立,所以 X 和 1/Y 也独立。现在这两个人独立同分布,平起平坐,谁大谁小的概率都一样。又因为是连续的,恰好相等的概率是 0,那就各占一半。所以 P(XY ≤ 1) = 1/2,选 B。

第三题:2024 年考研数学(一)第 10 题

设 X、Y 相互独立,且都服从参数为 λ 的指数分布。令 Z = |X − Y|,下面哪个随机变量和 Z 同分布?

A. X + Y  B. (X + Y)/2  C. 2X  D. X

先想一下等公交。假设等车的时间服从指数分布,平均要等 15 分钟。现在你已经等了 10 分钟,车还没来。从现在开始,平均还要等多久?还是 15 分钟。过去的等待,不会消耗它的“未来”。听起来有点违背直觉,这就是指数分布的无记忆性。

回到题目,你同时等甲、乙两路车,X 和 Y 分别是两路车的等待时间。乙车先到了,甲车还没来。看图,这时你已经等了 Y,接下来还要等的就是 X − Y。这就跟刚才已经等了 10 分钟一样。按无记忆性,接下来这段等待时间仍服从原来的指数分布。甲车先到也一样。

原文配图

所以 |X − Y| 就是先来一辆之后,再等另一辆的那段时间。它跟 X 一样,都服从参数为 λ 的指数分布。选 D。

这三道题只是冰山一角。我写的《大白话概率论:从数学直觉到AI视野》里有不少这样的例子,带大家从直觉出发理解概率论。

知乎原文

为什么 MoE 会出现训练推理不一致的问题?

一个很经典的问题:两台一模一样的电脑,同一个模型,并且温度设为0,输入同一句话,比如“中国的首都在哪里”,为什么一台输出的是“北京”,另外一台输出的是“北京市”?

这叫做“训练推理不一致”的问题,在MoE (混合专家模型)中尤其容易出现。这也是算法岗面试中常见的问题。本文我从以下三个角度来讲:

第一,什么是训练推理不一致;

第二,为什么会产生训练推理不一致;

第三,为什么这个问题很重要、它有什么后果。

什么叫做训练推理不一致?通俗来说就是,我现在有两台电脑,两台电脑的芯片、显卡等硬件一模一样,都加载着同一个模型,当前模型的参数也一模一样。第一台电脑装的是训练框架(比如 Megatron),第二台电脑装的是推理框架(比如 vLLM)。我们分别给两个模型输入同一句话,模型的解码策略也是一模一样的,温度为 0,没有任何随机性。那么按照道理来说,模型是一模一样的,解码策略是一模一样的,硬件也是一模一样的。同样的输入,输出是不是得一模一样?按照数学来说确实得是这样的。比如说我问中国的首都在哪里,那么第一台电脑回答中国的首都在北京,第二台电脑也应该回答中国的首都在北京。但是在实际的过程中,就很有可能出现不一样的情况。没准第二台电脑蹦出来的答案是:中国的首都在北京市,多了那么一个字。

为什么会产生这个问题?有两个原因。第一个原因,也是最根本的原因就是,在计算机的世界里,浮点数不一定满足结合律。什么是结合律?就是比如说三个数相加,A+B+C。按道理来说,我们先算 A+B,然后用 A+B 的结果去加上 C,得出来的结果应该等于先算 B+C,然后用 B+C 的结果再去加上 A。这个应该是天经地义的,但是在计算机的世界里,它不一定会满足。我们可以举一个具体的例子,比如说 A 等于 0.0004,B 等于 0.0005,C 等于 0.0006。我们假设每做一次运算,都只能四舍五入到小数点后三位。你可能会觉得这个假设很荒唐,怎么只能够四舍五入到小数点后三位?现在的计算机效果有这么差吗?这个问题我在后面会补充,我们先接受这个假设。

如果我们先算 A 加 B,然后再加上 C,A 加 B 等于 0.0009,四舍五入变成 0.001,然后再加上 C 等于 0.0016,四舍五入变成 0.002。但是如果先算 B 加 C,等于 0.0011,四舍五入变成 0.001,然后再加上 A,结果是 0.0014,四舍五入变成 0.001。所以你可以看到,不同的相加顺序,最终的结果是不同的。一个是 0.002,一个是 0.001。

回到刚刚那个问题,我这里做了一个假设,就是每次运算之后必须要四舍五入到小数点后三位。这个假设不是天方夜谭,在计算机的世界中,浮点数小数点后面的精度是有限的。以最常见的 FP16 为例,它的有效数字只有 3 到 4 位。

可能有同学会说,我这里只是做了一个理论化的实验,好像没什么说服力,需要眼见为实。我们直接用 NumPy 的 FP16 试一下。我们先引入一个 NumPy 的包,然后 A 是用 FP16 表示的 1 万,B 是用 FP16 表示的 -1 万,C 是用 FP16 表示的 1。你可以看到,如果先算 A 加 B,然后再算 C,它是等于一,这也符合常理。但是如果你先算 B 加 C,然后再加上 A,你会发现它等于零。为什么?我们来看 B 加 C 等于多少,等于 -9999。但是在 FP16 的世界里面,-9999 它就是等于 -10000。为什么?它被四舍五入了,就好比你 9999 买一台 iPhone,你会说这是你花了 1 万购买的。至于为什么 -9999 会被四舍五入成 -1 万,你先记住,FP16 的世界其实是很单薄的世界,是很单调的世界,很多数字其实是会被近似成另一个数字的。所以这里 B 加 C 它仍然等于 -10000,然后再加上 A,又变成零了。

原文配图
图1 同样三个 FP16 数,改变相加顺序,最终结果可能不同。

所以走到这里我们就知道了,为什么会产生训练推理不一致的原因是,在计算机中,浮点数的加法不一定满足结合律。但能不能再往深更问一层?凭什么在计算机中,有时候会先算 A 加 B,有时候会先算 B 加 C?因为计算机执行加法的时候,并没有规定一定要按照某种顺序来。它首先和计算框架有关系,训练框架中矩阵乘法是一套运算逻辑,推理框架中的矩阵乘法又是另外一套逻辑。我们退一步说,就算我们在同一套框架里面,有些并行算法会按各组结果到达的顺序来加:A 和 B 先来了,那就先算 A 加 B,有时候 B 和 C 先来了,那么就先算 B 加 C。谁先谁后的顺序是不一定的。

我们已经讲完了第一个原因,如果仅有第一个原因,会导致训练推理不一致的问题吗?其实很难。MOE 模型存在训练推理不一致这个问题,那么非 MOE 模型,比如传统的 dense 模型有没有这个问题?有,那远远没有 MOE 那么严重。大家如果有深度学习基础的话,就应该知道,对于传统的非 MOE 架构的神经网络,我的输入,或者说哪怕我神经元有细微的不同,某个参数从 0.138 改成 0.139,它最终的输出基本上都不会变的。我就举个简单的例子,比如说我现在有一个猫狗识别分类的网络,输入的图片是一张猫,那么它分类结果就是一张猫。那我往这个猫上面丢几帧黑色的像素,或者甚至涂黑一整块区域,它大概率也能识别出来图片中是猫,这个就叫做鲁棒性。哪怕对输入和内部的神经元做一些非常微小的改动,它也不会对我们的结果有非常大的影响,它是鲁棒的。

但是 MOE 模型就娇气的多了。我们知道 MOE 的一个特点就是它是一个路由网络,它每一个 token,会进入不同的专家。我举个例子,比如我们的模型只选择得分最高的一个专家。比如说我们在电脑 A 里面,同样的输入,中国的首都在北京,我们输到某一层了,然后它对应的专家 1 的得分是 0.5001,专家 2 的得分是 0.4999,那么进入专家 1。

但是我们在电脑 B 里面算到这里的时候,发现它专家 1 的得分是 0.4999,专家 2 的得分是 0.5001。这个时候就进入专家 2 了。那不同的专家,它后续的结果是很大不同的。有些专家可能是比较适合语法、句法,有些专家可能是比较适合地理。一旦你进入到了不适合的专家,那后面的结果就千差万别了,我电脑 A 可能会输出北京这两个字,电脑 B,虽然可能不会离谱到输出"中国的首都在上海",但是可能会输出"北京市"这三个字。

原文配图
图2 细微的分数变化,可能翻转 Top-1 专家路由。

所以归根结底,因为它是有个路由机制,就相当于一个分叉口。比如说我们爬山,如果只有一条路的话,哪怕这条路坑坑洼洼的,你稍微左一脚右一脚,左一脚右一脚,你最终还是从同一条路走能够爬到山顶。但是如果你爬山的路上有一个分叉口的话,那么另外一条分叉口可能就不会把你带到山顶去了。

这就是训练推理不一致。其实说到这里,我觉得还有一种角度,就是说它不一定是训练推理不一致,它还有一种表现方法叫做推理推理不一致。啥意思?还是说我们有两个相同的电脑,这两台电脑所有的条件一模一样,包括模型的参数、解码的机制、甚至芯片也一模一样,输入一模一样,然后同样去走推理的流程。它的输出也有可能不一样。也就是说,其实它本质上不是说训练推理不一致,它也有可能是推理推理不一致。

然后最后我们要考虑一个很实际的问题。这个训练推理不一致的问题很重要吗?当然重要,不重要的话,面试中也不会老问。为什么它很重要?它到底会带来什么后果?最大的后果就是说在强化学习中,会影响训练。在强化学习里,PPO 的训练过程中,Actor 模型,有一个 rollout 的阶段,又叫做采样的阶段。比如说中国的首都在哪里?这是一条训练数据。那么 Actor 模型它在 rollout 的阶段,会去对这个问题回答出一个结果出来。那回答这个过程,其实是推理的过程,是现场采样的过程。它这个时候用到的是推理框架,比如说 vLLM,它是一个推理框架。这个过程它不仅会产生回答,而且它会产生每个 token 的概率。比如 中国的 首都 在北京 分成了三个 token,它不仅产生了 中国的首都在北京 这条回答,它还会给出这三个 token 对应的概率。

它这样之后不是万事大吉了,后面我们在计算损失的时候,会重新跑一遍训练的过程,以训练的视角,再去计算"中国的首都在北京"中每一个 Token,它的概率。这个时候用到的训练框架就不是 vLLM 了,而是有可能是 Megatron。

推理阶段先把回答生成出来,记录生成时的概率。训练时,再把这条已经生成的回答送进去,重新计算概率,因为这次计算还要参与反向传播、更新参数。PPO会用到新旧概率的比值。

我们这里讨论的是,参数还没有更新,仅仅换了计算框架,概率就已经对不上了。真正更新参数以后,概率发生变化,那是正常的。

打个比方,训练的时候,模型先自己猜一遍答案,记下每个实际选出来的 token 在当时的概率;回头算账、要更新参数的时候,又把这个答案重新算一遍概率。这两次算,用的是不同的框架,所以哪怕参数一点没动,算出来的概率都可能对不上。账要是从一开始就对不上,后面更新参数时该往哪调、调多少,就全被带偏了。

原文配图
图3 参数尚未更新时,框架差异也可能影响概率比值(数值仅作示意)。

按照理论上来说,这个时候模型参数还没有变化,我从推理框架得出来的概率和从训练框架得出来的概率得是一样的。但是正如我们上面所说到的,有可能会产生训练推理不一致的情况,那么两个概率就不一样了,那这两个概率不一样,它会影响我们的损失函数,使得我们的损失函数失真。那损失函数产生了错误的指示,使得我们的训练往错误的方向走,这就会切切实实地影响到了强化学习的训练。

知乎原文

我的第一本书《大白话概率论:从数学直觉到AI视野》出版了

我的第一本书,《大白话概率论:从数学直觉到AI视野》,终于出版了。

我拿到书的第一反应就是:厚,真的厚。一共760页。我拿矿泉水瓶子和胶带作为对比:

原文配图
书的厚度与矿泉水瓶、胶带对比


为什么要写这本书

最近有一个很火的词,叫“防自学设计”,说很多教材是防止你去自学的。我第一次听到这个词,非常有同感。

原文配图
什么叫教材防自学设计
原文配图
如何看待数学教材喜欢用易证 显然 答案略等字眼
原文配图
为什么数学教材不能多说几句

我为什么要写这本书?我在2017年就开始有这个念头了。那个时候我还在读本科,准备考研。考研要考概率论,我基本上是自己去啃教材。啃着啃着就发现,书上很多地方像是写给已经会的人看的。

书上说“显然”,在我这里一点都不显然;书上说“注意到”,我是真的注意不到。

当然,也不能怪教材。教材本来就是配合课堂用的,有老师在旁边讲。没有老师、自己自学的时候,传统的教材学起来就有点费力了。

我高中是文科生,本科在武大读的金融,研究生才转到武大数学系。很多东西真的是自己一步一步自学过来的。所以,我也想写一本像学长坐在旁边、娓娓道来的那种书。

这个写书的念头,其实一直都放着。后来我做了算法工程师,天天跟大模型打交道,越来越发现,大模型底下很多东西都是概率论。比如softmax函数、交叉熵、最大似然估计、贝叶斯,到处都是。

很多人在学AI、学大模型,可能觉得原理大概听懂了,但是一碰到数学就卡住了。所以,我这本书也是希望帮现在学AI的人,把这块基础补上。

这本书一半是写给当年那个吭哧吭哧自学的自己,另外一半,也是希望大家在自学概率论的时候,能够更加无痛、更加有趣一点。

我之前也在知乎发过这本书的一些样章,比如下面这两篇。大家可以先读一读,看看这种讲法是不是适合自己,再考虑要不要买。

为什么我国的概率与统计学教科书里不怎么讲幂律分布?如何通俗理解 beta 分布?

这本书为什么这么厚

我总结了一共有五个原因。

原文配图
全书目录(1/4),出版社原版
原文配图
全书目录(2/4),出版社原版
原文配图
全书目录(3/4),出版社原版
原文配图
全书目录(4/4),出版社原版

第一个原因是不跳步

比如条件概率。知道抽到的是红牌以后,为什么概率就变了?我会先带大家把考虑的范围从52张牌缩小到26张,再从这个例子推到条件概率公式,把分子、分母分别在说什么讲清楚。不是单纯把公式摆出来。

原文配图
条件概率:从52张牌缩小到26张,书内第54、55页
原文配图
从扑克牌例子推到条件概率公式,书内第56页

第二个原因是把知识点串联起来

很多人学完概率论,会感觉好像只是背了一本词典。什么伯努利分布、几何分布、超几何分布,没有感觉到它们之间有什么关系。

书里面,我每讲一个新的分布,都会回过头来讲,它和前面的分布有什么关系。

比如,讲超几何分布的时候,公式和例题都讲过了,我会再回头对照前面学过的二项分布:为什么有放回和无放回,期望竟然一样?什么时候,连整个分布都能用二项分布来近似?

原文配图
超几何分布讲到期望时,回看二项分布,书内第248页
原文配图
超几何分布何时能用二项分布近似,书内第253页

再比如,讲几何分布的时候,会讲到一个有意思的现象:成功率很低时,等到了平均等待次数,仍然有接近1/e的概率没有成功。这个1/e是从哪里来的?我会把前面学过的泊松分布拿回来,换个角度解释。

原文配图
讲几何分布时,用泊松分布解释1/e,书内第266、267页

再往后,我还会把负二项分布和二项分布放在一起对比:我有10次面试机会,能拿到几个offer?我要拿到3个offer,需要面试多少次?同一个过程,换一种问法,就把两个分布联系起来了。

我在2018年就发过一个知乎帖子。这个帖子就是一张图片,把所有常见的分布串联起来。

原文配图
2018年绘制的分布关系图

那个文章当时获得了很多赞。有一条评论说,学了这么多年的概率论,直到看到这个,才知道这些分布原来能够串起来,感觉以前的概率论白学了。

也正是因为这条评论,包括大家的反馈,所以我很想把“串联”这件事认真写在书里面。

第三个原因是特意增加了AI相关内容

我特意增加了不少AI相关的内容。比如刚刚说到的softmax函数,还有余弦相似度、大数定律和机器学习、交叉熵与KL散度。

原文配图
余弦相似度与大模型的底层逻辑,书内第180页
原文配图
语义运算示意图与视觉语言模型,书内第185页
原文配图
交叉熵与KL散度:从两枚不同的硬币讲起,书内第596页

除此之外,我在很多小节的结尾,也特意增加了“AI视野”这个栏目,讲这一个小节的知识点,在AI领域是怎么体现的。

原文配图
AI视野:Dropout与二项分布,书内第225页

因为我自己就是做算法、做AI的,很清楚哪些数学会卡住学AI的人。所以,我会专门增加这些内容,和AI、和大模型紧密结合起来。

学AI的数学基础,有“三件套”:微积分、线性代数和概率论。我个人觉得,概率论最重要,概率论的思想贯穿整个AI。

举个具体的例子,大家玩过大模型,应该知道,同样一个问题问两次,回答经常不一样,为什么呢?

因为模型生成下一个词时,先用softmax把分数变成概率,再按概率抽下一个词。既然是抽,每次抽到的结果就很有可能不一样。

第四个原因是考纲之外的扩展

这一部分,我写的篇幅相当多。

举个例子,幂律分布,传统的教材不讲,考研也不会考。但它和生活中的很多现象都有关系,比如新闻传播、疾病传播的模型,比如财富分配、贫富差距的模型,都和幂律分布非常相关。

原文配图
赢家通吃的幂律分布,书内第350页

这样的扩展章节,在这本书里有二十多个小节。

一开始交稿的时候,编辑觉得,这些扩展章节放到书里,会不会导致这本书太厚了?当时考虑过把这些扩展章节砍掉,做成二维码放在书里。大家扫二维码看,而不是直接在书里面显示。

后来,我把幂律分布这个章节发到知乎上,传播很广,点赞量很高,评论区都说千万不要砍。编辑也采纳了这些建议,最终这些扩展小节都成功留在了这本书里面。

书里面还有很多好玩的东西,比如狼人杀、三国杀,三国杀里洛神的概率、生男生女的概率,还有“闪电真的公平吗”。

原文配图
狼人杀:身份分配与概率的失忆症,书内第46页
原文配图
三国杀洛神与生男生女:题目,书内第46页

比如三国杀的闪电,大家觉得轮流判定很公平,对吧?但其实越靠前的人,越容易被劈。

原文配图
三国杀闪电:一轮判定中的位置与概率,书内第48页

还有麻将这些。

原文配图
麻将:为什么分母是119,书内第49页

当然,大家千万不要觉得我在带大家赌博。我只是以概率的观点,带大家认识哪些是玄学,哪些是有理论基础的。

我还特意用了一整个章节,讲一些错觉、谬误和赌徒输光定理。

原文配图
赌徒谬误与赌徒输光定理的引入,书内第569页

再举个例子,在股市中,很多人都是越跌越买。那越跌越买,在理论上有没有道理呢?我在这本书中,会用概率的视角,讲它背后到底是什么意思。

第五个原因是有很多Python实验室

这本书有特别多“Python实验室”。很多小节的结尾,我都会增加这个栏目,可以自己跑代码,验证结论。

很多反直觉的结论,自己跑一遍,感觉完全不一样。而且,里面的代码不会特别复杂,稍微懂一点就能够尝试。写得非常简单、非常直觉,注释也特别多。

原文配图
Python实验室:模拟几何分布的等待次数,书内第269页

考研真题和大厂面试题

最后,我还增加了考研真题和大厂面试的环节。

为什么要增加这些内容?市面上其实已经有一些考研真题了,但我是希望以一种不同的视角来解释。

原文配图
第20章的真题说明,书内第719页

举个具体的例子,比如下面这道题:

设 X∼Exp⁡(λ),已知 P(X>3)=e−3,求 P(X>5∣X>2)。\text{设 }X\sim\operatorname{Exp}(\lambda)\text{,已知 }P(X>3)=e^{-3}\text{,求 }P(X>5\mid X>2)\text{。}

在考试中一步一步硬算,会发现要花好几分钟。但用直觉的做法,其实10秒钟就能够解决。

原文配图
指数分布题与两种解法,书内第9页

这本书很看重直觉。通篇不仅有严格的公式,而且很多地方会从直觉的角度,带你理解概率论。我觉得这一点相当重要,这也是我学习概率论最重要的心得。

死记硬背往往不是正确的路径,真正从直觉的角度打通,才能把知识印在脑海里。

书里还配了章节小结、思维导图、核心考点和带解答的思考题,方便学完以后回头梳理,也看看自己是不是真的理解了。

我自己是做算法工程师的,当过面试官,也去面试过其他公司,包括在网上搜集了一些面试的概率题。这些题目,我也收集到了这本书里面。

原文配图
大厂算法岗面试中的概率题,书内第742页

这本书适合谁

这本书的受众很广。不论你是备考党,还是想学习AI,这本书都非常适合你。

如果是为了期末考试或者考研,所有涉及“扩展”的章节,可以先跳过,因为扩展章节不在考纲里面。

如果你想学AI,想把数学基础补扎实,那这本书基本上就是为你量身定做的。

原文配图
不同需求读者的读法,原书前言

如果你想学数据分析,后面的数理统计,能为数据分析打下基础。

原文配图
辛普森悖论:题目与分组数据,书内第92页

你可能会问,我数学基础不好,能不能看这本书?

其实,这本书就是为数学基础不好的人准备的。前面很多内容,哪怕只有高中基础,都能够看。

不过,也要说句实话,等到后面学连续型随机变量的时候,涉及微积分,确实需要一点微积分基础,才能看完这本书。

如果某个地方实在看不懂,没有关系,可以先跳过,读到后面再回头看,很有可能就通了。我写这本书的时候,会注意到这一点。

刚刚也说过,写后面的内容时,如果它和前面的内容有联系,我一定会提一嘴,达到把知识点串联起来的效果。

你看,我自己都是文科班出来的。所以,大家不要觉得自己不是学数学的料,很有可能只是没有找到正确的教材,或者正确的学习方法。

最后说几句

真的要感谢大家。从3月份催到现在,这本书终于、终于出来了。这是我的第一本书。

看完之后,大家觉得好的、坏的、想吐槽的,都可以告诉我。你们的反馈,是我更新的动力。这不是一句客套话,是真的。

我现在在B站、在知乎做创作,大家的反馈真的很重要。我也能够根据大家的反馈及时调整,包括后面的书籍。

顺带说一句,我现在已经写了三本书。

第一本就是这本《概率论》。第二本是大模型,已经快到排版后期了,也在出版流程中。那本书会比这本书更厚,基本上把我知道的大模型知识,包括从零开始的理论基础,都事无巨细地讲给大家。

第三本是讲算法工程师职场的,把我这六年来在几家大厂的见闻和思考都记录下来,也已经在前一段时间交稿了。有消息,我会第一时间告诉大家。

先读几篇样章

如果想先看看这本书的讲法,可以从下面几篇样章读起,看看是不是适合自己。

为什么我国的概率与统计学教科书里不怎么讲幂律分布?如何通俗理解 beta 分布?“星期二男孩”悖论为什么违背直觉?彻底讲透这个问题指数分布:等待的艺术什么是「伯克森悖论」,这种现象在生活中有什么影响?如何求P(AB)-P(A)P(B)的取值范围?

知乎原文

分享一下我调用大模型 API 的省钱小策略

以前我是不心疼使用大模型的费用的,因为是公司出钱。后来自己接项目,走公司报销就不方便了,只能自己去找订阅。一开始用的是Claude订阅,但是后来封号很严重,只能通过API来调用了。经过这几个月的摸索,我踩了一些坑,总结了一些我认为比较省钱的路径。我觉得最重要的就是要对“缓存”建立起一个直观的概念。

什么是缓存

如果和模型多轮对话,模型其实压根不记得之前聊了啥。 一个常见的误解是,我跟它聊了十轮,它当然记得前面九轮说了什么呀,不然它怎么能接着我的话往下说呢?

但实际上,每一次发消息的时候,聊天工具都会把前面所有的对话,全部打包,重新发给模型一遍。模型是靠每次都把整段对话从头读一遍,才"记得"前面聊过什么的。

原文配图

那问题就来了。比如说我已经聊了很久,对话有八万个 Token 了,这时候我只回了一句"好的"。虽然我只发了两个字,但模型收到的是前面八万个 Token 再加上这两个字。

API 又是按 Token 收钱的。也就是说,我回的那句"好的",实际上不是只收这两个字的钱,而是按八万多个 Token 收的钱。

随着对话轮数的增加,累计发送的 Token 呈平方级增长。比如第一轮只有一问一答;到第二轮时,会把第一轮的问题和模型回答,加上第二轮用户的问题一起发送出去。也就是说,第一轮用户的提问被重复计算了两次。到第十轮时,第一轮用户的提问已经被计算了十次。

按图数,第一轮发 1 段,第二轮发 3 段,第三轮发 5 段。这样发 10 轮,一共就是 1+3+……+19=100 段。如果每个问题和回答都差不多长,轮数翻倍,累计发过去的内容就差不多是原来的四倍。

所以聊得越久,前面的对话越长,每发一条消息要重新发过去的东西就越多,一轮比一轮贵。钱的大头根本不在新说的那句话上,都花在那些一遍遍被重新发过去的老内容上了。

缓存可以复用

既然前面那八万个 Token,模型上一轮明明已经读过、算过一遍了,这一轮又发过去,还得再从头算一遍吗?能不能把上次算的结果存起来,下次直接拿来用?

能存,这个就叫缓存。

比如说做高中数学题,第一问已经求出某个角是55度了,那么第二问直接复用这个结论就行,不用从零计算角度。

但是有个前提,得开头一模一样才行。注意是开头,不是说中间随便有一段一样就能用。因为模型在算每一个 Token 的时候,都会参考它前面的所有内容。要是开头哪里改了一个字,那从这个字往后,所有东西的计算结果都跟着变了,之前存的就对不上了。

那用缓存能便宜多少呢?以 Claude Opus 5.5为例。正常处理,每一百万个 Token 是 4 美元。而从缓存里读,只要 0.2 美元,是正常价格的二十分之一。

我举个自己的例子。有一天晚上,我看了一段长对话里八次续聊的用量,这八次发过去的东西加起来有370万个 Token(对话很长,每一轮又都要重发一遍,所以加起来就很多)。这370万个 Token 里,差不多 99% 都是从缓存里读的。

如果没有缓存,光这些就要十四五美元,一百多块钱人民币。按这八次续聊的缓存用量估一下,输入费大概是 0.9 到 1.1 美元,输出另算。

但是,往缓存里存东西需要另外付钱

缓存这么好,那一直开着不就完事了?我一开始也是这么想的。但往缓存里存东西是要单独收钱的,而且比正常处理还贵。

还是拿 Opus 5.5 来说。正常处理一百万个 Token 是 4 美元。但如果你要它把这些内容存进缓存,而且保存一个小时,那就是 8 美元,翻了一倍。只保存五分钟的话便宜点,5 美元。

原文配图

这个其实也好理解,人家服务器帮你存着,是要占地方的。存一个小时肯定比存五分钟占得久,多收点钱也说得过去。

所以缓存第一次存的时候,需要多付一倍的钱,之后每次再用,只要原来二十分之一的钱。第一次多付的那一倍,要靠后面一次次去用,才能慢慢省回来。

举个例子。假设你有一份材料,不开缓存的话,每用一次大概三毛钱。开了缓存,第一次要六毛,因为多付了存的钱;但之后每次只要一分多钱。你算一下就会发现,用到第二次的时候,两边差不多打平;从第三次开始,才是真的在省钱。

反过来,你要是就问一个问题,拿到答案就走了,以后也不会再接着问,那存着干嘛呢?没人用。多付的那一倍,就白扔了。 所以如果你只是一问一答的形式的话,压根不需要开任何的缓存。

这里要注意一个坑点,就是所谓的5分钟缓存或者1小时缓存的失效性问题。这里的5分钟是怎么计算的?它不是等你上一轮模型回复结束开始计时,而是等上一轮模型回复开始的时候计时。比如说第一轮回复开始的时候是11:30,这个时候模型会经过深度思考,然后经过输出,这个时候等到模型输出完都已经11:33了。如果你申请的是5分钟缓存的话,你应该在11:35之前继续提问,否则的话就命不中缓存了。所以 5 分钟缓存对很多产品来说比较紧张,尤其是一些复杂场景。我一般都是开一小时缓存。

缓存可能会失效

有一次我是开一小时的缓存,然后我在几分钟之内向模型发送了追问的请求,然后发现它根本就没有命中缓存,从头给我算了钱。

那它为什么一个都没读到呢?说实话,原因我到现在也没完全搞明白。 可能这是客观存在的,哪怕满足理想的情况,缓存也有低概率失效。但是这个情况发生的很少,我这两个月以来也就发生了几次而已。

我知道的会让缓存失效的情况,主要就两种。一种是开头变了,比如系统提示词里加了个时间、前面某条消息改了一个字,那从变的地方往后就全读不到了。另一种是过期了,存的时间到了,就被扔掉了。

我还想到一个比较鸡贼的情况:之前 美国某家公司 不允许第三方 harness 工具调用它,有说法称它会通过调整时间戳等方式让用户很难命中缓存,缓存带来的费用显著增加,自然就劝退了用户。

节省费用的保活习惯

最后再说一个我自己的小习惯。

缓存不是一直存着的,我用的是存一个小时的那种。但只要这一个小时里你又用到了它,它就能再续一个小时。

所以我有时候聊一个很复杂的问题聊到一半,如果继续聊下去,又至少得聊一两个小时,但是已经到饭点了,想出去吃饭,于是我走之前会先在心里记一下时间。差不多快一个小时的时候,我就发一句"这是一条测试消息,请直接回复收到",帮它续一下。要是吃得久,就再发一次。

为啥这么麻烦?因为对话已经很长的时候,发一句测试才一毛多钱。可要是不管它,等我回来缓存已经没了,第一句话就得把整段对话重新存一遍,五六块钱就出去了。

缓存的基本单元到底是啥?

还有一个细节:比如我已经聊了 5 轮,按理说接下来应该从第 6 轮继续追问。但如果我回退修改,比如对第 5 轮模型的回答不满意,让它重新生成;或者回到第 3 轮去修改我当时的提问,这种情况还能命中缓存吗?一般来说是可以的。因为比如我回到第 3 轮修改并重新提交时,前两轮的缓存都还在,只要时间没过期、前两轮内容没有发生变化,就仍然可能命中缓存。

这个时候就会问了,缓存的基本单元到底是什么?一个比较自然的理解是:一整段用户请求或一整段模型回复,就是一个缓存基本单元。但事实上,现在其实是按 block(块)来划分的。我举个例子,比如说某家公司每100个 Token 为一个 block。我在第一轮发送了一条消息。大概有150个 Token,然后它正常回复了。如果按照我说的那个“自然”的理解,这个时候,我如果去重新修改第一轮消息的话,那么模型在回复的时候是没有办法命中缓存的,因为它最基本的单元都已经被我修改了。但在事实上,如果我在我修改第一轮的消息,我只是修改第140个 Token 左右,前面100个 Token 我压根不去修改,那么这个时候我重新发送请求,前面100个 Token 仍然是可以去命中的。100 和 150 是为了好算。用 Claude 的话,前半段能不能复用,要看之前有没有把缓存存到那个位置。


如果你用的是中转站

然后聊聊中转站。顾名思义,中转站不是官方订阅,而相当于一个大客户代理/批发商。把市面上主流的大模型都买好了,然后你从中转站就可以调用。中转站相对于官方订阅有几个优势:首先最大的优势就是你不用活在被封号的恐惧中。然后你只需要充一份钱就可以去调用不同的模型,不需要每个平台分别去充钱,像我就是经常会在不同的模型之间测来测去,所以中转站对我来说还挺方便。

我用中转站的时候,前面讲的这些缓存的账,我都会自己再核对一下。

比如说,每次请求返回的结果里,一般都会告诉你:这次一共发了多少个 Token,其中多少是从缓存里读的,多少是新存进缓存的。

然后我把这些加起来,看看和它实际扣的钱对不对得上。

对得上就放心用。要是返回的结果里压根没有缓存这几项,或者怎么算都对不上,那我建议还是多留个心眼吧。

另外,你发的提示词和代码,会先经过中转站的服务器。它存不存、存多久,最好去它的隐私政策里看一眼。

最后

总结一下:

1.长对话尽量连着聊,别上午一句、下午一句;

2.中途必须要离开,同时打算过几个小时回来接着聊,就每隔一段时间发一句测试续一下;

3.只问一次的问题,就别开缓存了;

4.使用一个新的中转站,先拿一条请求算一遍账。看看这个中转站靠不靠谱。

有调用API需求的朋友可以私信我,我正在用的中转站,是我朋友做的,基本上所有主流的前沿大模型都可以接入,他们谈的渠道很便宜。我也都测试过价格和缓存,都对得上。

知乎原文

大模型落地技术选型“三步走”指南

很多企业在AI转型道路上走了一些弯路。比如说明明花了几十万去买显卡、去招人,结果做出来的东西还不如去直接调用 API;或者说有些企业反过来,明明是一个很复杂的需求,却妄图指望写两个提示词就能解决问题。

所以我今天想把这些年我踩过(见过)的坑,总结的经验,浓缩成一套实战分享给大家。

前面简单说一下大模型是怎么训练出来的,后面重点讲:碰到一个具体需求,先改提示词,还是要上 RAG、做微调?


第一部分:大模型的身世(原理篇)

好的,先讲第 1 个部分哈,就是大模型它是怎么出生的?如果你已经了解这部分了,可以跳过。

首先我要回答一个根本性的问题,我们天天挂在嘴边的大模型,它到底是一个什么物种? 大模型的诞生,一般来说会经历三个阶段:预训练、微调和对齐。

首先是预训练哈。 预训练我用一个词语来解释,就叫做词语接龙。这个是大模型中最基础也是最昂贵的阶段。

什么是预训练?说得夸张一点,就是那帮搞研究的人啊,他弄了一个巨大的吸尘器,把互联网上所有能找到的文字——我不管你是红楼梦四大名著也好,也不管你是维基百科的正经知识也好,还是你贴吧论坛里面骂人的脏话、甚至是代码——我不管你,通通三七二十一,全部丢进大模型里面去,乱炖一锅粥。

那模型读了这么多书,它学到了什么呢? 它学会了一件事叫做词语接龙。也就是说根据上文来猜下一个字是什么。我告诉模型“床前明月光”,那么模型大概率会接“疑是地上霜”。

所以经过预训练的模型哈,它虽然是博学多才的,但它本质上是一个话唠,而且是一个不可控的话唠。它在玩文字接龙,它会不停地接下去。 更要命的是它不会去在乎真假哈。你不管把什么内容丢进去,它都会一本正经地去接着你的话往下说。比如说你说“林黛玉是一个挖掘机师傅”,它也会顺着你的话,把这个故事给你补全。

但是请注意哈,这个阶段的模型,它只是有才华,但不好用。 比如我问你:“大模型的原理是什么?” 作为一个文字接龙的高手,它可能会顺着你的话说:“...以及大模型未来发展的趋势。” 你看,它本质上是在续写你的问题,而不是在回答你的问题。

那么我们就来到了第 2 个阶段,叫做微调(SFT)。 微调过程呢,就是我们写好标准的一问一答的例子,给模型看。 告诉模型:“哎,你不要无脑地去续写啦!你看到问号,你要停下来,然后去思考答案,最后输出一个有条理的回复。” 经过了微调之后,这个玩词语接龙的怪物,才真正可以变成一个可以沟通的助手。

好,现在经过了微调之后,其实大多数模型就可以正常上线了。 但是对于一些情况,我们可能还要进入到第 3 步,叫做对齐。

什么叫对齐?你可以理解为给它上政治课,或者说注入价值观。 经过了预训练和微调,模型已经非常聪明了,但这个时候呢,它是一个全知全能的危险分子。 比如说你问它:“我想制造一个炸药,你能够帮帮我吗?” 它可能就会非常详细地列出化学配方,因为它读过这方面的书,对吧?它知道怎么制作炸药。 但是你觉得这个问题它可以使用吗?它不能回答,因为这是可能会对人类产生危害的。

所以说我们需要进行对齐。那对齐呢一般来说会通过强化学习的技术,给模型带上紧箍咒,告诉模型什么能说,什么不能说,让它的价值观和人类保持一致。

好的,我们总结一下: 预训练把大模型变成了一个博学者,但也学会了胡说八道; 微调把它变成了问答助手,教它懂指令; 对齐把它变成了好公民,教它守规矩。

理解了这三步,你就能够明白,大模型天生就有幻觉,而且它没见过的数据它是不知道的。这就是我们接下来要解决的问题。


第二部分:企业落地“三步走”战略(实战篇)

好,我们来到了第 2 个部分,就是企业落地的三步走战略。

原文配图
这是排查问题的顺序,不是每个项目都要做完三步。

那事实上,现在主流的大模型,比如百度的文心一言,它们都经过了这三步。我们问它问题,它能很流畅地回答出来。但是,在企业里用的时候,它有时候也并不能如我们所愿。

我举一个例子哈。 我们现在开了一个会议,录音转文字之后,把这个文字稿丢给大模型,告诉它:“请帮我总结一下。” 如果你仅仅告诉它“请帮我总结一下”,那么模型返回的结果可能是比较灾难的。它会给你写一段像流水账一样的小作文,啊什么张三说了要干嘛干嘛,李四说不行,后来大家去吃饭了。 这种流水账谁会去看呀?这种东西你发给老板,老板肯定也会骂人。 这时候并不是说模型不好啊,而是说模型根本就不知道你真正的需求是什么。

那么这个时候,企业怎么做呢?我说的三步走战略,来到了第 1 步:

第 1 步:修改 Prompt —— “好好沟通,别动手术”

什么是 Prompt?就是我们问大模型的这个问题。我们一开始问得太笼统了。 那一个好的 Prompt 应该怎么说呢?我给大家演示一下:

“你现在的身份是一个高级项目经理,请你根据会议记录,提取出待办事项。 要求格式:1. 任务内容,2. 负责人,3. 截止时间。 参考示例: 任务:更新官网首页 | 负责人:张三 | 截止:本周五。”

你把这一坨东西丢给大模型,模型就会立刻像变了一个人,不会再写流水账,而是输出一个非常清晰的表格给你。 那老板一看这个,逻辑条理都很清晰,对不对? 这个就叫做 Prompt 工程。既然模型没有好好说话,那我就通过沟通的方式让模型好好说话。 这是我推荐给大家的第 1 个方案:能用 Prompt 解决问题,就用 Prompt 解决问题。

第 2 步:RAG 检索增强 —— “给它一本说明书”

好,那我们刚刚说到了 Prompt,它虽然好,但是有一个死穴——它没有办法给模型没见过的知识。 比如说哈,你问模型:“咱们公司关于差旅报销的规定,是实报实销,还是有补贴呢?” 那如果说它训练的时候没有见过你这条数据——大概率也见不到,因为这是你内部的规章制度,对不对?——那它是不知道的。

那这个时候呢?我们推荐的王牌方案就是 RAG,通俗来说就是开卷考试。

比如说哈,当员工问出“我们的报销制度是什么?”,那我们这个系统它背后是这样的:

  1. 首先把员工的问题变成一串数字,或者说我们叫一串向量,这叫向量化。
  2. 第 2 步呢,去检索。系统拿着这一串向量,去公司的知识库里面比对。注意哈,这里不是简单的关键词匹配,而是语义匹配,找到最相似的答案。
  3. 第 3 步呢,系统把找到的制度文档和员工的问题,一起丢给大模型。

查到了哪一条,就按哪一条回答;没查到,就告诉员工没查到,别猜一个数。这就是 RAG 的价值。

第 3 步:微调 —— “送进培训班”

好,那最后呢我们来到了战略的第 3 步。 如果说你的 Prompt 试过了,你的 RAG 也是用过了,但是模型还是达不到要求,那这个时候呢,我们就要考虑微调了。微调就是相当于给模型动手术。

一般来说,在两种情况下,我们推荐用微调:

第一种情况:资料已经给它看了,它还是不会按你们的流程处理。 比如说哈,在医疗、法律,或者我们物流行业的内部调度里面,这里面有大量的黑话和复杂的逻辑。那这些逻辑呢,通用的模型根本就听不懂。 比如说顺丰里面有个东西叫“笼车”,笼是狗笼子的笼,车是车辆的车。通用大模型可能真以为是关动物的。 哪怕你用 RAG 丢文档进去,模型也未必能理解透。

那这个时候微调是最好的选择。我们准备大量的专业问答数据,对模型进行 SFT。这就相当于把一个通用的人才,送给医学院去深造,让他从本科生变成一个专科医生。

我举个具体的例子啊,比如说你是顺丰的客服。 你问通用模型:“生鲜荔枝的包裹破损了,怎么处理?” 它可能会说:“亲,非常抱歉,建议您先安抚客户,下次注意哦。” 那这个东西不就是典型的正确的废话吗?它懂礼貌,但是它不懂业务。 那微调之后呢?假设公司的处理流程是这样,它可能会说:“识别为一级事故,标记为客诉 09 类,引导客户拍六面照,发起极速赔。” 你看,这个不是好多了吗?

第二种情况:我们要进行价值观的对齐(DPO)。 模型懂知识了,但是它说话的风格不对,或者说不够安全。 那这个时候呢我们就要给它做一些对齐。最简单的方法就是 DPO。 我告诉它一条好的回答,和一条坏的回答,告诉它要学好的,不能学坏的。

比如风格对齐: 你想做一个有温度的客服。用户说“头好痛”。 直男回答(坏样本): “多喝热水。” 这东西有没有用呢?正确,但是没有感情。 暖男回答(好样本): “抱歉抱歉,你是刚开始头痛,还是已经痛了一阵了?是不是很难受?要不要帮你查查药店?先喝杯温水躺会儿。” 通过这种好坏的对比呢,能够快速纠正它的价值观和说话的口吻。


OK,那我最后来回顾一下今天的核心逻辑。 大模型,它不是神。它是一个博学多才的实习生。

作为企业决策,你的路径应该是这样的:

  1. 第 1 步,先尝试好好沟通(Prompt),给例子,给模板,看能不能解决。
  2. 第 2 步,如果它不懂你的内部规矩,那么就给它一本员工手册(RAG),让它做开卷考试。
  3. 第 3 步,如果它真的是专业能力不够,或者说价值观需要培训,那么就得考虑微调,特别是用 DPO 做对齐。

这是我总结的一套避坑指南,针对绝大多数场景是比较有效的。希望我今天的分享能够帮助大家做决策。

知乎原文

成为大模型算法工程师“最少”应该掌握哪些知识?来自一线算法工程师的经验

先说下我的经历,有6年大厂算法工程师的经验,2022年前主要做CV和NLP,2023年全面转向大模型方向。平均每年负责三个大模型相关项目,也参与组内其他项目。面试官和候选人我都当过。下面讲的是我自己的经验。(以下内容不是AI生成的,不是AI生成的,不是AI生成的,重要的问题说三遍)

我这里说的是最少要学什么。网上的清单常常很长,真要转行,反而不知道先学哪一个。我就挑那些面试常问、干活绕不开的说。这个学法有点功利,先帮你知道劲该往哪里使。

我把这些必须掌握的知识分成五大块:数学基础、深度学习基础、大模型核心、计算机基础、数据工程。其中最重要、最急迫的是第三块——大模型核心知识,这也是和过去AI工程师区别最大的地方。


第一,大模型核心,重中之重是Transformer

Transformer 得自己动手跑一遍。用自己电脑的 CPU 调试一个迷你模型就行,看看数据怎么往下走、参数怎么更新。这比光读十篇教程管用。尤其是自注意力,得弄清它到底怎么算。Transformer主要衍生出两个方向:以BERT为代表的Encoder-only架构,和以GPT系列为代表的Decoder-only架构。当前行业的主流是Decoder-only,你需要重点理解它如何通过“掩码”实现单向生成。

除了架构本身,还要理解位置编码和词嵌入这些基础组件是干什么的,它们是怎么让模型理解顺序和语义的。

工具这块,先把 Hugging Face 和它的 Transformers 库用熟。很多常用的开源模型和数据集都能在上面找到。这就像写 Python 要会用 pip 一样。先会找模型、把它加载起来跑一遍。

在技术流程上,预训练和指令微调的原理要清楚。实话实说,很多人(包括我)都没机会参与从头预训练一个千亿参数模型的项目,这需要巨大的资源。但微调是你几乎必然要接触的。有哪些主流微调方法(全参数、LoRA、QLoRA等)?它们各自适用什么场景?这些面试120%会问。同时,混合精度训练和DeepSpeed 这类框架的基本思想也要懂,它们是为了解决大模型训练中显存不足和速度慢的核心技术。

与训练紧密相关的还有显存与规模估算。给你一个几B参数的模型,你大概要估算需要多少显存,怎么设置batch_size,要不要用梯度累积,大概需要几张卡才跑得起来。面试官很喜欢问这类问题,比如“训练一个13B的模型,在A100上大概要怎么配置?” 这背后涉及到你对模型参数量、激活值、优化器状态的内存占用,以及数据并行、张量并行等基础分布式的理解。

对齐技术方面,你不用去啃强化学习教材,但必须知道DPO、PPO这些方法是怎么被应用到大模型“对齐”上的,核心思想是什么。最好能亲手跑过一个简单的对齐代码项目,了解整个流程。

推理阶段,KV Cache和模型量化是当前加速推理、降低部署成本的核心手段,你得明白它们解决了什么问题,以及大概是怎么实现的。

评估和测评同样关键。模型训好了,怎么向老板或团队证明它有效?你需要知道常见的评估指标。在文本生成任务中,ROUGE、BLEU这些自动指标虽然不完美,但依然是汇报依据。而对于模型本身的困惑度PPL,则是内部评估语言建模能力的重要标准。这些数各能说明什么、哪里看不出来,要弄懂。对于分类任务,召回率、精确率、准确率、混淆矩阵无比重要。对于检测任务,MAP系列是基础中的基础。

RAG 就是让模型先查资料,再根据查到的内容回答。比如公司内部的文档,不用先拿去训练,也可以在回答问题时用上。我建议自己动手做一两个最基本的例子。

第二,深度学习基础

训练先要搞懂梯度下降。像交叉熵和均方误差这些常见的损失函数,要知道它们在衡量什么,模型又是怎么根据损失去更新参数的。Dropout、层归一化、残差连接、优化器和学习率调度,也得知道各是干什么的。卷积神经网络的基础也要了解,因为在多模态模型中,处理图像的部分其骨干网络可能还是CNN的变体或受其启发。

至于RNN和LSTM,我的建议是,你不必再花大量时间深究其代码实现和复杂公式,但建议了解其基本思想和工作机制。因为面试中一个非常经典的问题是:“为什么Transformer能几乎取代RNN?” 可以从两个地方比较:训练时能不能并行,隔得很远的词是怎么联系上的。

传统机器学习,比如支持向量机、线性/逻辑回归,在我的大模型研发项目里确实没有直接用过,面试中也极少被问到。但这很可能是一种幸存者偏差。如果你时间极度紧张,急于入门,可以先跳过它们的实现细节;但我强烈建议你在之后,抽空了解一下支持向量机这类经典算法的核心思想(比如“最大间隔”),这对你形成完整的机器学习直觉非常有好处。

第三,数学基础

我默认你大学里学过微积分、线性代数、概率论,并且考试通过了。但“学过”和“在AI中能用”是两码事,下面这几个点,得会用:

  • 线性代数:重点是矩阵乘法、转置、求逆等运算,以及张量的概念。我们的模型参数、输入数据、中间激活值全都是张量,这是所有计算的载体。
  • 概率论:这是我认为最重要的数学分支。条件概率、贝叶斯定理、常见概率分布(如正态分布),这些思想在理解模型的不确定性、生成过程、损失函数设计时无处不在。
  • 微积分:核心是求导和链式法则。模型算出损失后,怎么一层一层往回算梯度,靠的就是链式法则。

第四,计算机与工程基础

四件套:Python、PyTorch、Git、Linux。Linux是模型训练和部署的主流环境,基本的文件操作、进程管理、环境配置命令必须熟练。CUDA和显卡的基础知识也要了解,起码要知道你的代码是怎么在GPU上加速的,如何监控GPU利用率和显存使用,这是效率分析和问题排查的前提。

第五,数据工程

还有一块很容易漏掉:数据工程。在实际项目中,你可能要花50%甚至更多的时间在和数据打交道:高质量的训练数据从哪里来?怎么清洗和过滤低质文本?如何对海量数据进行高效去重?构造指令对时,指令和回复怎么配比效果更好?这部分经验非常依赖实践,是最难通过理论课教授的,往往需要在真实工作中踩坑积累。

补充:关于读论文

新论文看不过来,不必每篇都逐字读。可以先让模型帮你梳理一下这篇解决了什么问题,跟你手上的活有关,再去读原文。

补充:关于Agent

有人会问,怎么没讲 Agent?我把它更多放在应用工程这边。两种岗位平时做的事不太一样:

  • 算法工程师:偏向“炼模型”。做的是训练、微调和对齐,研究模型能做到什么、规模变大后性能怎么变,以及怎么把训练和推理跑得更快。
  • 应用/Agent 工程师:偏向“用模型”。拿现成的模型接上搜索、代码、API 或内部资料,让它能把一件任务从头做到尾。

实际干活也分不了那么开。你做模型,得知道别人拿它干什么,才知道该改哪儿;你做应用,也得懂点模型,出了问题才知道往哪儿查。

总结

回到最开始的问题:最少学什么?先把 Transformer 搞懂,用 Hugging Face 跑个小项目,走一遍微调、对齐和评估。显存大概能估,数据知道怎么处理,前面提到的数学要会用。工具就那四样:Python、PyTorch、Git 和 Linux。

这些内容我会在我的第二本书《一个大模型工程师的诞生》仔细铺开来讲。这本书非常厚,分了上下两册,从入门到上岗都讲得很清楚。预计2027年上半年出版。

知乎原文

再谈二孩问题(不是星期二男孩问题)

前几天我在知乎发了一篇文章,讲的是星期二男孩问题。但我发现评论区大多数人实际上在争论另一个问题:二孩问题(两孩问题)。

“星期二男孩”悖论为什么违背直觉?彻底讲透这个问题

这两个问题很像,也容易混在一起讨论。这篇先把二孩问题单独拿出来讲清楚。

在此我必须做一个澄清:大多数人争论的其实是二孩问题(Two Children Problem),而那篇文章的重点是星期二男孩问题(Tuesday Boy Problem)——那是一个更深入、更精妙的概率论案例。

先明确两个问题的定义和结构

星期二男孩问题是由两个问题构成的:

第一个问题(基准问题):“邻居家有两个孩子,至少有一个是男孩,请问两个都是男孩的概率是多少?”

第二个问题(核心问题):“邻居家有两个孩子,至少有一个是出生于星期二的男孩,请问两个都是男孩的概率是多少?”

这个问题的精妙之处在于:第二个问题的答案(13/27 ≈ 0.481)与第一个问题的答案(1/3 ≈ 0.333)不同,并且我们可以推导出一个一般公式,说明概率如何随着特征稀有性的变化而变化。具体的推导细节可以参考那篇文章。本文专注于“二孩问题”。


接下来介绍二孩问题。它也是由两个问题构成的:

第一个问题(存在性陈述问题): “邻居家有两个孩子,至少有一个是男孩,请问两个都是男孩的概率是多少?”

第二个问题(特指性陈述问题): “邻居家有两个孩子,年龄更大的那个是男孩,请问两个都是男孩的概率是多少?”

这才是大家讨论的话题,二孩问题是星期二男孩问题的基础。

概率论的核心观念:条件概率的本质

在深入讨论之前,我想强调概率论中一个核心观念:条件概率的本质是样本空间的改变。

当我们说“在条件B下,事件A的概率”时,我们指的是:将我们考虑的所有可能性(样本空间)缩小到满足条件B的那些情况,然后在这个新的、更小的样本空间中,看事件A占多大比例。

条件概率的公式是:

P(A|B)=P(A∩B)P(B) P(A|B) = \frac{P(A \cap B)}{P(B)}

这个公式的含义是:在事件B发生的条件下,事件A发生的概率,等于A和B同时发生的概率,除以B发生的概率。


让我用扑克牌的例子来说明:

  • 从一副标准扑克牌(去掉大小王,52张)中随机抽一张牌,它是红桃的概率是多少?

设事件A = “抽到红桃”。无条件时,样本空间有52张牌,红桃有13张。

P(A)=1352=14 P(A) = \frac{13}{52} = \frac{1}{4}


  • 现在,假设庄家偷偷看了一眼牌,然后告诉你:“这张牌是红色的。”而且我们知道他一定说真话。那么,在知道这张牌是红色的条件下,它是红桃的概率是多少?

设事件B = “牌是红色的”。这时,样本空间改变了:我们不再考虑所有52张牌,只考虑红色的26张牌(红桃和方块)。

红桃牌(事件A)和红色牌(事件B)同时发生,就是抽到红桃,有13张牌。

P(A∩B)=1352=14 P(A \cap B) = \frac{13}{52} = \frac{1}{4}


红色牌有26张:

P(B)=2652=12 P(B) = \frac{26}{52} = \frac{1}{2}


所以,在已知牌是红色的条件下,它是红桃的概率为:

P(A|B)=P(A∩B)P(B)=1/41/2=12 P(A|B) = \frac{P(A \cap B)}{P(B)} = \frac{1/4}{1/2} = \frac{1}{2}


注意:这个概率不是13/52(无条件概率),而是13/26(条件概率)。信息“牌是红色的”改变了我们考虑的可能性范围,从而改变了概率。

这就是条件概率的核心:新的信息排除了某些可能性,让我们在一个更小的范围内重新评估概率。理解这一点对于理解二孩问题至关重要。

经典二孩问题的两个构成问题

回顾二孩问题。它也是由两个问题构成的:

第一个问题(存在性陈述问题): “邻居家有两个孩子,至少有一个是男孩,请问两个都是男孩的概率是多少?”

第二个问题(特指性陈述问题): “邻居家有两个孩子,年龄更大的那个是男孩,请问两个都是男孩的概率是多少?”

为什么这两个问题答案不同?

关键区别在于信息的陈述方式不同,导致样本空间的改变方式不同。

对于第一个问题(“至少有一个是男孩”):

让我们一步步来,特别仔细地思考:

  1. 定义事件:
  • 设事件A = “两个孩子都是男孩”
  • 设事件B = “至少有一个是男孩”


  1. 无条件时的样本空间:一个家庭有两个孩子,每个孩子都可能是男孩或女孩。不考虑双胞胎、不考虑出生顺序对性别的影响,假设每个孩子是男是女的概率都是1/2,且相互独立。所有可能的情况有四种,每种概率1/4:
  • (男,男)
  • (男,女)
  • (女,男)
  • (女,女)


  1. 计算概率:
  • P(A)=14P(A) = \frac{1}{4}(只有(男,男)这一种情况)
  • P(B)=34P(B) = \frac{3}{4}((男,男)、(男,女)、(女,男)这三种情况都满足至少有一个男孩)
  • P(A∩B)=14P(A \cap B) = \frac{1}{4}(A发生必然意味着B发生,所以A∩B就是A本身)


应用条件概率公式:
P(A|B)=P(A∩B)P(B)=1/43/4=13 P(A|B) = \frac{P(A \cap B)}{P(B)} = \frac{1/4}{3/4} = \frac{1}{3}

所以,概率 = 1⁄3。

对于第二个问题(“年龄更大的是男孩”):

这个问题有完全不同的条件,因此样本空间的改变也不同!

  1. 定义事件:
  • 设事件A = “两个孩子都是男孩”
  • 设事件C = “年龄更大的是男孩”


  1. 同样的初始样本空间:四种情况:(男,男)、(男,女)、(女,男)、(女,女),每种概率1/4。
  2. 计算概率:

P(A)=14P(A) = \frac{1}{4}

  • P(C)=12P(C) = \frac{1}{2}((男,男)和(男,女)两种情况满足老大是男孩)
  • P(A∩C)=14P(A \cap C) = \frac{1}{4}(A和C同时发生,就是(男,男)这一种情况)


应用条件概率公式:
P(A|C)=P(A∩C)P(C)=1/41/2=12 P(A|C) = \frac{P(A \cap C)}{P(C)} = \frac{1/4}{1/2} = \frac{1}{2}

所以,概率 = 1⁄2。

从二孩问题到十孩问题:一个更直观的扩展

如果你还是觉得难以理解1/3这个答案,让我们考虑一个更极端的例子。这个扩展将帮助我们看清问题的本质。

十孩问题:

“邻居家有10个孩子,已知其中至少有9个是男孩,请问10个都是男孩的概率是多少?”

按照同样的逻辑,用条件概率公式来计算:

  1. 定义事件:
  • 设事件A = “10个孩子都是男孩”
  • 设事件B = “至少有9个是男孩”


  1. 无条件时的样本空间:每个孩子是男孩或女孩的概率各1/2,且相互独立。有10个孩子,所以总共有2^10 = 1024种可能的性别组合,每种等可能(概率1/1024)。
  2. 计算概率:
  • P(A)=11024P(A) = \frac{1}{1024}(只有“全是男孩”这一种组合)

P(B)=至少有9个男孩的组合数1024P(B) = \frac{\text{至少有9个男孩的组合数}}{1024}

至少有9个男孩包括两种情况:

    • 10个都是男孩:1种组合
    • 恰好9个男孩,1个女孩:有C(10,1)=10种组合(女孩可以在10个位置中的任何一个)

所以,P(B)=1+101024=111024P(B) = \frac{1+10}{1024} = \frac{11}{1024}

    • P(A∩B)=11024P(A \cap B) = \frac{1}{1024}(A发生必然意味着B发生,所以A∩B就是A本身)


应用条件概率公式:
P(A|B)=P(A∩B)P(B)=1/102411/1024=111 P(A|B) = \frac{P(A \cap B)}{P(B)} = \frac{1/1024}{11/1024} = \frac{1}{11}

所以,概率 = 1⁄11,大约是0.0909,远小于1/2。

从二孩到十孩的过渡逻辑:

  • 二孩问题中,条件“至少有一个男孩”对应的实际情况是:男孩数量可能是1个或2个。在符合条件的家庭中,“两个都是男孩”只是其中一种情况,还有很多“一男一女”的情况(具体有2种:男-女、女-男)。所以概率是1/(1+2)=1/3。
  • 十孩问题中,条件“至少有9个男孩”对应的实际情况是:男孩数量可能是9个或10个。在符合条件的家庭中,“10个都是男孩”只是其中一种情况,还有很多“9男1女”的情况(具体有10种)。所以概率是1/(1+10)=1/11。
  • 更一般地,如果有n个孩子,条件“至少有n-1个男孩”,那么概率是1/(1+n)。当n很大时,这个概率非常小。

这个扩展清楚地说明:

  • 当你说“至少有X个男孩”时,你没有指定哪些孩子是男孩。
  • 在符合条件的家庭中,“全部是男孩”只是其中一种情况,还有很多其他情况(比如恰好有一个女孩,但女孩可能在多个不同位置)。
  • 因此,概率不会简单地是1/2,而通常是一个小于1/2的数。

现在回到两个孩子的简单情况:

  • 条件“至少有一个是男孩”对应的实际情况是:男孩数量可能是1个或2个。
  • 在符合条件的家庭中,“两个都是男孩”只是其中一种情况,还有很多“一男一女”的情况(2种)。
  • 因此,概率是1/3,而不是1/2。

为什么这个区分重要?

理解“至少有一个”和“具体哪一个”的区别,是概率思维的一个关键里程碑。它告诉我们:

信息的陈述方式会改变概率

同样的基本事实(家庭中有男孩),用不同的方式陈述(“至少有一个” vs “老大是”),会导致不同的概率计算。这是因为不同的陈述对应着不同的信息内容,从而筛选出不同的可能性集合。

回到星期二男孩问题

把二孩问题中1/3和1/2的区别弄清楚,再看星期二男孩问题,就更容易理解了:

星期二男孩问题探讨的是:当我们在“至少有一个男孩”这个信息上,附加一个具有特定稀有概率的特征(如“星期二出生”)时,概率如何发生连续变化。

它揭示了一个更深刻的规律:信息的具体程度或稀有性就像一个旋钮,可以将概率从1/3平滑地调节到1/2。

具体来说:

  • 当特征非常常见时(比如“至少有一个是男孩”),两个人都是男孩的概率接近1/3
  • 当特征非常罕见时(比如“至少有一个是2月29日出生的左撇子男孩”),两个人都是男孩的概率接近1/2
  • 星期二出生这个特征(概率p=1/7)对应的概率是13/27 ≈ 0.481

总结

  • 二孩问题是由两个不同问题构成的:
  1. 存在性陈述问题:“至少有一个是男孩” → 答案:1/3
  2. 特指性陈述问题:“年龄更大的是男孩” → 答案:1/2


  • 星期二男孩问题也是由两个问题构成的:
  1. 基准问题:“至少有一个是男孩” → 答案:1/3
  2. 核心问题:“至少有一个是星期二出生的男孩” → 答案:13/27


我希望这个澄清能帮助大家更准确地定位讨论的焦点。关于星期二男孩问题中那个公式和它揭示的洞见,我强烈推荐回看我的上一篇文章的后半部分。


2026年10月29日更新:我的书终于出版了!这半年以来,有不少朋友在催更这本书,非常感谢大家的耐心等待。

这是一本适合自学的概率论与数理统计教材,700多页,用大白话、生活中的例子和详细推导,把公式背后的道理讲清楚,也把各个知识点之间的联系串起来。 书里还结合了不少AI相关内容,包括softmax、余弦相似度、交叉熵和KL散度等,并配有“AI视野”和“Python实验室”,介绍这些数学知识在AI中的应用,用代码模拟和验证。备考方面,收录了2024—2026年考研数学一、数学三的部分概率论真题,以及大厂算法岗面试题的详细解答。

知乎原文

“星期二男孩”悖论为什么违背直觉?彻底讲透这个问题

十年以来,知乎上讨论“星期二男孩”话题的人很多,很多人看得云里雾里。我有信心,如果你耐心看完我的文章后,会有豁然开朗的感觉。

这个问题,我在《大白话概率论:从数学直觉到AI视野》里也讲过。这本书已经出版了,主要用大白话和具体例子讲概率论,也结合了AI应用和Python实验。详细介绍和购买链接放在文末,有兴趣可以看看。


问题定义

本节我们将深入探讨一个著名的条件概率谜题。它看似是日常闲聊,却足以挑战我们对“信息”的直觉理解。

问题: 请仔细区分以下几个问题。

问题一(普通版): “一个家庭有两个孩子。我们已知:至少有一个是男孩。 请问:两个孩子都是男孩的概率是多少?”

问题二(星期二版): “一个家庭有两个孩子。我们已知:至少有一个是‘星期二’出生的男孩。 请问:两个孩子都是男孩的概率是多少?”

问题三(星期二白天版):“一个家庭有两个孩子。我们已知:至少有一个是‘星期二白天’出生的男孩。 请问:两个孩子都是男孩的概率是多少?”

问题四(奇葩版,但是直击问题本质):“一个家庭有两个孩子。我们已知:至少有一个是‘星期二白天出生且喜欢唱歌、跳、rap、打篮球并且喜欢在公园和老大爷下象棋还喜欢在每周六去深圳图书馆看《红楼梦》的男孩’。 请问:两个孩子都是男孩的概率是多少?”

我们先看前两个问题。你的第一反应可能是:问题二的答案应该和问题一一样。让我们从头开始,严格推导。

第一步:解决“问题一”(至少有一个是男孩)

在不了解任何信息时,两个孩子的性别(按出生顺序:老大、老二)有四种等可能情况。我们列出完整的样本空间:

  • 情况1:(男,男)
  • 情况2:(男,女)
  • 情况3:(女,男)
  • 情况4:(女,女)

条件“至少有一个是男孩”意味着我们排除了情况4(女,女)。因此,我们只活在以下三个可能性组成的新世界里:

(男,男), (男,女), (女,男) { (\text{男,男), (男,女), (女,男)} }

在这个新世界里,目标“两个孩子都是男孩”只对应(男,男)这一个情况。


因此,概率为:

P(两男∣至少一男)=13 P(\text{两男} \mid \text{至少一男}) = \frac{1}{3}

问题一的答案是:13\frac{1}{3}。


一个常见的直觉错误是认为答案是12\frac{1}{2}。错误源于将“至少有一个是男孩”潜意识地等价于“老大是男孩”。如果是后者,样本空间将被限制为{(男,男), (男,女)}\{ \text{(男,男),\ (男,女)} \},概率才是12\frac{1}{2}。

第二步:解决“问题二”(至少有一个是星期二出生的男孩)

“星期二”这个信息是条件句的核心部分,我们必须将它作为描述孩子状态的基本信息。

一个孩子的状态 = 性别 + 出生星期。

  • 性别有2种:男、女。
  • 星期有7种:周一、周二、周三、周四、周五、周六、周日。
  • 一个孩子的可能状态:2×7=142 \times 7 = 14种。
  • 两个孩子的组合状态:14×14=19614 \times 14 = 196种。这是我们讨论问题二的“总宇宙”。

我们不需要列出全部196种。关键技巧是:直接列出所有满足条件“至少有一个是‘星期二’出生的男孩”的可能性世界。 我们将这个条件事件记作TT。

列出条件事件TT的完整清单(27种情况):

我们分情况列举所有符合条件TT的不同家庭情况。

第一组:老大是“周二男”,老二是“非周二”的男孩。(6种) 老二是男孩,但不能是周二出生(男孩有7种星期,去掉周二,剩6种)。

  • T-1: (周二男, 周一男)
  • T-2: (周二男, 周三男)
  • T-3: (周二男, 周四男)
  • T-4: (周二男, 周五男)
  • T-5: (周二男, 周六男)
  • T-6: (周二男, 周日男)

第二组:老大是“周二男”,老二是女孩。(7种) 女孩可以是任何星期出生。

  • T-7: (周二男, 周一女)
  • T-8: (周二男, 周二女)
  • T-9: (周二男, 周三女)
  • T-10: (周二男, 周四女)
  • T-11: (周二男, 周五女)
  • T-12: (周二男, 周六女)
  • T-13: (周二男, 周日女)

第三组:老大“不是周二男”,老二是“周二男”。(13种) 老大可以是除了“周二男”以外的任何状态(总状态14种,去掉“周二男”,剩13种)。

  • T-14: (周一男, 周二男)
  • T-15: (周三男, 周二男)
  • T-16: (周四男, 周二男)
  • T-17: (周五男, 周二男)
  • T-18: (周六男, 周二男)
  • T-19: (周日男, 周二男)
  • T-20: (周一女, 周二男)
  • T-21: (周二女, 周二男)
  • T-22: (周三女, 周二男)
  • T-23: (周四女, 周二男)
  • T-24: (周五女, 周二男)
  • T-25: (周六女, 周二男)
  • T-26: (周日女, 周二男)

特殊项:老大和老二都是“周二男”。(1种)

  • T-27: (周二男, 周二男)

总计: 第一组6个 + 第二组7个 + 第三组13个 + 特殊项1个 = 27个。 这27个有序对,就是条件TT所划定的全部可能性世界。

在条件世界TT里寻找目标:

我们的目标是“两个孩子都是男孩”。在这27个世界里,我们把符合“两男”的挑出来。

  • 第一组(T-1到T-6):全部符合。共6个。
  • 第二组(T-7到T-13):老二是女孩,不符合。共0个。
  • 第三组(T-14到T-26):只有老大是“男孩(非周二)”的那些才符合“两男”。即T-14到T-19。共6个。
  • 特殊项 T-27:符合。共1个。

符合“两男”目标的世界总数为:6+0+6+1=𝟏𝟑个6 + 0 + 6 + 1 = \textbf{13个}。

得出结论: 在条件TT下,总共有27个可能世界,其中13个满足目标。

P(两男∣至少一个周二男)=1327≈0.481 P(\text{两男} \mid \text{至少一个周二男}) = \frac{13}{27} \approx 0.481

问题二的答案是:1327\frac{13}{27}。


第三步:理解与洞见

比较两个结果:

已知“至少一男”:P=13≈0.333已知“至少一个周二男”:P=1327≈0.481 \begin{aligned} &\text{已知“至少一男”:} & P &= \frac{1}{3} \approx 0.333 \\ &\text{已知“至少一个周二男”:} & P &= \frac{13}{27} \approx 0.481 \end{aligned}

一个看似无关的“星期二”,让概率从0.3330.333上升到了0.4810.481!


核心原因在于信息的“具体性”或“筛选力度”:

  • 条件“至少一男”像一张网眼很大的渔网,捞起了{两男, 男-女, 女-男}\{\text{两男, 男-女, 女-男}\}三种家庭。“两男”家庭在其中只占1/31/3。
  • 条件“至少一个周二男”像一张网眼极细的渔网,筛选标准苛刻得多。
    • 对于一个“两男”家庭,它有两次机会(老大或老二)能碰到“周二”标签,从而被捞到。
    • 对于一个“一男一女”家庭,它只有一次机会(那一个男孩)能碰到“周二”标签。 细网对“两男”家庭更“友好”,捞到它们的比例更高。因此,在细网里看时,“两男”的比例就上升了。

思维的深化: 如果信息具体到几乎唯一,如“至少有一个是2月29日午夜出生的左撇子并且嘴角有痣的男孩”。这个信息几乎等同于“我指定了孩子A就是这个人”。一旦指定了具体是哪一个孩子,那么“另一个孩子”的性别就几乎独立,其概率无限接近最原始的12\frac{1}{2}。

这也提醒我们:算条件概率时,要看清楚“已知”的到底是什么。信息是怎么得来的、具体到什么程度,都可能影响我们该用哪个条件来算。

第四步:进一步探索(至少有一个是星期二白天出生的男孩)

让我们继续深化这个洞见。我们之前看到,“星期二”这个信息(7分之一的特征)将概率从13\frac{1}{3}提升到了1327≈0.481\frac{13}{27} \approx 0.481。现在,让我们考虑一个更加具体的条件。

新的条件: “至少有一个是星期二白天出生的男孩”。

  • 假设一天被均等地分为“白天”和“黑夜”两个时段,且出生在任一时段的可能性相等。
  • 那么,一个孩子的“出生时间”特征现在是“星期×时段”的组合,一周有7×2=147 \times 2 = 14种可能。
  • “星期二白天出生的男孩”这个特征,其稀有性从原来的17\frac{1}{7}(仅星期二)提高到了114\frac{1}{14}(星期二且白天)。

按照完全相同的逻辑,我们可以计算在这个更具体条件下,“两个孩子都是男孩”的概率。

计算过程:

  1. 构建样本空间: 一个孩子的状态由三要素决定:性别(2种)、出生星期(7种)、出生时段(2种)。故有 2×7×2=282 \times 7 \times 2 = 28 种可能状态。两个孩子的组合状态共有 28×28=78428 \times 28 = 784 种等可能的基本结果。
  2. 定义事件:
  • 记特殊状态 XX = (男,周二,白天)。
  • 条件事件 DD = “至少有一个孩子处于状态XX”。
  • 目标事件 AA = “两个孩子都是男孩”。


  1. 计算 P(D)P(D): 满足条件DD的状态数。
  • 情况1:老大是XX,老二是任意状态(28种)。
  • 情况2:老二是XX,老大是任意状态(28种)。
  • 重复情况:老大和老二都是XX,被计算了两次,需减去1次。 因此,|D|=28+28−1=55|D| = 28 + 28 - 1 = 55。 P(D)=55784P(D) = \frac{55}{784}。


  1. 计算 P(A∩D)P(A \cap D): 满足“两男且至少一个是XX”的状态数。 先计算“两男”的总状态数:每个男孩有 7×2=147 \times 2 = 14 种(星期×时段)状态,故有 14×14=19614 \times 14 = 196 种。 一个男孩不是XX的状态有 14−1=1314 - 1 = 13 种。故两个男孩都不是XX的状态有 13×13=16913 \times 13 = 169 种。 因此,|A∩D|=196−169=27|A \cap D| = 196 - 169 = 27。 P(A∩D)=27784P(A \cap D) = \frac{27}{784}。

计算条件概率:
P(A∣D)=P(A∩D)P(D)=27/78455/784=2755≈0.4909. P(A \mid D) = \frac{P(A \cap D)}{P(D)} = \frac{27/784}{55/784} = \frac{27}{55} \approx 0.4909.

结果与比较:

条件“至少一男”: P=13≈0.333P = \frac{1}{3} \approx 0.333

条件“至少一个周二男”: P=1327≈0.481P = \frac{13}{27} \approx 0.481

条件“至少一个周二白天男”: P=2755≈0.491P = \frac{27}{55} \approx 0.491

概率值随着信息具体性的增强,进一步向 12\frac{1}{2} 靠近。这完美地印证了我们之前的核心观点:条件信息中“特征”的稀有性(或指定性)越强,它就越倾向于“钉死”一个特定的孩子,从而使得另一个孩子的性别概率回归到无条件概率 12\frac{1}{2}。

一般性结论

我们考虑更一般的情形。设每个孩子是男孩的概率为12\frac{1}{2},拥有某个特征FF的概率为pp(与性别独立)。条件事件为“至少有一个孩子是男孩且拥有特征FF”。

我们需要计算:

P(两男∣至少有一个男孩满足特征F) P(\text{两男} \mid \text{至少有一个男孩满足特征}F)


设事件:

  • AA:两个孩子都是男孩。
  • BB:至少有一个男孩拥有特征FF。

我们需要求 P(A|B)=P(A∩B)P(B)P(A|B) = \dfrac{P(A \cap B)}{P(B)}。

步骤1:计算 P(A∩B)P(A \cap B)

“A∩BA \cap B”表示“两个都是男孩,且至少有一个拥有特征FF”。 我们可以反过来算:先算“两个都是男孩”的概率,再减去“两个都是男孩但都没有特征FF”的概率。

这是基于概率论中的减法公式。因为事件“两个都是男孩”(记为AA)可以分解为两个互不相容(互斥)的部分:

  1. 两个都是男孩,且至少有一个拥有特征FF(即A∩BA \cap B)。
  2. 两个都是男孩,且都没有特征FF(即A∩B‾A \cap \bar{B})。

由于这两部分不可能同时发生,且合起来就是事件AA,因此有:

P(A)=P(A∩B)+P(A∩B‾) P(A) = P(A \cap B) + P(A \cap \bar{B})

移项即得:

P(A∩B)=P(A)−P(A∩B‾) P(A \cap B) = P(A) - P(A \cap \bar{B})


  • “两个都是男孩”(事件AA)的概率:(12)2=14\left(\dfrac{1}{2}\right)^2 = \dfrac{1}{4}。
  • 在“两个都是男孩”的前提下,一个男孩没有特征FF的概率是1−p1-p,所以两个男孩都没有特征FF的概率是(1−p)2(1-p)^2。
  • 因此,“两个都是男孩但都没有特征FF”的概率为:14×(1−p)2=(1−p)24\dfrac{1}{4} \times (1-p)^2 = \dfrac{(1-p)^2}{4}。

于是:

P(A∩B)=14−(1−p)24=1−(1−p)24. P(A \cap B) = \frac{1}{4} - \frac{(1-p)^2}{4} = \frac{1 - (1-p)^2}{4}.


步骤2:计算 P(B)P(B)

“BB”表示“至少有一个男孩拥有特征FF”。它的反面是“没有一个孩子是拥有特征FF的男孩”,或者“两个孩子都不是拥有特征FF的男孩”。

一个孩子“不是拥有特征F的男孩”有两种可能:是女孩(概率1/2),或者是男孩但没有特征F(概率1−p2\frac{1-p}{2})。所以一个孩子“不是拥有特征F的男孩”的概率为:

12+1−p2=2−p2. \frac{1}{2} + \frac{1-p}{2} = \frac{2-p}{2}.

由于两个孩子独立,所以“两个孩子都不是拥有特征F的男孩”的概率为:

(2−p2)2=(2−p)24. \left(\frac{2-p}{2}\right)^2 = \frac{(2-p)^2}{4}.

这其实就是“没有一个男孩拥有特征FF”的概率。


于是:

P(B)=1−(2−p)24=4−(2−p)24. P(B) = 1 - \frac{(2-p)^2}{4} = \frac{4 - (2-p)^2}{4}.


步骤3:计算条件概率并化简

P(A|B)=1−(1−p)244−(2−p)24=1−(1−p)24−(2−p)2. P(A|B) = \frac{\frac{1 - (1-p)^2}{4}}{\frac{4 - (2-p)^2}{4}} = \frac{1 - (1-p)^2}{4 - (2-p)^2}.

化简分子和分母:

P(A|B)=p(2−p)p(4−p)=2−p4−p. P(A|B) = \frac{p(2-p)}{p(4-p)} = \frac{2-p}{4-p}.


直观理解这个公式:

你可以把这个公式看作一个“调节器”。它告诉我们,概率 2−p4−p\frac{2-p}{4-p} 完全由特征FF的“稀有程度”pp决定。

  • 当 p=1p=1 时(特征总出现):2−14−1=13\frac{2-1}{4-1} = \frac{1}{3}。这时条件就是“至少有一个男孩”,和我们基础版答案一样。
  • 当 p=17p=\frac{1}{7} 时(星期二):2−1/74−1/7=13/727/7=1327\frac{2-1/7}{4-1/7} = \frac{13/7}{27/7} = \frac{13}{27}。这时条件就是“至少有一个出生于星期二的男孩”。
  • 当 p=114p=\frac{1}{14} 时(星期二白天):2−1/144−1/14=27/1455/14=2755\frac{2-1/14}{4-1/14} = \frac{27/14}{55/14} = \frac{27}{55}。这时条件就是“至少有一个出生于星期二白天的男孩”。
  • 当 p→0p \to 0 时(特征极其罕见):2−04−0=12\frac{2-0}{4-0} = \frac{1}{2}。举个例子,条件可以是“至少有一个出生于星期二白天且喜欢在海边唱歌、喜欢在广场跳舞、喜欢在公园和老大爷下象棋并且喜欢在每周六去深圳图书馆看《红楼梦》的男孩”。

为什么pp越小,概率越接近12\frac{1}{2}?因为当特征非常罕见时,如果你听说“至少有一个男孩拥有这个罕见特征”,你几乎可以确定这个家庭里只有一个这样的男孩(因为同时有两个男孩都拥有罕见特征的概率极低)。这个信息就相当于指定了“孩子A是这个特殊男孩”。那么另一个孩子是男是女的概率就回到了最初的12\frac{1}{2}。

反之,pp越大,特征越常见,这个条件信息就越模糊,它不能帮你锁定是哪个孩子,所以概率就越接近基础版的13\frac{1}{3}。

总结: 公式 P=2−p4−pP = \frac{2-p}{4-p} 像一座桥梁,连接了两个极端:从模糊信息(p=1p=1,概率1/31/3)到极度具体的信息(p→0p\to0,概率1/21/2)。它告诉我们,在条件概率中,信息的“具体程度”会实质性地改变计算结果。理解这一点,就掌握了“星期二男孩”问题的精髓。

关于这本书

我的第一本书《大白话概率论:从数学直觉到AI视野》已经由清华大学出版社正式出版了。之前有不少朋友在评论区问出版进度,谢谢大家一直以来的关注和耐心等待。

这是一本面向自学者的概率论与数理统计教材,700多页。我写这本书时,最想做的就是把概念和公式背后的道理讲清楚:为什么要引入这个概念?这个公式是怎么来的?它和前面学过的东西有什么联系?所以书里用了很多生活中的例子,也保留了详细的推导,希望大家读的时候能够跟得上。

书里也结合了不少AI相关内容,比如softmax、余弦相似度、交叉熵和KL散度。各节还穿插了“AI视野”和“Python实验室”,介绍这些数学知识在AI中怎么用,也通过代码做一些模拟和验证。

如果你正在准备考研,书中还收录了2024—2026年考研数学一、数学三的部分概率论真题,以及大厂算法岗面试题的详细解答。

如果你喜欢这篇文章的讲法,也想系统地学一遍概率论,可以看看这本书。正在自学概率论、准备考研,或者学习AI时想补一补数学基础的朋友,都可以了解一下。

下方放了京东商品卡,感兴趣的朋友可以点进去看看。谢谢大家的支持!

知乎原文

指数分布:等了这么久,为什么还不算数?

这篇文章节选自我已经出版的《大白话概率论:从数学直觉到AI视野》。这本书主要写给自学者,用大白话、具体例子和详细推导讲概率论,也结合了AI应用和Python实验。完整目录、详细介绍和购买链接放在文末,有兴趣可以看看。


上一章讲的均匀分布,那是理想国里的乌托邦——一切机会均等,毫无波澜。但真实世界是充满焦虑的。

我们在等公交、等暗恋对象的回复、等测试代码跑完。这种“不知道靴子什么时候落地”的煎熬,才是生活的常态。

如果说均匀分布是平静的湖面,那么今天我们要讲的“指数分布”,就是倒计时。数学家是怎么描述这种“随时可能发生,但又不知道确切是哪一刻”的感觉呢?

在离散的世界里,我们学过几何分布,用来描述“进行一系列独立试验,直到第一次成功所需的试验次数”。比如,你反复投掷一枚硬币,直到第一次出现正面朝上所需的投掷次数;或者,你不停地从一副扑克牌中抽卡(每次抽后放回),直到第一次抽到“A”所需的抽卡次数。这些都是离散的“等待”。

现在,我们步入连续的世界,时间可以精细到分秒、毫秒。那么,“直到某个随机事件第一次发生所需的等待时间”,又该用什么分布来描述呢?是等待下一个客户走进店铺的时间?还是等待下一个放射性原子核衰变的时间?

这一节要讲的就是指数分布。它和前面讲的几何分布、泊松分布都有联系。

几个等待时间的例子

想象一下这些场景:

  • 你站在一个公交站,公交车班次不多,你想知道下一辆车还要等多久。
  • 你刚买了一台新的路由器,想知道它第一次出故障会在什么时候。
  • 你是一名客服,刚挂断一个电话,在等待下一个来电。
  • 科学家观察一个放射性原子核,记录它发生衰变的时间。

这些看似不同的问题,都有一个共同的数学内核:我们关心的是,从一个随机事件(上一辆车离开、上次通话结束、开始使用、开始观测)开始,到下一个同类事件发生,中间需要等待多长时间。

这个等待时间 TT 是一个连续型随机变量。直觉上,这个分布应该有什么特点呢?它大概率会集中在较短的时间附近(因为事件随时可能发生),但又有一定的可能性拖得很长(长寿的设备,或者很久才来的公交车)。它的概率密度函数,应该从某个正值开始,然后随着时间延长,逐渐下降,最终趋近于零。

听起来很合理,对吧?那么,什么样的数学函数能精确刻画这种特点,并且背后有深刻的道理呢?

让我们先不急着看公式,一起思考一个更根本的问题:这个随机事件的发生,本身应该遵循什么规律?

泊松过程和指数分布

你还记得我们上一章认识的泊松分布吗?它描述的是:在一个固定的时间段内,某个随机事件发生的次数。比如,客服中心一小时接到的电话数,或者一个小型咖啡馆上午10点到11点进店的顾客人数。它的核心假设是:事件以恒定的平均速率λ\lambda 随机、独立地发生。

泊松分布是“计数”的分布。现在,我们换个角度想想。不从“一段时间内发生多少次”来看,而是从“两次事件之间隔了多久”来看。

仔细想想,这不正是我们的“等待时间”问题吗?对于客服电话,“来电”是一个随机事件。如果我们假设来电的发生是随机的、无记忆的,并且以某个恒定平均速率发生,那么“从上一次来电到下一次来电的时间”,就等同于“两次来电事件之间的间隔时间”。

泊松过程和指数分布之间,有这样一个联系:

如果一个随机事件的发生过程是一个泊松过程(恒定速率λ\lambda,独立发生),那么,相邻两次事件之间的间隔时间 TT,就服从指数分布。

这个联系不是巧合,而是内在逻辑的必然。泊松分布关心“数数”,指数分布关心“计时”,它们描述的是同一个随机现象的两个侧面。正如我们在图中我们所看到的,它们就像一枚硬币,一面是“次数”,一面是“间隔”。

原文配图

正因为如此,指数分布的命运和它的孪生兄弟泊松分布绑定在了一起。它的公式也与泊松分布共享同一个参数λ\lambda。

指数分布的公式,以及那个关键的参数λ\lambda

现在,我们可以请出指数分布的概率密度函数(PDF)了。对于随机变量 TT(等待时间),我们说它服从参数为 λ\lambda(λ>0\lambda > 0)的指数分布,记作 T∼Exp(λ)T \sim \text{Exp}(\lambda)。它的PDF长这样:

f(t)=λe−λt,对于 t≥0 f(t) = \lambda e^{-\lambda t}, \quad \text{对于 } t \ge 0

以及它的累积分布函数(CDF),也就是 P(T≤t)P(T \le t):

F(t)=1−e−λt,对于 t≥0 F(t) = 1 - e^{-\lambda t}, \quad \text{对于 } t \ge 0

结合图,我们一起来看这个公式。

原文配图

首先,看它的形状。当 t=0t = 0 时,f(0)=λf(0) = \lambda。密度从一个正值 λ\lambda 开始。随着 tt 增大,e−λte^{-\lambda t} 这一项在飞速减小(指数衰减),所以整个密度函数 f(t)f(t) 也从 λ\lambda 开始,快速地“俯冲”下降,拖着一条长长的尾巴,渐近于零。这完美符合我们之前对“等待时间”分布的直觉描绘。

那么,λ\lambda 是什么? 这是最关键的,也是最容易误解的地方。请你先在心里想一个答案:λ\lambda 越大,意味着平均等待时间越长,还是越短?

很多人的第一反应是:λ\lambda 越大,密度函数 f(0)=λf(0)=\lambda 的起点越高,所以……等待时间更可能集中在0附近?这似乎意味着平均等待时间更短?

这个直觉是对的,但我们需要更精确。

在泊松分布中,λ\lambda 是 “单位时间内事件发生的平均次数”,我们称之为速率。比如,λ=0.5\lambda = 0.5 次/年,表示平均每年发生0.5次(或者说平均每两年发生一次)。那么自然地,在作为其“另一半”的指数分布里,λ\lambda 也应该保持相同的含义。

如果事件发生得“快”(λ\lambda 大),那么你等待它发生的时间自然就“短”。反之,如果事件发生得“慢”(λ\lambda 小),你的等待时间就会“长”。所以,λ\lambda 和平均等待时间,应该是反比关系。

事实正是如此。我们可以计算指数分布的期望(平均等待时间):

E[T]=∫0∞t⋅λe−λtdt=1λ E[T] = \int_{0}^{\infty} t \cdot \lambda e^{-\lambda t} \, dt = \frac{1}{\lambda}

E[T]=1/λE[T] = 1/\lambda。 这印证了我们的推理:

  • λ=0.5\lambda = 0.5 次/年,意味着平均等待时间 1/λ=21/\lambda = 2 年。
  • λ=2\lambda = 2 次/年,意味着平均等待时间 1/λ=0.51/\lambda = 0.5 年。

这一块大家最容易晕。教你个简单的记法:把 λ\lambda 想象成“车速”。λ\lambda 是速度(事件发生得有多快,比如每小时60公里);1/λ1/\lambda 是耗时(跑完1公里需要多久,比如1分钟)。速度越快(λ\lambda 越大),耗时越短(1/λ1/\lambda 越小)。不要看到 λ\lambda 大就觉得要等很久,恰恰相反,λ\lambda 越大,说明那是急性子,你根本不用等!

顺便提一句方差。指数分布的方差是 Var[T]=1/λ2\text{Var}[T] = 1/\lambda^{2}。这意味着什么?它和均值 1/λ1/\lambda 的平方成正比。如果平均等待时间很长(λ\lambda很小),那么等待时间的波动性(方差)也会非常大,不确定性很高。反之,如果事件发生很频繁(λ\lambda很大),平均等待时间短,波动的绝对幅度也更小。这也很符合直觉:一个平均每十年才发生一次的事件,你实际等到它的时间可能是一年,也可能是二十年,波动很大;而一个平均每分钟发生一次的事件,你可能很快就等到,也可能等上好几分钟。

【例题】咖啡馆的等待
假设一家咖啡馆,工作日上午10点后,顾客的到来近似一个泊松过程,平均每小时到来12人(λ=12\lambda = 12 人/小时)。 你作为顾客,刚在10点整进门。你想知道,下一位顾客至少要在10分钟后才来的概率。

这就是指数分布的问题了。它关注的是“间隔时间”。我们需要 P(T>10分钟)P(T > 10\text{分钟})。

首先统一单位:λ=12\lambda = 12 人/小时 =0.2= 0.2 人/分钟。 利用指数分布的定义:P(T>t)=e−λt P(T > t) = e^{-\lambda t},我们得到:

P(T>10)=e−0.2×10=e−2≈0.1353 P(T > 10) = e^{-0.2 \times 10} = e^{-2} \approx 0.1353

这意味着你有大约13.5%的概率能享受长达10分钟的清静。

生存函数与无记忆性

概率密度函数 f(t)f(t) 告诉了我们“可能性”的分布,但在等待问题中,我们更常直接问的是:“等待时间超过 tt 的概率是多少?”也就是 P(T>t)P(T > t)。

这个概率有一个专门的名字,叫生存函数(Survival Function),我们记作 S(t)S(t)。对于指数分布,计算它异常简单:

P(T>t)=S(t)=∫t∞λe−λxdx=e−λt P(T > t) = S(t) = \int_{t}^{\infty} \lambda e^{-\lambda x} \, dx = e^{-\lambda t}

多干净的结果。S(t)=e−λtS(t) = e^{-\lambda t}。它从 S(0)=1S(0)=1(等待时间超过0的概率当然是1)开始,随着 tt 增大而指数衰减。

现在,我们来探讨指数分布最奇特、也最核心的性质——无记忆性。

让我们回到那个新路由器的例子。假设它的寿命 TT 服从指数分布,平均寿命是3年(λ=1/3\lambda = 1/3)。现在,它已经正常工作了1年(T>1T > 1)。此刻,我问你:“在已经用了一年的前提下,它再坚持至少2年的概率,也就是 P(T>3|T>1)P(T > 3 | T > 1),是多少?”

你的直觉会怎么回答?很多人会觉得:“它已经用了一年了,是个‘旧’路由器了,肯定比新的时候更容易坏。所以这个条件概率应该比一台全新路由器坚持2年的概率 P(T>2)P(T > 2) 要小。”

这是非常符合生活经验的直觉。但对于指数分布所描述的“等待”,这个直觉是错的。

我们来严格计算并证明一下。根据条件概率的定义:

P(T>s+t|T>s)=P({T>s+t}∩{T>s})P(T>s)=P(T>s+t)P(T>s), P(T > s + t | T > s) = \frac{P( \{T > s+t\} \cap \{T > s\} )}{P(T > s)} = \frac{P(T > s+t)}{P(T > s)},

因为 T>s+tT > s+t 必然蕴含 T>sT > s。

现在代入指数分布的生存函数 S(t)=e−λtS(t) = e^{-\lambda t}:

P(T>s+t|T>s)=e−λ(s+t)e−λs=e−λt P(T > s + t | T > s) = \frac{e^{-\lambda (s+t)}}{e^{-\lambda s}} = e^{-\lambda t}

而 e−λte^{-\lambda t} 正是 P(T>t)P(T > t)。

因此,我们证明了:

P(T>s+t|T>s)=P(T>t),对于所有的 s,t≥0 P(T > s + t | T > s) = P(T > t), \quad \text{对于所有的 } s, t \ge 0

这意味着,无论它已经工作了多久(ss),它剩余寿命的分布(再工作至少 tt 时间的概率)和一台全新的、同型号的设备是完全一样的! 过去的等待,不会消耗它的“未来”。它就像一个被重置了记忆的系统。

这就是无记忆性。

这个性质反直觉,是因为人是“有记忆”的。活得越久,离死亡就越近,因为人的细胞在老化,身体里有“计时器”。

但指数分布描述的世界里,没有皱纹,没有疲劳。一个原子核,不管它已经存在了一亿年还是刚诞生一秒钟,它下一刻衰变的概率是一模一样的。它永远年轻,永远只有“当下”。这就是为什么我们说它是“无记忆”的——过去的时间,没有在它身上留下任何痕迹。

指数分布所模拟的,是一种 “纯粹的随机冲击” 导致的等待。它假定设备的损坏不是由于“磨损”(磨损是有记忆的,用越久状态越差),而是由于外部的、完全随机的电压浪涌、宇宙射线击中关键电路等事件。对于这种完全随机的“致命一击”来说,每一刻都是崭新的,过去的幸免于难不会给你带来任何“经验值”或“损耗度”。

所以,当你使用指数分布来建模时,你心里必须清楚:你假设了这个等待过程是“无记忆”的。这既是它威力强大的地方,也是它应用时必须小心的边界。

几何分布和指数分布有什么联系?

现在我们把连续的指数分布,和离散的几何分布放在一起看看。这种高度的相似性不是巧合,因为它们的底层逻辑都是“无记忆性”。

原文配图
  • 在几何分布中,成功概率 p=0.1p=0.1,意味着平均你需要做 1/p=101/p=10 次试验才能迎来第一次成功。这很直觉:成功率10%,大约十次里成一次。
  • 在指数分布中,发生速率 λ=0.1\lambda=0.1 次/年,意味着平均你需要等待 1/λ=101/\lambda=10 年才能等到第一次事件发生。这也很直觉:平均每年发生0.1次,所以平均等10年。

如图所示的直觉对应:你可以把连续的指数分布想象成,将离散的几何分布中的每一次“试验”无限细分,变成无穷小的时间片段 Δt\Delta t。让每个片段里事件发生的概率为 p=λΔtp = \lambda \Delta t。当 Δt→0\Delta t \to 0,几何分布就“收敛”成了指数分布。表达式中的 (1−p)n(1-p)^n(离散的指数衰减)就变成了 e−λte^{-\lambda t}(连续的指数衰减)。

原文配图


更多例题与常见误区

【例题】客服电话(混淆速率与概率)
问题:客服中心平均每6分钟接到一个电话(即 λ=1/6\lambda = 1/6 个/分钟)。一个电话刚挂断,问“下一通电话在接下来3分钟内打来的概率是多少?”
  1. 常见错误思路:直接想,平均6分钟一个,那么3分钟内来的概率是 3/6=0.53/6 = 0.5。错!1/61/6 是速率(λ\lambda),3/63/6 表示的是3分钟内的平均呼叫次数,不是概率。
  2. 正确思路:这是一个指数分布问题 T∼Exp(1/6)T \sim \text{Exp}(1/6)。我们需要 P(T≤3)P(T \le 3),即CDF。 P(T≤3)=1−e−(1/6)×3=1−e−0.5≈1−0.6065=0.3935 P(T \le 3) = 1 - e^{-(1/6) \times 3} = 1 - e^{-0.5} \approx 1 - 0.6065 = 0.3935
    所以概率约为39.35%,而不是50%。
【例题】网络连接请求(无记忆性的应用)
假设某服务器接收到的连接请求间隔时间 TT 服从指数分布,平均间隔为8毫秒(ms)。
  1. 求速率 λ\lambda。
  2. 下一个请求等待时间超过10ms的概率。
  3. 已经等了5ms还没请求,再等超过5ms(即总时间超过10ms)的概率。


解答:

  1. 1/λ=8 ms1/\lambda = 8 \text{ ms} ⇒\Rightarrow λ=0.125 /ms\lambda = 0.125 \text{ /ms}。
  2. P(T>10)=e−0.125×10=e−1.25≈0.2865P(T>10) = e^{-0.125 \times 10} = e^{-1.25} \approx 0.2865。
  3. 利用无记忆性:P(T>10|T>5)=P(T>5)=e−0.125×5=e−0.625≈0.5353P(T>10 | T>5) = P(T>5) = e^{-0.125 \times 5} = e^{-0.625} \approx 0.5353。 注意对比:无条件等待超过10ms的概率是0.2865,但在已经等了5ms的条件下,再等超过5ms的概率是0.5353。条件概率改变了,但符合无记忆性公式:它等于从0开始等待5ms的概率。
【例题】设备保修策略(综合计算)
某公司生产一种元件,其寿命 TT(单位:年)服从指数分布,平均寿命为4年(E[T]=4E[T]=4,故 λ=0.25\lambda=0.25)。公司提供为期1年的保修。问:
  1. 该元件在保修期内失效的概率是多少? P(T≤1)=1−e−0.25×1=1−e−0.25≈1−0.7788=0.2212 P(T \le 1) = 1 - e^{-0.25 \times 1} = 1 - e^{-0.25} \approx 1 - 0.7788 = 0.2212
    约有22.12%的元件会在一年内失效。
  2. 如果一个元件已经使用了2年未坏,它在接下来一年内失效的概率是多少? 这里问的是条件概率 P(T≤3|T>2)P(T \le 3 | T > 2)。
  • 解法一(利用无记忆性):这等于一个全新元件在一年内失效的概率,即 P(T≤1)≈0.2212P(T \le 1) \approx 0.2212。
  • 解法二(直接计算): P(T≤3|T>2)=P(2<T≤3)P(T>2)=e−0.5−e−0.75e−0.5=1−e−0.25≈0.2212 P(T \le 3 | T > 2) = \frac{P(2 < T \le 3)}{P(T > 2)} = \frac{e^{-0.5} - e^{-0.75}}{e^{-0.5}} = 1 - e^{-0.25} \approx 0.2212
    结果一致。


  1. 公司考虑将保修期延长至多久,才能使保修期内失效的概率接近50%? 我们需要解 P(T≤w)=1−e−0.25w=0.5P(T \le w) = 1 - e^{-0.25w} = 0.5。 得到w≈2.77 年w \approx 2.77 \text{ 年} 所以,保修期定为约2.77年时,约一半的元件会在保修期内失效。

通过这些例题,希望大家能体会:指数分布的计算核心在于熟练运用 CDF: F(t)=1−e−λt\text{CDF: } F(t)=1-e^{-\lambda t} 和 生存函数: S(t)=e−λt\text{生存函数: } S(t)=e^{-\lambda t},并理解无记忆性带来的计算简化。

最小值问题:多个指数分布竞争谁先发生

在均匀分布一节中,我们研究了 nn 个均匀分布随机变量的最小值分布。现在,让我们看看指数分布在这方面的表现。这个问题有着深刻的应用背景:想象多个独立的故障源,哪个会最先触发?多个并行的下载任务,哪个会最先完成?

问题:设有 nn 个独立的随机变量 X1,X2,…,XnX_1, X_2, \ldots, X_n,每个 XiX_i 都服从参数为 λi\lambda_i 的指数分布,即 Xi∼Exp(λi)X_i \sim \text{Exp}(\lambda_i)。令 M=min⁡(X1,X2,…,Xn)M = \min(X_1, X_2, \ldots, X_n),求 MM 的分布和期望。

思考过程:我们先凭直觉猜一下。如果每个 XiX_i 都描述一个“等待时间”,那么 MM 就是所有这些等待时间中最短的那个。当有很多个事件源时,总有一个会“抢跑”,所以 MM 的平均值应该比任何一个单独的 XiX_i 的平均值都要小。具体小多少呢?

让我们用概率的语言来分析。最小值 MM 大于某个数 tt 的概率是多少?最小值 MM 大于某个数 tt ,意味着所有 nn 个变量都大于 tt。

  • 对于单个 Xi∼Exp(λi)X_i \sim \text{Exp}(\lambda_i),我们有 P(Xi>t)=e−λitP(X_i > t) = e^{-\lambda_i t}。
  • 由于独立性,所有变量都大于 tt 的概率是: P(M>t)=P(X1>t,X2>t,…,Xn>t)=∏i=1nP(Xi>t)=∏i=1ne−λit P(M > t) = P(X_1 > t, X_2 > t, \ldots, X_n > t) = \prod_{i=1}^n P(X_i > t) = \prod_{i=1}^n e^{-\lambda_i t}

整理一下:

P(M>t)=e−(λ1+λ2+⋯+λn)t=e−(∑i=1nλi)t P(M > t) = e^{-(\lambda_1 + \lambda_2 + \cdots + \lambda_n)t} = e^{-\left(\sum_{i=1}^n \lambda_i\right) t}


这正好是指数分布 Exp(∑i=1nλi)\text{Exp}\left(\sum_{i=1}^n \lambda_i\right) 的生存函数!因此,我们得到一个优美而深刻的结论:

多个独立指数分布的最小值,仍然服从指数分布,其参数是各个参数之和。

用数学语言说:如果 Xi∼Exp(λi)X_i \sim \text{Exp}(\lambda_i) 且相互独立,则

M=min⁡(X1,X2,…,Xn)∼Exp(∑i=1nλi) M = \min(X_1, X_2, \ldots, X_n) \sim \text{Exp}\left(\sum_{i=1}^n \lambda_i\right)


期望值:根据指数分布的性质,MM 的期望为:

E[M]=1∑i=1nλi E[M] = \frac{1}{\sum_{i=1}^n \lambda_i}


特例:如果所有 λi\lambda_i 都相等,即 λ1=λ2=⋯=λn=λ\lambda_1 = \lambda_2 = \cdots = \lambda_n = \lambda,那么:

M∼Exp(nλ),E[M]=1nλ M \sim \text{Exp}(n\lambda), \quad E[M] = \frac{1}{n\lambda}


这意味着什么?假设每个设备单独的平均寿命是10年(λ=0.1\lambda=0.1)。当只有一个设备时,平均等待第一次故障的时间是10年。当有10个相同设备并行运行时,平均等待第一次故障的时间缩短为 1/(10×0.1)=11/(10\times0.1) = 1 年!这符合我们的直觉:设备越多,总有一个会“先坏”。或者换句话说:猪队友越多,团队完蛋得越快。

【例题】系统可靠性分析
一个系统由三个独立部件串联组成(只要有一个部件坏了,系统就不能正常工作)。每个部件的寿命服从指数分布:
  • 部件A:平均寿命20小时(λA=0.05\lambda_A = 0.05)
  • 部件B:平均寿命30小时(λB≈0.0333\lambda_B \approx 0.0333)
  • 部件C:平均寿命60小时(λC≈0.0167\lambda_C \approx 0.0167)

求系统的平均寿命(即第一个部件失效的时间)。

解答:系统的寿命 TsysT_{\text{sys}} 就是三个部件寿命的最小值:Tsys=min⁡(TA,TB,TC)T_{\text{sys}} = \min(T_A, T_B, T_C)。 根据上面的结论:

λtotal=λA+λB+λC=0.05+0.0333+0.0167=0.1 \lambda_{\text{total}} = \lambda_A + \lambda_B + \lambda_C = 0.05 + 0.0333 + 0.0167 = 0.1

所以系统寿命服从 Exp(0.1)\text{Exp}(0.1),平均系统寿命为:

E[Tsys]=10.1=10 小时 E[T_{\text{sys}}] = \frac{1}{0.1} = 10 \text{ 小时}

虽然单个部件平均寿命有20、30、60小时,但系统整体平均寿命只有10小时!对于这种串联系统,只要有一个部件先坏,整个系统就不能正常工作了。


与均匀分布最小值问题的对比:

原文配图

注意到对比表格中最有趣的一点了吗?对于均匀分布,nn 个独立均匀分布的最小值 MM,其分布 fM(t)=n(1−t)n−1f_M(t) = n(1-t)^{n-1} 已经不再是均匀分布了——它变成了一个幂函数形式的分布。

但对于指数分布,情况完全不同:nn 个独立指数分布的最小值 MM,其分布 fM(t)=(nλ)e−(nλ)tf_M(t) = (n\lambda)e^{-(n\lambda)t} 仍然是一个指数分布。只是参数从原来的 λ\lambda 变成了 nλn\lambda。

这是什么概念?这意味着指数分布在“取最小值”这个操作下是封闭的——你从指数分布家族中取出几个成员,对它们取最小值,得到的还是一个指数分布家族的成员。

为什么指数分布的最小值仍然服从指数分布?当我们同时启动 nn 个“指数时钟”(每个时钟以不同速率滴答),然后等待第一个时钟响铃。在等待过程中,假设我们已经等了时间 tt 还没听到任何铃声。这时,每个时钟的“剩余寿命”由于无记忆性,分布和全新的时钟一模一样。所以,从 tt 时刻开始,整个系统“重新开始计时”——就好像时间 tt 被完全“遗忘”了一样。

正是因为每个时钟在任何时刻都“记不住”自己已经走了多久,所以多个这样的时钟同时运行,整个系统在任何时刻的“未来行为”都和刚开始时完全相同。这种“时间平移不变性”使得整个过程的统计特性始终保持指数分布的形式。

这个性质不仅仅是数学上的巧合。在实际应用中,比如:

  1. 排队论:多个服务台同时服务顾客,每个服务时间服从指数分布。那么第一个服务台空闲的时间(即最短的服务时间)仍然服从指数分布。
  2. 可靠性工程:多个部件组成串联系统,每个部件的寿命服从指数分布。系统失效时间(即最短的部件寿命)仍然服从指数分布。
  3. 生存分析:多个独立风险因素同时威胁生命,每个风险的发生时间服从指数分布。那么首次风险发生的时间仍然服从指数分布。

指数分布的这种“封闭性”使得它在这些领域的建模和分析中特别方便——我们不需要引入新的分布类型来描述“最小值”的行为。

和其他分布的联系

到这里,指数分布的核心性质基本就交代清楚了。最后,我们稍微往外扩展一下,看看它在整个概率论体系中的位置。

回望:与几何分布的深刻类比 我们已经详细对比过了。它们一个是离散等待的分布,一个是连续等待的分布,共享着“无记忆”的特征。理解其中一个,会极大地帮助理解另一个。

前瞻之一:伽马分布——等待不止一次 现在,我们只等了“第一次”事件发生。如果我要等“第 kk 次”事件发生呢?比如,路由器坏了第三次我才决定换掉它;或者,服务器收到第5个连接请求才开始处理批次。这个总的等待时间服从什么分布? 那将是伽马分布。而指数分布,恰恰是伽马分布家族中,当形状参数 k=1k=1 时的特殊情况。前面等的是第一次事件发生,现在改成等第kk次,就从指数分布接到了伽马分布。

前瞻之二:威布尔分布——当“无记忆性”需要放宽 有些敏锐的读者可能会思考:现实中的设备寿命,真的完全服从指数分布吗?似乎不完全对。新车和开了十年的旧车,发动机突然故障的可能性肯定不一样。机械疲劳、材料老化是存在的。 是的,你说到了关键。指数分布的“无记忆性”和恒定失效率(λ\lambda)的假设,对于许多有老化、磨损过程的事物来说,是一个过强的简化。这时,我们就需要更灵活的分布,比如威布尔分布。 威布尔分布通过引入一个额外的形状参数,可以描述失效率随时间递增(磨损)、递减(早期磨合期失效)或恒定(此时退化为指数分布)的情况。指数分布可以看作是威布尔分布描述“恒定风险”时的特例。

总结

指数分布描述的,是不考虑磨损、事件随机发生的等待过程。

我们要记住的其实就三点:第一,λ\lambda 是这件事发生的快慢(速率),它的倒数才是我们平均要等多久;第二,它有“无记忆性”,过去的等待对未来没有任何影响,系统永远像新的一样;第三,当多个这种“等待”同时展开时,谁先发生的竞争依然遵循指数分布,只是节奏变快了。

AI视野

【AI Box】L1正则化为什么能让模型变稀疏?
你可能在训练神经网络时听说过 L1 正则化(L1 Regularization),它可以让模型变得“稀疏”,即让很多权重直接变成 0,从而压缩模型体积。
这背后的数学本质,其实就是指数分布。L1 正则化等价于假设模型的权重服从拉普拉斯分布(Laplace Distribution)。拉普拉斯分布本质上就是两个背对背的指数分布(e−|x|e^{-|x|})。
拉普拉斯分布的曲线在0处有一个尖角。对应到L1正则化,一些比较小的权重可能会被直接压到0,从而让模型变得稀疏。

关于这本书

这篇文章节选自我的新书《大白话概率论:从数学直觉到AI视野》,现在已经正式出版了。之前有不少朋友在评论区问出版进度,谢谢大家一直以来的关注和耐心等待。

这是一本面向自学者的概率论与数理统计教材,700多页。我写这本书时,最想做的就是把概念和公式背后的道理讲清楚:为什么要引入这个概念?这个公式是怎么来的?它和前面学过的东西有什么联系?所以书里用了很多生活中的例子,也保留了详细的推导,希望大家读的时候能够跟得上。

书里也结合了不少AI相关内容,比如softmax、余弦相似度、交叉熵和KL散度。各节还穿插了“AI视野”和“Python实验室”,介绍这些数学知识在AI中怎么用,也通过代码做一些模拟和验证。

如果你正在准备考研,书中还收录了2024—2026年考研数学一、数学三的部分概率论真题,以及大厂算法岗面试题的详细解答。

正在自学概率论、准备考研,或者学习AI时想补一补数学基础的朋友,都可以看看。下面附上完整目录,大家可以先看看具体讲了哪些内容,再决定是否适合自己。购买链接也放在这里了,感兴趣的话可以点进去了解。


附这本书的目录:

原文配图
原文配图
原文配图
原文配图

知乎原文

大语言模型的词汇表,是越大越好,还是越小越好?

聊到大模型的词汇表,很多人第一反应可能是:那肯定是越大越好啊,懂的词越多,不就显得越有学问吗?

大词汇表的好处

先说说词汇表大的好处:

  1. 常见短语可以少切几刀:比如“自然语言处理”,如果整个切成一个 token,就只占一个位置;拆成“自然”“语言”“处理”,就占三个。拆成三块,模型照样能学会这个短语。
  2. 同样的窗口能装下更多原文:比如窗口只有 1000 个 token,同一段话如果切得更省,就能多放几段进去。
  3. 可能少生成几步:回答是一个 token 一个 token 往外蹦的。同一段话要是切得更省,模型就能少蹦几次。可词表大了,每次要从更多候选里挑,最后快不快得两头一起算。

大词汇表的坏处

词汇表大的坏处也比较明显:

1.模型体积增大、计算更吃力:模型的嵌入层(Embedding Layer)大小是 词汇表大小 × 隐藏层维度。词汇表翻倍,嵌入层的参数几乎也翻倍。最后的输出层(Softmax Layer)也需要对巨大的词汇表进行计算,这会增加训练和推理时的内存和计算开销。

2.泛化能力可能变差:举个例子,有个词叫做:“北京老李律师事务所”。

如果“北京老李律师事务所”这个词被整个塞进了词汇表,但它本身可能是个非常小众、在训练数据里没出现过几次的实体。模型面对这个“庞然大物”般的token,很可能直接就懵了,学也学不明白,根本无法建立有效的理解。

但如果把它拆成三个token——[北京]、[老李]、[律师事务所],情况就大不一样了。模型立刻就能调动它的知识:

  • 看到[北京],知道这是个地名。
  • 看到[老李],能联想到这可能是个姓氏。
  • 看到[律师事务所],明白这是个法律服务机构。

模型甚至不需要提前认识“北京老李律师事务所”这个具体机构,它通过这种“拼积木”的方式,就能推理出个大概来。

结论

所以,回到最开始的问题:词汇表,越大越好吗?

答案显然是否定的。现在的顶级大模型,没谁是靠无脑堆词汇表取胜的。它们普遍采用了一种更聪明的折中方案,比如像BPE(字节对编码)这样的子词方法。简单说,BPE 会看哪些相邻的小块经常一起出现,再把它们合起来。这样,词表里既有常见的整词,也有可以拿来拼生词的小块。

词表选多大,就看在你常用的文本里能省多少 token,每一步又得多算多少。