Monte-Carlo Dropout(蒙特卡罗 dropout),简称 MC dropout。python
一种从贝叶斯理论出发的 Dropout 理解方式,将 Dropout 解释为高斯过程的贝叶斯近似。网络
云里雾里的,理论证实看起来挺复杂,有兴趣能够参考论文:Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning. 以及这篇论文的 Appendix。ide
但其实,MC dropout 用起来就简单了,不须要修改现有的神经网络模型,只须要神经网络模型中带 dropout 层,不管是标准的 dropout 仍是其变种,如 drop-connect,都是能够的。学习
在训练的时候,MC dropout 表现形式和 dropout 没有什么区别,按照正常模型训练方式训练便可。测试
在测试的时候,在前向传播过程,神经网络的 dropout 是不能关闭的。这就是和日常使用的惟一的区别。spa
MC dropout 的 MC 体如今咱们须要对同一个输入进行屡次前向传播过程,这样在 dropout 的加持下能够获得“不一样网络结构”的输出,将这些输出进行平均和统计方差,便可获得模型的预测结果及 uncertainty。并且,这个过程是能够并行的,因此在时间上能够等于进行一次前向传播。code
其实咱们在不少时候都拿了 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]get
以 MNIST 分类为例,当模型在验证集上面效果很烂的时候,将一张图片输入到神经网络,咱们仍然能够获得很高的 softmax 值,这个时候分类结果并不可靠;当模型在验证集上效果很好了,在测试集上甚至都很好,这个时候,咱们将一张图片加入一些噪声,或者手写一个数字拍成照片,输入到网络中,这个时候获得一个较高的 softmax 值,咱们就认为结果可靠吗?咱们这个时候能够理解为,在已知的信息中,模型认为本身作的挺好,而模型自己并不能泛化到全部样本空间中去,对于它没有见过的数据,它的泛化能力可能不是那么强,这个时候模型仍然是以已知的信息对这个没有见过的数据有很强的判断(softmax 某一维值很大),固然有时候判断很好,但有时候判断可能就有误,而模型并不能给出对这个判断有多少 confidence。深度学习
而 MC dropout 能够给出一个预测值,并给出对这个预测值的 confidence,这也就是贝叶斯深度学习的优点所在。
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 层一直处于打开的状态,测试过程重复进行屡次。
[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