JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

贝叶斯深度学习与不确定性

大多数深度网络只给你一个答案,却没有诚实地告诉你它有多确定。本篇将展示如何让模型学会说「我不知道」——通过高斯过程、贝叶斯神经网络,以及度量与校准不确定性的功夫。

为什么「自信的错误答案」才最危险

设想一个医学影像分类器,它只见过健康的肺和三种肺炎。某天来了一张罕见肿瘤的扫描片——完全在它所学之外的东西。普通网络毫不迟疑:它跑完运算,末端的 softmax 把分数归一化成一个整齐的概率,然后宣布「87% 是肺炎,第二型」。这个数字看起来像信心,其实不是。它只不过是模型被迫在几个选项中挑出的最大值。模型从未被赋予说出那唯一诚实之言的能力:*我从没见过这样的东西。*

这正是不确定性量化要弥合的鸿沟。一个有用的模型不应只输出一个猜测;它应当输出一个猜测,*外加*一个经过校准的、表明这个猜测有多可信的度量。前几个阶梯已教你把学习看作 贝叶斯推断——随证据到来而更新信念。贝叶斯深度学习不过是当你认真对待这一观点、并把它应用到深度学习阶梯里那些庞大而富表达力的模型上时所发生的事。

两种「不知道」

在动用任何数学之前,先把模型不确定的两种本质不同的原因区分开来会很有帮助。偶然不确定性(aleatoric)是世界本身固有的噪声。掷一枚均匀硬币:即便拥有完美的知识,你也无法预测正反。一张模糊的照片、一个抖动的传感器、两位病历完全相同却结局不同的病人——这种不可约的随机性,无论你收集多少数据都不会缩小。模型能做的最好之事,就是如实地把它报告出来。

认知不确定性(epistemic)则不同:它是模型自身的无知,并且*确实*会随着数据增多而缩小。分类器从未见过的那个肿瘤就住在这里。你的训练集从未涉足过的那片输入空间也住在这里。当模型被问及远离其所学之物的东西时,正应是这种不确定性飙升之处——而普通网络那个过度自信softmax,恰恰是这一信号丢失的地方。贝叶斯深度学习的大部分内容,本质上都是用来找回认知不确定性的机器。

高斯过程:一个关于函数的分布

邂逅诚实不确定性最干净利落的地方,是高斯过程。暂时忘掉权重。高斯过程不是给你的数据拟合一条曲线;它持有一个*关于所有能合理解释这些数据的曲线的概率分布*。在你的数据点密集之处,所有候选曲线都被迫挨得很近,所以散布很窄;在数据点之间的空隙里,曲线自由地散开——而这种散开*就是*不确定性,它以一条逐渐变宽的带子替你画了出来。

驱动这一切的引擎是核函数(kernel),它衡量任意两个输入有多相似。这与你早先在支持向量机里遇到的核技巧出于同一直觉:相近的输入应有相近的输出,而核函数恰好编码了「相近」到底意味着什么。选一个平滑的核,你就得到平滑的预测;核函数正是你关于世界形状的先验信念进入模型的入口。用观测数据对这个先验做条件化,便得到一个后验——在每一点上都是一个高斯分布,其均值给出预测,其方差给出疑虑。

它的代价很诚实,值得直说。高斯过程要把每个新点与每一个训练点相比较,因此其成本随数据集规模的立方增长。在几千个点上,这美妙极了——机器人、科学实验、超参数调优;而在数百万张高维图像上,则不切实际。正是这道扩展之墙,使人们在大规模问题上转向神经网络,也使得让*那些*网络变得贝叶斯化,成了顺理成章的下一个目标。

贝叶斯神经网络:带着疑虑的权重

普通神经网络为每个权重学得一个数——一个由梯度下降找到的最佳取值。贝叶斯神经网络则把每一个这样的单一数值换成一个*分布*:它说的不是「这个权重是 0.4」,而是「这个权重大概在 0.4 附近,上下浮动 0.1」。你不再是拟合一个网络;你维护的是一个覆盖整片网络云的后验——其中每个网络都略有不同,却都与训练数据相容。

