你的算法可靠吗? 神经网络不确定性度量

当机器学习技术用于“关键任务”时,可接受的误差范围变得非常低。在我们用模型进行自动驾驶、协助医生等场景时,我们必须确保模型所做的预测是有效的.随着模糊系统成为我们生活中越来越重要的一部分,测量预测不确定性变得越来越重要。不过好消息是:有几种技术可以测量神经网络中的不确定性,其中一些非常容易实现!

作者:Daniel Rothmann

量化不确定性

当你建模时,模型无法始终提供准确的答案。

部分原因在于模型是对复杂世界的简化。 由于某些信息未知,因此模型的预测会受到一定程度的不确定性影响。

我们世界的一部分(以及我们测量它的方式)简直是混乱的。 有些事情是随机发生的,这种随机性也是模型预测中不确定性的来源。

预测不确定性可分为3类:

1. 模型不确定性。

模型的不确定性来自对问题的“无知”。 也就是说,模型不确定性导致模型本可以正确捕获信息,但却失败了。

来自Taboola的Yoel和Inbar提供了一个有趣的例子:

你想要建立一个模型来获取动物的图片,并预测该动物是否会尝试吃掉你。你在狮子和长颈鹿的照片上训练了模型,然后给它看僵尸的图,由于该模型没有经过僵尸图片的训练,因此不确定性很高。如果训练有足够的僵尸照片,这种不确定性就会降低。

有时它也被称为认知或结构不确定性。 衡量模型不确定性是一个统计领域,被认为特别具有挑战性。 其中一个原因是,随着模型变得越来越复杂,像贝叶斯模型平均这样的原理技术变得非常昂贵。

2. 模型错判。

如果模型在训练和验证过程中产生良好的预测,但在评估时效果并不好,则出现了错判情况。

3. 固有的噪音。

这是数据集中存在的噪声产生的不确定性。 这可能归因于不完美的测量技术或被测事物的固有随机性。

想象一下,数据集包含2张面朝下的卡片图像。你想建立一个模型来预测每张牌。第一张牌被标记为黑桃A,另一张牌被标记为红心8。在这里,完全相同的特征(面朝下的卡片的图像)可以链接到不同的预测(黑桃A或红心8)。因此,该数据集受到许多固有噪声的影响。

固有噪声有时也称为任意或统计不确定性。 固有噪声量与贝叶斯误差率相关,贝叶斯误差率是给定分类器的最低可实现误差率。 可以想象,模型可以实现的最低错误率与数据本身中的噪声产生的错误量紧密相关。

实现不确定性

在这一点上,你可能会想:“听起来不错,但我如何在模型中实现不确定性?”。

贝叶斯神经网络默认情况下集成了不确定性,此外通常对过度拟合和处理较小数据集更具鲁棒性。然而,用于构建贝叶斯神经网络的工具链仍在不断涌现,并且在训练和进行预测时,模型的计算成本往往更高。

此外,将工作迁移到概率模型(如贝叶斯神经网络)将会很烦人。

从长远来看,概率深度学习可能会变得流行。但就目前而言,将概率视角融入我们现有工作的实用技术是迈出的第一步!

蒙特卡洛dropout

几年前,剑桥大学的Yarin和Zoubin发现了一种近似模型不确定性的方法,而不改变神经网络的结构或优化技术。

这是简短版本:通过在测试时在每个权重层之前使用dropout并运行几次迭代的预测,您可以近似贝叶斯不确定性。他们将此过程称为蒙特卡洛dropout:

1. 将输入提供给模型。

2. 可以预测该单个输入的多次迭代,每次都会随机禁用神经网络的小部分。

3. 取平均输出值。这是你的预测。最后,您可以测量迭代之间的差异。这是模型的不确定性。

直觉上,预测随着模型的微小结构变化而波动越多,预测就越不确定。

实现蒙特卡洛dropout非常简单。 在这里,我从一个简单的Dense网络开始,用于使用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)

结论

首先,我们了解了为什么量化机器学习模型中的不确定性很重要。然后介绍了3种不同的预测不确定性思考方式:模型不确定性,模型错误指定和固有噪声。

蒙特卡洛dropout是一种易于实现的技术来逼近贝叶斯不确定性,但是对于近似是否确实准确存在一些不同意见。实际上,我发现蒙特卡洛辍学对于更简单的模型是有效的,但是在复杂模型的方法方面存在一些问题,无论是在准确性还是性能方面。

将贝叶斯概率整合到机器学习中只会在未来变得更加重要,我期待看到更多的概率技术成为工具链的一部分。

原文链接:https://towardsdatascience.com/is-your-algorithm-confident-enough-1b20df...

本文转自:微信号 - 专知,转载此文目的在于传递更多信息,版权归原作者所有。

推荐阅读