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