深度学习中的两种不确定性:偶然不确定性和认知不确定性(Aleatoric Uncertainty & Epistemic Uncertainty)

转载:https://zhuanlan.zhihu.com/p/56986840

注: 本文中,概念、公式与实验均基于 Alex Kendall & Yarin Gal的论文:https://arxiv.org/pdf/1703.04977.pdf

不确定性(Uncertainty)

现在我们传统深度学习算法几乎只能给出一个特定的结果,而不能给出模型自己对结果有多么confident. 的确,在分类问题中,我们会在网络的最后一层添加一个softmax函数来获得概率,但是我们的模型很会给出一个结果,而没有办法告诉我们“我真不知道这是个什么鬼。” 来表示自己对结果不确定。

那么如何让网络获得一个置信度的输出呢?目前一个非常普遍的方法是利用BNN (Bayesian Neural Network)。BNN的原理大体上是,我们网络中每个参数的weight将不再是一个特定的数字,取而代之的是一个先验分布。这样我们train出来的网络将不再是一个函数,而是一个函数的分布[2]。通过这个分布,我们便可以得到一个对结果的置信度。但是,实现过BNN和使用过pyro的朋友们应该知道,BNN是比较难应用在动辄上百卷积层的大型网络上的。它的训练速度,计算复杂度,都限制了它的发展。

本文将讨论深度学习中不同原因导致的不确定性,并介绍如何量化这些不确定性。我们将通过一种名为MC Dropout (Monte Carlo Dropout)的方法来进行贝叶斯推断,之后对loss function的修改来得到不确定性。

1 偶然不确定性和认知不确定性(Aleatoric Uncertainty & Epistemic Uncertainty)

我们先来解释深度学习中存在的两种种类不同的不确定性。

1.1 偶然不确定性

我们初高中学物理的时候,老师肯定提过偶然误差这个词。我们做小车下落测量重力加速度常数的时候,每次获得的值都会有一个上下起伏。这是我们因为气流扰动,测量精度不够等原因所造成的,是无法被避免的一类误差。在深度学习中,我们把这种误差叫做偶然不确定性。

从深度学习的角度来举例子,我们举一个大家应该很比较熟悉的人脸关键点回归问题[3]:
在这里插入图片描述
我们可以看到,对于很相似的一组数据,dataset的标注出现了比较大的误差(见右图的右侧边缘)。这样的误差并不是我们模型带入的,而是数据本来就存在误差。数据集里这样的bias越大,我们的偶然不确定性就应该越大。

1.2 认知不确定性

认知不确定性是我们模型中存在的不确定性。就拿我们文章一开始举的例子来说,假设我们训练一个分类人脸和猩猩脸的模型,训练中没有做任何的增强,也就是说没有做数据集的旋转,模糊等操作。如果我给模型一个正常的人脸,或者是正常猩猩的脸,我们的模型应该对他所产生的结果的置信度很高。但是如果我给他猫的照片,一个模糊处理过得人脸,或者旋转90°的猩猩脸,模型的置信度应该会特别低。换句话说,认知不确定性测量的,是我们的input data是否存在于已经见过的数据的分布之中。

2 两种不确定性的量化

注:本文只关注对回归问题不确定性的量化。对于分类问题,我下方列出的公式会变得更为复杂,我将会在 《深度学习中的两种不确定性(下)》中详细叙述。

2.1. 认知不确定性的量化

和我们以往所做的不同,本文为了获得认知不确定性,将不会在测试阶段禁用Dropout。

这是为什么呢?我们还是需要从BNN说起。
在这里插入图片描述

在这里插入图片描述

2.2. 偶然不确定性的量化

对于偶然不确定性,作者用非常复杂的方式(并没有在论文中说明,但是在参考文献中有,有兴趣的读者可以阅读一下)推出了损失函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 实验

我们首先在一个非常简单的数据集上做一下实验。这是一个简单的sin函数,蓝色数据是我们的训练数据,橙色数据是我们的测试数据。
在这里插入图片描述