做预测时,你从那片云中采样出若干个网络,让它们投票。它们一致之处,你便有信心;它们大相径庭之处——通常是面对训练中从未出现过的输入——那种分歧*就是*你的认知不确定性,自然而然地浮现出来。难处在于,覆盖数百万权重的精确后验根本无法计算。于是这一领域倚重你在本阶梯已经见过的近似方法:变分推断用一个更简单的分布去逼近真实后验,而 MCMC 及其他蒙特卡洛方法则从中采样。

令人愉快的意外是:你或许已经在做这件事的廉价版本了。每个从业者都熟悉的两个技巧,原来是乔装打扮的近似贝叶斯推断。在预测时保持 dropout(随机失活)开启、并把网络跑很多遍——即「蒙特卡洛 dropout」——几乎不费代价就采样出了一个粗糙的后验。而从不同随机起点训练一小撮网络组成一个深度集成(deep ensemble),对认知不确定性的捕捉好到令人难堪——它至今仍是我们手头最强的基线之一。

# Monte Carlo dropout: keep dropout ON at inference
preds = [model(x, dropout=True) for _ in range(50)]
mean = average(preds)        # the prediction
spread = stddev(preds)       # the (epistemic) uncertainty
对同一个网络做多次带噪声的前向传播,近似于在众多网络之间投票。

校准:让数字名副其实

产出一个不确定性数字,与产出一个*诚实*的数字,是两回事。校准正是检验诚实与否的标准:在模型说「70% 确定」的所有时刻里,它是否真的大约有 70% 是对的?一个完美校准的天气预报员,每当他说「30% 概率下雨」,那些日子里也应大约有 30% 真的下了雨。你可以把这件事直接画出来——一轴是预测的置信度,另一轴是实测的准确率——表现良好的模型会紧贴对角线。

现代深度网络出了名地*过度自信*:它们动辄说 99%,而实际只有 90% 的时候是对的。好消息是,修正这些数字往往很便宜。温度缩放(temperature scaling)——把进入 softmax 之前的分数除以一个学到的单一数字——常常能在留出数据上修复网络的校准,而丝毫不动其准确率。它并不能给你认知不确定性;它只是让网络已经报告出来的那些置信度变得可信。而这往往正是下游决策所需要的。

对回归模型而言,等价的诚实性检验是可信区间。当模型说「该值以 90% 的概率落在 [10, 14] 之间」时,在大量预测中,真值就应当大约有 90% 的次数落在这条带子里。一个过窄的可信区间,是模型在虚张声势;一个过宽的,则是因谨慎过度而变得无用。校准正是让两者都保持诚实的功夫。

它的落点——以及炒作越界之处

对当今最大的那些模型,值得保持清醒。当一个聊天机器人用流畅、自信的文字陈述一个错误事实时,那叫幻觉(hallucination),而贝叶斯深度学习并不能神奇地治好它。这里的方法量化的是模型*在其训练分布下对其预测*的不确定性;它们并不能给语言模型配上一个事实核查员或一种对真理的感觉。一个幻觉完全可能伴随着很低的预测不确定性而被说出来,因为模型真的「相信」它那个流畅的猜测。知道模型有多确定确实有帮助;但这与知道它是否正确,并不是一回事。

诚实也没有免费的午餐。完整的贝叶斯神经网络既昂贵又难以调对;那些廉价的替身——集成、MC dropout、温度缩放——各自只捕捉了图景的一部分,而且在真正的分布漂移下,它们本身也可能校准得很差。这一切都不是已解决的问题,一个在你的测试集上看起来校准良好的方法,可能在世界一变之际悄然失灵。把每一个不确定性估计都当作一个待检验的假设,而非一份保证。

那么,请记住这一阶梯被设计来传递的那个核心思想。学习就是在不确定性下的推理;一个会报告自己*有多确定*的模型——经过校准、诚实、其认知疑虑会在经验的边缘处增长——比一个只会脱口说出答案的模型,是根本上更值得信赖的伙伴。从一个点到一个分布、从「答案是 X」到「X,而这是该对它信任几分」的这一转变,正是你在这条阶梯上所遇一切的、有原则的核心。把它带向评估、带向安全、带向你所构建的每一个系统。