为什么要研究uncertainty?
训练好的[神经网络模型本质是一个拥有大量确定参数的函数,不管你给什么输入,它都能给你一个输出。这会导致两种我们不愿意看到的意外情况:
- 对明明错误的预测结果,模型输出的[置信度]却很高
- 对没有见过的输入(OoD,Out-of-ditribution),比如给一个识别猫/狗的模型输入一张桌子图片,模型一定会输出:”这是猫“ or “这是狗”,而不是告诉我们 “它似乎不是猫,也不是狗”
所以,我们希望模型能输出 uncertainty,辅助使用模型的人进行更好地决策。比如上面的例子中,我们希望对错误分类的样本、OoD样本,模型能够给出一个较高的uncertainty。
uncertainy是什么?
参考NIPS2017年的论文 What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision? ,Gal阐述了两种uncertainty:Aleatoric uncertainty(i.e. data uncertainty) 和 Epistemic uncertainty(i.e. model uncertainty),即随机不确定度(也称数据不确定度),和认知不确定度(也称模型不确定度)。
Epistemic uncertainty可以通过增加数据解决,比如下图:只有一个data point的时候,符合要求的模型有很多种可能,uncertainty很高。当数据点增加,模型逐渐确定,uncertainty减小。
How?怎么计算不确定度
1.Epistemic uncertainty建模
如果我们知道所有W,那么就可以计算 $P(D)$了,但这也是不可能的。不过我们可以用蒙特卡洛法 (Monte-Carlo)多次采样逼近:多次采样W计算 $P_i (D)$ ,得到$P(D)$的近似分布,进而得到 $P(W|D)$ 的估计。具体来说,有3种方式:
- Ensembles方法 用类似bootstrap 的方法,对数据集D,采样N次,用N次的结果分别训练模型,然后ensemble模型结果。这个方法的好处是接近真实的Monte-Carlo方法
- MCDropout方法 在网络中加入Dropout层,在测试时也打开Dropout,让Dropout成为采样器。对采样N次的结果进行ensemble处理得到最后的uncertainty。这个方法的好处是不用做很多实验,节省成本,但是由于使用了Dropout,单次训练的时间会变长。
- MCDropConnect方法 和加Dropout的思路差不多。不过这里不用加Dropout layer,而是通过随机drop connection,来达到随机采样 的目的。
从理论层面,MC-Dropout是variantianl inference(BNN的重要概念之一)的近似。
2.Aleatoric uncertainty建模
参考博客: https://zhuanlan.zhihu.com/p/166617220 https://proceedings.neurips.cc/paper/2017/hash/2650d6089a6d640c5e85b2b88265dc2b-Abstract.html https://www.cs.ox.ac.uk/people/yarin.gal/website/thesis/thesis.pdf