深度学习虽然在许多领域都得到了较好的应用,但是传统深度学习通常采用最大似然估计来训练,导致模型本身难以衡量模型的不确定性(Model Uncertainty)[1]。以如下场景为例,我们想用卷积网络对图像做分类,模型训练好后,在测试样本上计算出的预测概率/softmax很大,我们可以认为预测的置信度(model confidence)很高,测试样本极有可能属于某一类别,但是这一预测的不确定性是无法衡量的。如下图所示,即使我们的模型在生产场景中有很高的softmax,我们也无法确定模型有多大概率会在这次预测上会出现失误。
左图为softmax的输入,灰色部分为输入的uncertainty,即softmax的输入会在灰色部分随机出现;右图是softmax的输出,我们可以看到输出部分缺乏uncertainty,所以在对x*预测时,其预测为类别1的概率为100%,但我们知道输入存在不确定性,x*预测为类别1的概率也是存在不确定性的
贝叶斯概率理论给我们提供了衡量模型不确定性的数学解法。刻画无限维变量分布的手段为高斯过程(Gaussian Process),衡量确定维度的变量关系的手段为贝叶斯网络(Bayessian neural networks)。
在介绍高斯过程前,我们先了解下模型预测过程中的贝叶斯概率解释,还是上述任务,假设我们训练了一个非线性模型
来对图像做分类,
的参数 为
,训练数据为
,其中
为输入,
为输出。依据贝叶斯概率解释,我们可以得知
的后验概率为
公式右边的三个组成部分,
与模型
无关;
是模型
将
预测为
的概率;
是模型假设的先验分布。如果我们想要预测测试集的情况,就需要先假设
的先验分布。高斯过程模型,就是可以不参数化
,并实现
分布估计的手段。
高斯过程是观测值出现在一个连续域上的随机过程,其标准定义为:
是一个高斯过程,当且仅当对集合
的任意有限子集
,
是一个多元正态分布,也同等于
的任意线性组合是一个单变量正态分布,即
,
为平均值函数,
是协方差函数。
看着高斯过程的定义,感觉像似看了个寂寞。我们通过基于高斯过程的贝叶斯优化,来看高斯过程具体是怎么一回事。
我们先假定已存在目标函数
,如上所示,这个函数我们是不知道的,我们只知道采样样本
,下面我们将通过高斯过程来确定该函数基于采样样本的后验分布,
在
上的数据分布如下所示。
f(x)在[-2, 10]上的数据分布
我们先进行随机采样,采样到了两个点
,如下图中的上半图所示,其他点的后验分布都是基于
产生的,后验分布的产生逻辑就是上述高斯过程的定义,
服从三维高斯分布,当
确定后计算得到
的后验分布,我们当前实验选取的协方差函数为Squared exponential。再看下图中的下半图,我们还需要搜索策略(acquisition function),在
区间内再采一个点,当前实验选取的是Expected Improvement acquisition function,由此我们得到了第三个采样点(下图黑线)。
第一轮迭代
第二轮、第七轮以及第十轮迭代的效果如下图所示,我们基本得到了
的后验分布。通过高斯过程估计
分布的流程大体如此,详情可参见实战代码。
第二轮迭代
第七轮迭代
第十轮迭代
Nannan Li & Xinyu Wu等人[3]采用高斯过程来做视频监控的异常检测。前述已经提到了贝叶斯概率推理,这里我们在重述下分类问题的贝叶斯推理,基于训练数据
,当给定新的输入
时,我们可以计算其对应的输出
的异常概率。 预测概率
的高斯分布如下,其中
,
,
。
同时假定误差项
,最终我们的输出为预测分布和误差分布的叠加,即均值为
,方差为
的正态分布。然后我们通过计算
的概率,设置合理阈值,便可用来做异常检测。
Nannan Li & Xinyu Wu等人基于高斯过程的异常检测效果,地铁监控内监测到的异常行为
本文主要源于Yarin&Zoubin等人[1]通过Mc Dropout去逼近高斯过程的文献,想了解Mc Dropout是如何衡量深度学习不确定性,才有了本文从GP到Bayes Opt到基于GP的异常检测,再到Mc Dropout的详解。下面我们将详细阐述Mc Dropout是如何工作的。
首先给定一个
层的神经网络,具有参数
,其中
的维度为
,
为第
层的神经元个数,以及给定数据集
。贝叶斯推理的目标是给定数据集的条件下,模型参数的先验分布
。由此对未知样本
的预测结果
通过最小化
,实现对
的变分近似
。由此上述预测结果可等价于
上述公式第一项为
似然关于估计后验的期望,希望通过
去解释当前数据,第二项是
项,希望
尽可能接近
,避免过拟合。
Dropout:引入dropout,将参数设为概率为
的伯努利分布,
,
通过变分学习来近似
。由此
再结合参数的伯努利假设,我们最终得到一个有dropout的损失函数,基于MC Dropout的贝叶斯估计,也就等价于训练一个有如下损失函数的传统神经网络
完成训练后,我们可通过带有dropout的神经网络来评估模型的不确定性,类似于3.1中基于高斯过程的异常检测,我们得到了最终的分布,便可在判断异常同时判断其不确定性。
Predictive mean and uncertainties on the Mauna Loa CO2 concentrations dataset
Git地址如上,安装流程如下
$ git clone https://github.com/shendu-ht/gaussian_processes.git
$ cd gaussian_process
$ python setup.py install
实战详情
# 一维数据
# https://github.com/shendu-ht/gaussian_processes/blob/main/example/gp_example_1d.ipynb
#
# 二维数据
# https://github.com/shendu-ht/gaussian_processes/blob/main/example/gp_example_2d.ipynb
协方差函数/优化策略的测试用例
# Acquisition function 测试用例
# https://github.com/shendu-ht/gaussian_processes/blob/main/test/acquisition_test.py
#
# cov function 测试用例
# https://github.com/shendu-ht/gaussian_processes/blob/main/test/cov_func_test.py
[1] Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning.
[2] Introduction to Gaussian process.
[3] Anomaly Detection in Video Surveillance via Gaussian Process.