訂閱
糾錯
加入自媒體

測量模型不確定性的兩種簡單方法

在本文中,我們將介紹兩種方法,它們允許你獲得模型的不確定性:蒙特卡羅Dropout法(MC Dropout)和深度集成法。

它們適用于各種各樣的任務,但在本文中,我們將展示一個圖像分類的示例。它們都相對容易理解和實現,都可以很容易地應用于任何現有的卷積神經網絡架構(例如ResNet、VGG、RegNet等)。為了幫助你快速輕松地應用這些技術,我將提供用PyTorch編寫的這些技術的補充代碼。給出兩個杯子的圖像,你的預測模型有多確定?

在我們開始之前,讓我們回顧一下測量模型不確定性意味著什么,以及它如何對你的機器學習項目有用。

什么是模型不確定性?

就像人類一樣,機器學習模型可以對其預測顯示一定程度的信心。一般來說,在討論模型不確定性時,需要區(qū)分了認知不確定性和任意不確定性。認知不確定性是在模型參數中表示的不確定性。這種類型的不確定性可以通過額外的訓練數據來減少,因此具有“可減少的不確定性”的替代名稱。任意不確定性捕獲環(huán)境固有的噪聲,即觀測。與認知不確定性相比,這種類型的不確定性不能用更多的數據來減少,而是用更精確的傳感器輸出來減少。第三種類型稱為預測不確定性,即模型輸出中傳遞的不確定性。預測不確定性可以結合認知不確定性和任意不確定性。

分類器的softmax輸出示例:

如果你自己已經訓練過簡單的神經網絡,那么最直觀的想法就是模型的softmax輸出,即你經?吹降淖鳛槟P皖A測結果顯示的百分比值。

但是,使用softmax輸出作為模型不確定性的度量可能會產生誤導,并且不是很有用。這是因為softmax函數所做的只是計算模型不同激活值之間的某種“關系”。

因此,你的模型可以在其輸出層的所有神經元中具有較低的激活值,并且仍然達到較高的softmax值。這不是我們的目標。但值得慶幸的是,有多種更有效的技術來估計模型的不確定性,如蒙特卡羅Dropout和深度集成。

為什么模型不確定性有用?

有兩個主要方面使評估模型的不確定性變得有用:

首先是透明度。假設你正在構建一個應用于醫(yī)學圖像分析的機器學習模型。因此,使用你的工具的醫(yī)生在很大程度上依賴于其做出正確診斷的能力。

如果你的模型現在做出了一個預測,它實際上是高度不確定的,但確實將此信息傳達給了醫(yī)生,那么對患者治療的后果可能是致命的。因此,對模型的不確定性進行估計可以在很大程度上幫助醫(yī)生判斷模型的預測。

第二是顯示出改進的空間。沒有一種機器學習模型是完美的。因此,了解模型的不確定性和弱點實際上可以告訴你需要對模型進行哪些改進。

實際上,有一門完整的學科專門研究這門學科,叫做主動學習。假設你已經用1000張圖片和10個類訓練了你的ConvNet。但你仍然有9000多張尚未標記的圖像。如果你現在使用經過訓練的模型來預測哪些圖像是最不確定的,則標記這些圖像并重新訓練模型。結果表明,與這些圖像的隨機抽樣相比,這種不確定性抽樣對模型改進更有效。

好了,讓我們來討論這兩種技術。

技巧1:蒙特卡羅Dropout

Monte Carlo Dropout,簡稱MC Dropout,是一種在模型中使用Dropout層來創(chuàng)建模型輸出變化的技術。

應用于神經網絡的Dropout可視化。

Dropout層通常在訓練期間用作正則化技術。在向前通過網絡的過程中,某些神經元以一定的概率隨機為0。這表明,該模型具有更強的抗過擬合能力。通常,為了不干擾新圖像的前向傳遞,在訓練后禁用這些Dropout層。所以,要使用這種技術,請確保在你的模型中至少實現一個Dropout層。這可能看起來像這樣。

image.png

但是對于MC Dropout,Dropout層仍然被激活,這意味著神經元仍然可以隨機為0。這導致模型的softmax結果發(fā)生變化。要在推理或測試期間使用Dropout,請使用以下代碼:

image.png

現在Dropout仍然可用,因為我們已經把所有Dropout層進入訓練模式!

假設我們現在想在一張圖像上獲得模型的不確定性。為此,我們不僅要對圖像進行一次預測,還要進行多次預測,并分析由多個前向傳播生成的不同輸出。我建議讓模型在一張圖像上預測3到5次。在本文末尾,我將介紹如何組合3或5個輸出。

技巧2:深層集成

第二種估計模型不確定性的技術利用了創(chuàng)建模型集合的優(yōu)勢。與其使用一個模型并預測5次,不如使用同一類型的多個模型,隨機初始化它們的權重,并根據相同的數據對它們進行訓練。

多個神經網絡集成的可視化:

這也將在模型參數中創(chuàng)建變化。如果模型經過穩(wěn)健訓練,并且對圖像有把握,它將為每個前向傳播輸出類似的值。要初始化模型,最好將其保存為模型列表:

image.png

初始化后,所有模型都將在相同的訓練數據上進行訓練。就像MC Dropout者一樣,3或5個模型是一個不錯的選擇。

為了獲得給定圖像上模型的不確定性,將其傳遞到集合中的每個模型中,并將其預測組合起來進行分析。

組合來自多個前向傳播的模型輸出

假設我們?yōu)镸C Dropout定義了5次前向傳播過程,集成模型包含5個模型。現在,我們預計這些輸出之間會出現一些變化,從而顯示出模型的不確定性。為了得到不確定性的最終值,必須首先對這些輸出進行疊加。這段代碼是一個例子,說明了如何實現MCDropout:

image.png

首先,我們定義要執(zhí)行的前向傳播及保存所有預測的空列表。然后我們前向傳播5次。第一個輸出用作結果numpy數組的初始化,所有其他輸出都堆疊在頂部。

這是具有相同基本原則的深層集成代碼:

image.png

現在我們已經組合了所有輸出,讓我們看看如何從這些輸出計算模型的不確定性。

獲取模型不確定性

為了簡單起見,我們將使用預測熵來估計給定圖像上模型的不確定性。預測熵的數學公式為y(標簽)、x(輸入圖像)、Dtrain(訓練數據)、c(類)、p(概率)。

一般來說,預測不確定性告訴你模型看到這張圖像時有多“驚訝”。如果該值較低,則模型對其預測是確定的。如果結果為高,則模型不知道圖像中的內容。計算預測不確定度可以通過這段代碼來實現,這段代碼接收預測數組作為輸入。

import sys

import numpy as np


def predictive_entropy(predictions):

   epsilon = sys.float_info.min

   predictive_entropy = -np.sum( np.mean(predictions, axis=0) * np

log(np.mean(predictions, axis=0) + epsilon),

           axis=-1)


   return predictive_entropy

方程中的ε阻止了除0,這在數學上是沒有定義的。

好吧現在,你有了一個圖像的不確定性值。如前所述,值越高,模型的不確定性越大。

結尾

在本文中,你已經學會了估計模型的不確定性。這項技術也可以通過一些調整應用于目標檢測,它非常強大。

參考資料:

image.png

       原文標題 : 測量模型不確定性的兩種簡單方法

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網
獲取更多精彩內容
文章糾錯
x
*文字標題:
*糾錯內容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網安備 44030502002758號