当机器学习技术用于“关键任务”应用程序时,可接受的误差幅度会显著降低。
假设您的模型是驾驶一辆汽车,帮助一位医生,甚至只是直接与一个(可能很容易被惹恼的)终端用户交互。在这些情况下,您需要确保在对模型做出的预测采取行动之前,您能够对这些预测充满信心。
随着模糊系统逐渐成为我们模糊生活的一部分,测量预测不确定性变得越来越重要。
值得庆幸的是:在神经网络中有几种测量不确定性的技术,其中一些非常容易实现!首先,让我们来感受一下我们要测量什么。
给不确定性加上一个数字
当你制作世界模型时,你的模型没办法提供百分之百准确的呈现。
原因在于模型是对一个极其复杂的世界的简化。由于某些信息是未知的,因此来自模型的预测具有一定程度的不确定性。
我们世界的某些部分(以及我们衡量它的方式)简直是一团糟。有些事情是随机发生的,这种随机性也是模型预测不确定性的一个来源。
预测不确定性有三种方式:
1. 模型的不确定性
模型的不确定性来自于对问题的“无知”。也就是说,模型不确定性量化了模型可以正确捕获但不能正确捕获的东西。
来自Taboola的Yoel和Inbar提供了一个有趣的例子:
当你想建立一个模型,然后获取到了动物的图片,并预测动物是否会试图吃掉你。你训练模型看狮子和长颈鹿的照片。现在你给它看一个僵尸。由于该模型没有经过僵尸图片的训练,不确定性将会很高。如果训练足够多的僵尸图片,这种不确定性将会减少。
这有时也被称为认识论或结构不确定性。测量模型的不确定性是一个被认为特别具有挑战性的统计学领域。其中一个原因是,随着模型变得更加复杂,像贝叶斯模型平均这样的原则性技术变得非常昂贵。
2. 模型误判
如果您的模型在培训和验证期间产生了良好的预测,但在评估(或生产)期间没有,那么它可能被错误指定了。
模型误判不确定性捕获的场景是您的模型没有使用对训练数据相同的模式来对新数据进行预测。
3. 固有的噪声
这是由数据集中存在的噪声产生的不确定性。这可以归因于测量技术的不完善,或者被测物体本身的随机性。
假设您的数据集包含两张卡片朝下的图像。你很乐观,你想建立一个模型来预测每一张牌的花色和数字。第一张牌标为黑桃a,另一张标为红桃8。在这里,完全相同的特征(一张纸牌朝下的图像)可以与不同的预测(黑桃a或红桃8)相关联。因此,该数据集受到许多固有噪声的影响。
固有噪声有时也称为随机或统计不确定性。固有噪声的大小与贝叶斯错误率有关,贝叶斯错误率是给定分类器的最小可达错误率。正如您所能想象的,模型所能想象的最低错误率是您的数据集包含两张卡片朝下的图像。你感到乐观,你想建立一个模型来预测每一张牌的花色和价值。第一张牌标为黑桃a,另一张标为红桃8。在这里,完全相同的特征(一张纸牌朝下的图像)可以与不同的预测(黑桃a或红桃8)相关联。因此,该数据集受到许多固有噪声的影响。achieve与数据本身的噪声产生的误差量紧密相关。
这些概念严重依赖于贝叶斯统计。我以一种简单的方式概述了这些想法,但这只是这些深层次话题的皮毛。
实施不确定性
此时,您可能会想:“这听起来不错,但我如何在我的模型中实现不确定性呢?“。
贝叶斯神经网络在默认情况下集成了不确定性,除此之外,它在过度拟合和处理照片方面通常更强大:Avi Richards较小的数据集。然而,用于构建贝叶斯神经网络的工具链仍在出现,而且模型在训练和预测时的计算成本往往更高。
此外,将您的工作迁移到概率模型(如贝叶斯神经网络)将会很烦人。
从长远来看,概率性的深度学习很可能会成为默认。不过,现在,在我们现有的工作中集成概率视角的实用技术是一个很好的开始!
Monte Carlo dropout.
几年前,剑桥大学的Yarin和Zoubin发现了一种在不改变神经网络结构或优化技术的情况下近似模型不确定性的方法。
这是一个简短的版本:通过在测试时在每个权重层之前使用dropout,并对几个迭代运行的预测,您可以近似估计贝叶斯不确定性。他们称这个过程被称为Monte Carlo dropout:
- 您向模型提供一个输入。
- 您可以预测对单个输入进行多次迭代,每次随机禁用神经网络的一小部分。
- 取平均输出值。这是你的预测。最后,测量迭代之间的方差。这是模型的不确定性。
直观上我是这样想的:你的预测随着模型的微小结构变化波动得越多,预测的不确定性就越大。
实现Monte Carlo dropout非常简单。在这里,我从一个简单的密集网络开始,来解决Keras构建的MNIST问题。默认情况下,dropout层只在培训期间启用。要在测试时启用dropout层,请为每个层设置training=True。
img_dim = 28
x_in = Input(shape=(img_dim, img_dim,))
x = Dropout(0.2)(x_in, training=True)
x = Dense(500, activation="relu")(x)
x = Dropout(0.2)(x, training=True)
x = Dense(250, activation="relu")(x)
x = Dropout(0.2)(x, training=True)
x_out = Dense(10, activation="softmax")(x)
model = Model(inputs=x_in, outputs=x_out)
model.compile(loss="categorical_crossentropy",
optimizer="rmsprop")
接下来,我们需要一个自定义预测函数,它可以迭代地预测并返回这些迭代的均值和方差。在这个例子中,我们测量的是标准差而不是方差,因为标准差和均值单位相同。
def predict_with_uncertainty(model,
X,
batch_size=None,
num_iterations=100):
last_layer = model.layers[-1]
results = np.zeros((num_iterations,
X.shape[0],
last_layer.output_shape[1]),
dtype="float")
for i in range(num_iterations):
results[i] = model.predict(X,
batch_size=batch_size)
predictions = results.mean(axis=0)
uncertainty = results.std(axis=0)
return predictions, uncertainty
现在你可以用近似的不确定性来预测:
predictions, uncertainty =
predict_with_uncertainty(model,your_data)
问题和评论
正如我们所看到的,Monte Carlo dropout的使用是非常容易的。但是就也许是因为太简单了,Deepmind的伊恩•奥斯班德(Ian Osband)对该技术提出了批评,他指出,Monte Carlo dropout退出的简单模型的预测不确定性不会随着数据的增加而降低。这就提出了这样一个问题:这是对贝叶斯不确定性的不准确近似,还是存在需要进一步阐明的任何潜在假设?
关于这个问题的更多信息,Sebastian Schoner写了一篇很棒的博客文章总结了批评。
在我在Kanda的工作场所,我们对Monte Carlo dropout的有效性有着复杂的体验。
对于一个简单的完全连接的模型,像我前面的例子一样,在mnist上训练,不确定性近似的行为如预期的那样:当呈现噪声而不是手写数字表示时,近似的不确定性更高。我们发现50-100次Monte Carlo dropout退出迭代产生了令人满意的结果。
后来,我们有了一个场景,我们需要在智能手机上本地运行一个图像识别任务,作为AR应用程序的一部分。我们使用了转移学习,在NASNet移动架构上构建了一个分类器。
在智能手机上运行100次NASNet迭代不是一个好主意。
即使使用大量并行化,我们也只能在设备上实际运行大约20次迭代,以便及时提供预测。
其次,不确定性估计是不准确的。当输入随机噪声图像时,不确定性出奇地低。值得注意的是,我们只在位于NASNet顶部的分类器密集连接部分实现了dropout。如果你想分享关于这里出了什么问题的分析的想法,我将非常有兴趣阅读你的回复!
结论
首先,我们研究了为什么量化机器学习模型中的不确定性很重要。然后,我向您介绍了3种不同的预测不确定性的方式:模型不确定性、模型误判和固有噪声。
Monte Carlo dropout是一种易于实现的近似贝叶斯不确定性的技术,但对于该近似是否确实准确仍存在一些分歧。实际上,我发现Monte Carlo dropout对简单模型有效,但对于复杂模型的方法在精度和性能上都存在一些问题。
在机器学习中集成贝叶斯概率在未来只会变得更加重要,我期待看到更多的概率技术成为工具链的一部分。