Part I · 第 4 章 概率 · 4.2

条件概率与贝叶斯定理

门检测器报告"前面有扇门",机器人该信几分?答案不只取决于检测器有多准,还取决于走廊里本来就有多少门。贝叶斯定理把"先验信念"和"传感器的可靠性"合在一起,算出"看到这个读数之后我该相信什么"。这是所有概率定位、地图构建和滤波器的核心一步。

约 25 分钟 前置:4.1 随机变量与分布 4 个交互

    1为什么机器人需要它

    传感器给出的是读数,机器人想知道的是世界的状态。方向恰好相反:传感器的说明书告诉你"如果前面真有一扇门,检测器有 90% 的概率报告有门",即 \(p(z \mid x)\);机器人真正需要的却是"检测器刚刚报告有门,前面真有一扇门的概率是多少",即 \(p(x \mid z)\)。这两个数完全不是一回事。

    贝叶斯定理就是把前者翻译成后者的公式。它几乎无处不在:

    • 定位:机器人看到一扇门,更新"我在走廊哪个位置"的信念;
    • 建图:激光打到障碍物,更新"这个栅格被占用"的概率;
    • 目标检测与数据关联:检测网络给出 0.8 的置信度,它是不是真的?这得看这类物体平时多常见;
    • 卡尔曼滤波、粒子滤波的"更新"一步,从头到尾就是贝叶斯定理(4.7、4.8、4.10)。

    本节先在离散情形下把它彻底看懂:一个二选一的检测器、一条会让你"迷路"的走廊,再看连续读数的检测分数,最后看它在实际系统里最常见的一个坑:同一份证据被重复计算。

    2直觉:用面积来数"哪一种可能"

    把走廊上机器人可能停下的所有位置画成一个单位正方形。先按左右分成两块:左边这一块是"墙前面是门"的位置,占比就是先验 \(p(\text{门})\);右边是"墙前面是墙"。然后把每一块再按上下分开:门这一块里,检测器报告"有门"的部分占 \(p(z \mid \text{门})\)(真阳性率);墙这一块里,检测器错报"有门"的部分占 \(p(z \mid \text{墙})\)(假阳性率)。

    现在检测器响了。机器人知道自己落在两块"报告有门"的区域里的某处,但不知道是哪一块。门的那一块占了多少?这就是后验。关键在于:两块"报告有门"的区域面积是不等的,要比的是面积,而不是纵向的比例。拖动下面的三个手柄试试。

    FIG 1贝叶斯的面积图
    黄色是"门"、青色是"墙";深色区域是检测器报告"有门"的部分,浅色是没报告。拖动顶边圆点改变先验(门的比例),拖动两块里的圆点改变真阳性率和假阳性率。右侧的条形显示:所有深色面积里,黄色占多少,这就是后验。
    试一试
    • 被稀有性骗一次:先验 ≤ 5%、真阳性率 ≥ 90%、假阳性率 ≤ 10%。检测器很准,可后验竟然低于 50%。
    • 保持先验 ≤ 5%,只靠降低假阳性率,让后验升到 80% 以上(需要把假阳性率压到 1% 左右)。
    • 让真阳性率和假阳性率相等(差 < 3%):后验等于先验,这个传感器等于没装。

    用公式写出刚才看到的(\(x\) 是"前面有门",\(z\) 是"检测器报告有门"):

    $$ \hl{post}{\cv{p(x \mid z)}} = \frac{\hl{lik}{p(z \mid x)}\;\hl{prior}{p(x)}}{\hl{evid}{p(z)}} = \frac{p(z \mid x)\,p(x)}{p(z \mid x)\,p(x) + p(z \mid \lnot x)\,p(\lnot x)} $$

    提示:悬停公式里带底色的符号,FIG 1 的对应区域会高亮:先验是两块的宽度,似然是高度,证据 \(p(z)\) 是所有深色区域的总面积。

    核心洞见

    用"自然频数"来想最不容易错:1000 个位置里,20% 是门,共 200 扇,检测器报出 180 个;800 个是墙,10% 误报,80 个。一共响了 260 次,其中 180 次是真门,所以响了之后是门的概率是 \(180/260 \approx 69\%\),不是 90%。稀有的东西,即使检测器很准,误报也能淹没真报。

    3动手玩:一条让人迷路的走廊

    现在把贝叶斯用在定位上。环形走廊分成 16 格,有 5 扇门(黄色)。机器人不知道自己在哪格,所以信念一开始是均匀的。它有一个"门传感器":站在门前,以概率 \(p_{\text{hit}}\) 报告"门";站在墙前,以概率 \(p_{\text{false}}\) 错报"门"。

    每次感知,更新规则是对每一格 \(i\) 做乘法再归一化:新信念 ∝ 似然 × 旧信念。每次前进一格,整个信念跟着平移一格(这里假定走得很准;加上运动噪声是 4.7 节的事)。目标:让信念在真实位置(蓝色圆点,但机器人自己并不知道)上积累起来。

    先点"听到 门",看看均匀信念变成了什么样子;再试着前进几步,每走一步就感知一次。

    FIG 2走廊定位:一次次贝叶斯更新
    从上到下:走廊平面(黄色 = 门,蓝点 = 机器人真实位置);紫色条 = 上一次读数对每一格的似然 \(p(z \mid x_i)\);青色柱 = 当前信念,虚线轮廓 = 更新前的信念。"感知"按真实位置按传感器模型随机抽一个读数;"听到 门/墙"可以强行喂读数,看看假如听到的是那样会怎么变。
    试一试
    • 在均匀信念上点一次"听到 门":信念变成了几个峰?为什么单凭一次读数定不了位?
    • 重置后,用"感知"和"前进"交替进行,让信念在真实位置上超过 80%。
    • 把 \(p_{\text{false}}\) 调到 0.30 以上,仍然把真实位置的信念推到 80% 以上。读数越不可靠,需要的步数越多。
    证据一点点累积

    没有哪一个读数是决定性的:每个读数只是把信念乘上一个权重。几个并不可靠的读数乘在一起,却足以让一个峰从人群中突出来。这就是为什么机器人可以靠一堆噪声很大的传感器,把自己定位得很准。

    4第二个视角:连续的检测分数与后验曲线

    真实的检测器很少只吐"有/无",而是给一个连续的分数 \(s\)(神经网络的置信度,或者特征匹配的内点数)。假设有路标时分数服从 \(\mathcal N(\mu_1, \sigma^2)\),没有路标时服从 \(\mathcal N(\mu_0, \sigma^2)\)(图中取 \(\mu_0 = 0\),\(\mu_1\) 可调)。这时"似然"是两条高斯曲线,贝叶斯定理逐点把它们换成后验概率 \(p(\text{路标} \mid s)\)。

    神奇的是,后验随 \(s\) 变化的曲线是一条漂亮的 S 形(sigmoid)。更神奇的是:先验只是把这条 S 形曲线左右平移,并不改变形状。上图的两条曲线是"先验 × 似然"(面积已按先验缩放),下图是后验。

    FIG 3检测分数 → 后验概率
    黄色 = 有路标(面积 = 先验 \(\pi\)),青色 = 没路标(面积 = \(1-\pi\))。拖动底部圆点(上下两图都行)改变观测到的分数 \(s\);竖线处两条曲线的高度之比就决定了后验。虚线标出后验恰为 50% 的阈值分数。
    试一试
    • 把先验 \(\pi\) 降到 5% 以下,再把 \(s\) 拖到两个均值正中间(\(s = \mu_1/2\),默认是 1.5):后验是多少?阈值分数往哪边挪了?
    • 让后验从 10% 升到 90% 只需要 \(s\) 变化不到 1:增大均值间距或减小 \(\sigma\),使斜率 \((\mu_1-\mu_0)/\sigma^2 \ge 4.4\)。
    对数几率:证据在相加

    把概率换成几率 \(\text{odds} = p/(1-p)\),再取对数,贝叶斯定理就变成加法:\(\ln\text{后验几率} = \ln\text{先验几率} + \ln\text{似然比}\)。对上面两条等方差的高斯,似然比的对数恰好是 \(s\) 的一次函数,所以后验是 sigmoid:\(1/(1+e^{-t})\),\(t\) 是线性的。这也是逻辑回归和神经网络最后一层 sigmoid 的来历。

    5再看数学

    提示:悬停带底色的符号,FIG 1 中对应的区域会高亮。

    条件概率与乘法法则

    "在 \(B\) 已经发生的前提下 \(A\) 的概率",是把世界限制在 \(B\) 的范围内,再看 \(A\) 占多大比例:

    $$ P(A \mid B) = \frac{P(A, B)}{P(B)} \quad (P(B) \gt 0) $$ $$ P(A, B) = P(A \mid B)\,P(B) = P(B \mid A)\,P(A) $$

    最后那个等号的两边都是同一块面积 \(P(A, B)\),只是切的方向不同。这就是 FIG 1 为什么能先左右分、再上下分,也能反过来。

    全概率公式与贝叶斯定理

    读数 \(z\) 可能由状态 \(x\) 的各种取值产生,把它们的贡献加起来(离散的 \(x\) 求和,连续的 \(x\) 积分),就是读数出现的总概率("证据")。把乘法法则的两种写法相除,得到贝叶斯定理:

    $$ \hl{evid}{p(z) = \sum_{x} p(z \mid x)\,p(x)}, \qquad p(z) = \int p(z \mid x)\,p(x)\,dx $$ $$ \hl{post}{p(x \mid z)} = \frac{\hl{lik}{p(z \mid x)}\,\hl{prior}{p(x)}}{\hl{evid}{p(z)}} = \eta\; p(z \mid x)\,p(x), \qquad \eta = \frac{1}{p(z)} $$
    名称符号机器人里的意思
    先验\(p(x)\) = \(\mathrm{bel}^-(x)\)读数到来之前我对状态的信念
    似然\(p(z \mid x)\)传感器模型:若状态是 \(x\),会读到 \(z\) 的概率(4.1 的光束模型就是它)
    证据\(p(z)\)不管状态如何,读到 \(z\) 的总概率,只起归一化作用
    后验\(p(x \mid z)\) = \(\mathrm{bel}(x)\)看到读数之后我对状态的信念

    注意 \(\eta\) 不依赖 \(x\):在 FIG 2 里,每一格先乘似然,最后统一除以总和。你可以先忽略证据,算出"正比于后验"的数,最后再归一化。这也是 4.1 节"误区 3"里归一化的用处。

    几率形式与多个读数

    只有两个假设(有门 / 没门)时,用几率更省事。如果多个读数在给定状态后条件独立,似然就直接相乘,这便是递推的"滤波器"形式:

    $$ \frac{p(x \mid z)}{p(\lnot x \mid z)} = \frac{p(z \mid x)}{p(z \mid \lnot x)} \times \frac{p(x)}{p(\lnot x)} $$ $$ p(x \mid z_{1:t}) = \eta_t\; p(z_t \mid x)\; p(x \mid z_{1:t-1}) $$ $$ p(z_1, z_2 \mid x) = p(z_1 \mid x)\,p(z_2 \mid x) \quad (z_1 \perp z_2 \mid x) $$

    验算 FIG 1 的默认值:先验 0.2(几率 1:4),真阳性率 0.9、假阳性率 0.1(似然比 9),所以后验几率是 \(9 \times 1/4 = 9/4\),后验 \(= 9/13 \approx 0.692\),与面积图一致。

    6机器人中的它:路标检测里的"重复计票"

    机器人每秒处理 30 帧图像,每帧都说"我看到了路标 A",每次单独看似然比都是 2。如果把它们当成独立证据一路乘下去,信念很快就会冲到 99.99%。可如果机器人是停着不动,或者摄像头缓冲区把同一帧重复送了好几次,这些"证据"其实是同一份信息的回声:它们的误差不是独立的,第二次看到的并没有带来新东西。

    在 FIG 4 里,每一"帧"包含若干个"读数"。每帧只有第一个读数携带新信息,其余是回声。比较"天真地每个读数都乘一次"和"每帧只乘一次"的后验。

    FIG 4重复计票:天真的更新 vs 正确的更新
    上方方块:每一列是一帧,青色方块是带来新信息的第一个读数,红色空心方块是重复的回声。下方曲线:横轴是帧数,红线 = 天真地把每个读数都当独立证据,绿线 = 每帧只算一次。竖线是当前设置。所有帧都报告"有路标"。
    试一试
    • 设 1 帧、每帧重复 8 次:天真的后验冲到 99% 以上,而真实证据只有一个读数。
    • 把"每帧重复次数"设为 1:两条线重合,因为这时各读数确实独立。
    真实系统里

    占据栅格建图 (occupancy grid) 的每个格子,维护的就是"被占用"的对数几率:每来一束激光,只需加上一个常数(命中加 \(+l_{\text{occ}}\),穿过加 \(l_{\text{free}}\)),非常便宜。同样的原因,SLAM 里要小心"回环检测"的证据被重复使用,滤波器里则要避免把同一个传感器数据既用来更新、又当作新的先验再用一次(这叫数据乱伦,data incest,分布式融合里尤其常见)。

    7常见误区

    误区 1:把 \(p(z \mid x)\) 当成 \(p(x \mid z)\)

    "检测器 99% 准确,所以它报告有门时,99% 是真的门。"这是忽略基础比率。传感器说明书给的是似然 \(p(z \mid x)\),机器人要的是后验 \(p(x \mid z)\),它们之间隔着先验。医生把"检测阳性"误当成"患病概率 99%"是同一个错误。

    误区 2:先验为 0 的东西永远复活不了

    \(p(x \mid z) \propto p(z \mid x)\,p(x)\):只要 \(p(x) = 0\),无论读数多么支持它,后验仍是 0。FIG 2 里如果某格的信念被压成 0(比如传感器偶尔出错,又把真实位置"否决"了),机器人就再也找不回自己。实践中永远给每个状态留一点点概率下限,也永远别把传感器模型写成 100% 准确。

    误区 3:证据重复计算

    似然相乘的前提是读数在给定状态后条件独立。同一帧的多次处理、同一个传感器缓慢变化的偏差、几个传感器共用同一个错误的外参,都违反这一点。结果是信念过度自信:峰很尖,却是错的。FIG 4 是它最干净的版本。补救办法是只在独立的时间间隔上更新、给协方差加余量,或者显式建模相关性。

    误区 4:忘记归一化

    似然 × 先验之后,所有格子加起来一般不是 1。不除以总和,信念就不是概率分布,下一次更新会越乘越小(或越大),最终下溢。归一化之前如果总和接近 0,说明读数与当前信念严重矛盾,这本身就是一个有用的"我迷路了"的信号。

    8小练习

    1. 一个障碍物检测器:真有障碍物时 99% 报警,没有时 5% 误报。障碍物很罕见,只出现在 1% 的位置。它报警时,真有障碍物的概率大约是?
    真报:\(0.01 \times 0.99 = 0.0099\);误报:\(0.99 \times 0.05 = 0.0495\)。后验 \(= 0.0099/(0.0099 + 0.0495) = 1/6 \approx 17\%\)。误报的总量是真报的 5 倍。
    2. 先验概率 25%(几率 1:3),一个读数的似然比为 4(\(p(z \mid x)/p(z \mid \lnot x) = 4\))。后验概率是?
    后验几率 \(= 4 \times 1/3 = 4/3\),概率 \(= (4/3)/(1 + 4/3) = 4/7 \approx 57\%\)。似然比为 4 并不等于概率变成 4 倍,更不是 80%。
    3. 先验 50/50,一帧图像的似然比为 2。摄像头把同一帧重复处理了 10 次,每次都当作独立证据,天真的后验约为 99.9%。这一帧真实的后验应是?
    同一帧只提供一份证据:几率 \(1 \times 2 = 2\),概率 \(2/3\)。天真的做法算的是 \(2^{10} = 1024\),概率 \(1024/1025\)。
    4. 在 FIG 2 的定位里,某一格的信念已经是 0。之后无论读数如何,这一格的信念会?
    0 乘任何数仍是 0,归一化只是整体除以同一个常数,也不会让 0 变正。这就是实现里总要给信念留一个很小的下限的原因(移动时的运动噪声也会把一部分概率"涂"到邻格,起到类似作用,见 4.7)。

    9延伸阅读

    • S. Thrun, W. Burgard & D. Fox, Probabilistic Robotics, MIT Press, 2005, Sec. 2.3 — 贝叶斯规则与"门是否打开"的经典例子;第 4 章讲离散的直方图滤波,第 7 章是用它做定位
    • 3Blue1Brown, Bayes theorem, the geometry of changing beliefs (video) — 用面积图讲贝叶斯,和本节 FIG 1 的思路一致
    • G. Gigerenzer & U. Hoffrage, "How to Improve Bayesian Reasoning Without Instruction: Frequency Formats", Psychological Review, 1995 — 为什么"自然频数"比百分比好懂
    • T. D. Barfoot, State Estimation for Robotics, Cambridge University Press, 2017, Ch. 2 — 贝叶斯推断与估计的概率论基础
    • C. M. Bishop, Pattern Recognition and Machine Learning, Springer, 2006, Sec. 1.2.3 — 贝叶斯观点下的概率