其中,在区间[2.5,5.0]内,我们对训练数据施加了一个服从分布N(0,0.5) 的噪声。注意,测试数据的范围明显超过了训练数据。我们使用Adam,lr=0.001,weight_decay=1e-4, Dropout概率为0.1来进行训练,最终获得了如下结果:

偶然不确定性:
在这里插入图片描述
认知不确定性:
在这里插入图片描述
我们可以看到,偶然不确定性在加过噪声的区间明显上升。而认知不确定性在training set范围之外逐渐上升。

接下来,我们用Alex Kendall & Yarin Gal论文里的例子来看看这个方法在更复杂的问题上的表现,以下图片均来自本文一开始提到的论文(本来我是想自己跑一个用自己的结果的,但是手头没显卡。。)。

作者们用DenseNet,在NYUv2 depth上跑了一个深度回归,下边是结果
在这里插入图片描述
从左到右: 输入图片,ground truth,网络输出,偶然不确定性,认知不确定性

我们可看到,偶然不确定性很高的地方往往是那些过于深,没有标注深度信息的地方。认知不确定性主要集中在物品边缘,以及深度很深这些网络非常容易预测失败的地方。详细信息可以参考论文。

写在最后

我们介绍了如何使用MC dropout来确定网络中的不确定性,但是本文只限于讨论了比较简单的回归问题。至于分类问题,公式会变得比较复杂,我现在在跑一个DenseNet的语义分割模型,跑完后整理好,我会在【实验笔记】深度学习中的两种不确定性(下)中详述。

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
针对风光发电不确定的微电网优化调度问题,可以使用基于随机规划的方法进行求解。下面是一个简单的matlab代码示例,供参考: ```matlab % 建立模型 model = optimproblem; % 定义变量 P_wind = optimvar('P_wind', 'LowerBound', 0, 'UpperBound', P_wind_max); P_solar = optimvar('P_solar', 'LowerBound', 0, 'UpperBound', P_solar_max); P_grid_import = optimvar('P_grid_import', 'LowerBound', 0); P_grid_export = optimvar('P_grid_export', 'LowerBound', 0); % 定义约束 constr1 = P_wind + P_solar + P_grid_import - P_grid_export == P_load; constr2 = P_wind <= P_wind_max; constr3 = P_solar <= P_solar_max; % 定义目标函数 obj = f(P_wind, P_solar, P_grid_import, P_grid_export); % 定义风光不确定性 wind_uncertainty = optimexpr; for t = 1:T wind_uncertainty = wind_uncertainty + (P_wind(t) - P_wind_avg)^2; end solar_uncertainty = optimexpr; for t = 1:T solar_uncertainty = solar_uncertainty + (P_solar(t) - P_solar_avg)^2; end % 定义随机规划 stoch_constr = [wind_uncertainty <= wind_uncertainty_threshold, solar_uncertainty <= solar_uncertainty_threshold]; stoch_obj = expect(obj, [wind_uncertainty <= wind_uncertainty_threshold, solar_uncertainty <= solar_uncertainty_threshold]); % 将随机规划加入模型 model.Constraints.stoch_constr = stoch_constr; model.Objective = stoch_obj; % 求解模型 [sol, fval, exitflag] = solve(model); ``` 在上述代码,`P_wind`和`P_solar`分别表示风力发电和太阳能发电的功率,`P_grid_import`和`P_grid_export`分别表示电网的进口和出口功率,`P_load`表示微电网负载功率,`P_wind_max`和`P_solar_max`分别表示风力和太阳能发电的最大功率,`P_wind_avg`和`P_solar_avg`分别表示风力和太阳能发电的平均值,`wind_uncertainty_threshold`和`solar_uncertainty_threshold`分别表示风力和太阳能发电的不确定性阈值,`T`表示时间步数,`f`表示目标函数,`expect`表示期望值,`model`表示优化模型,`sol`表示优化解,`fval`表示优化目标函数值,`exitflag`表示优化求解状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值