Monte-Carlo Dropout

Monte-Carlo Dropout(蒙特卡罗 dropout),简称 MC dropout。

一种从贝叶斯理论出发的 Dropout 理解方式,将 Dropout 解释为高斯过程的贝叶斯近似。

云里雾里的,理论证明看起来挺复杂,有兴趣可以参考论文:Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning. 以及这篇论文的 Appendix

但其实,MC dropout 用起来就简单了,不需要修改现有的神经网络模型,只需要神经网络模型中带 dropout 层,无论是标准的 dropout 还是其变种,如 drop-connect,都是可以的。

在训练的时候,MC dropout 表现形式和 dropout 没有什么区别,按照正常模型训练方式训练即可。

在测试的时候,在前向传播过程,神经网络的 dropout 是不能关闭的。这就是和平常使用的唯一的区别。

MC dropout 的 MC 体现在我们需要对同一个输入进行多次前向传播过程,这样在 dropout 的加持下可以得到“不同网络结构”的输出,将这些输出进行平均和统计方差,即可得到模型的预测结果及 uncertainty。而且,这个过程是可以并行的,所以在时间上可以等于进行一次前向传播。

神经网络产生的 softmax 概率不能表示 uncertainty?

其实我们在很多时候都拿了 softmax 的概率计算 uncertainty,比如主动学习查询策略中的 least confident、margin、entropy。在 entropy 策略下,softmax 的概率越均匀熵越大,我们就认为 uncertainty 越大;反之,在 softmax 某一维接近 1,其它都接近 0 时,uncertainty 最小。

但是,softmax 值并不能反应该样本分类结果的可靠程度。A model can be uncertain in its predictions even with a high softmax output. [1]

以 MNIST 分类为例,当模型在验证集上面效果很烂的时候,将一张图片输入到神经网络,我们仍然可以得到很高的 softmax 值,这个时候分类结果并不可靠;当模型在验证集上效果很好了,在测试集上甚至都很好,这个时候,我们将一张图片加入一些噪声,或者手写一个数字拍成照片,输入到网络中,这个时候得到一个较高的 softmax 值,我们就认为结果可靠吗?我们这个时候可以理解为,在已知的信息中,模型认为自己做的挺好,而模型本身并不能泛化到所有样本空间中去,对于它没有见过的数据,它的泛化能力可能不是那么强,这个时候模型仍然是以已知的信息对这个没有见过的数据有很强的判断(softmax 某一维值很大),当然有时候判断很好,但有时候判断可能就有误,而模型并不能给出对这个判断有多少 confidence。

而 MC dropout 可以给出一个预测值,并给出对这个预测值的 confidence,这也就是贝叶斯深度学习的优势所在。

MC dropout 示例代码

import tensorflow as tf
mnist = tf.keras.datasets.mnist (x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 inp = tf.keras.layers.Input(shape=(28, 28))
x = tf.keras.layers.Flatten()(inp)
x = tf.keras.layers.Dense(512, activation=tf.nn.relu)(x)
x = tf.keras.layers.Dropout(0.5)(x, training=True) # dropout 在训练和测试时都将开着
out = tf.keras.layers.Dense(10, activation=tf.nn.softmax)(x)
model = tf.keras.Model(inp, out) model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']) model.fit(x_train, y_train, epochs=3)
# 在测试过程,dropout 也是打开的,得到的结果将会有波动,而不是完全一致
for _ in range(10):
print(model.predict(x_test[:1]))

dropout 层一直处于打开的状态,测试过程重复进行多次。

References

[1] Gal, Y., & Ghahramani, Z. (2015). Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning. Retrieved from http://arxiv.org/abs/1506.02142

[2] Gal, Y., & Ghahramani, Z. (2015). Dropout as a Bayesian Approximation: Appendix. Retrieved from http://arxiv.org/abs/1506.02157

【实验笔记】深度学习中的两种不确定性(上)-- 张子杨

Dropout的前世与今生 -- 机器之心

Deep Bayesian Neural Networks. -- Stefano Cosentino

最新文章

  1. Struts2深入学习:OGNL表达式原理
  2. WebP 原理和 Android 支持现状介绍(转)
  3. Content-Type List
  4. Android Conflict with nineoldandroids等报错
  5. caffe的python接口学习(5):生成deploy文件
  6. lsof 常用命令
  7. 表前缀sw_时
  8. nginx 隐藏版本信息
  9. ios设备mdm的实现过程
  10. java类加载时机与过程
  11. poj1456 结构体排序+贪心
  12. 类似 go get –u 的命令行参数实现
  13. 返回类型和return语句
  14. 图像显示 imshow()[OpenCV 笔记5]
  15. App发布AppStore【苹果开发者中心需要做的事】
  16. c语言typedef运用与函数指针
  17. ios学习Day3xiawu
  18. maven安装jar到本地仓库
  19. Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯
  20. iTextSharp - 建立PDF文件

热门文章

  1. 关于dfs的套路
  2. 0x03 前缀和与差分
  3. NAS
  4. curl工具使用实例
  5. Window.open使用总结
  6. ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建
  7. windows--OSError: [Errno 22] Invalid argument: '\u202aE:/desk/Desktop/test.txt' 读取文件的坑
  8. BUPTOJj83
  9. Gradle——创建简单的项目
  10. python入门(三)列表、元组、range()、字典