Monte-Carlo Dropout,蒙特卡羅 dropout


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM