構建貝葉斯深度學習分類器

這篇文章將講述如何使用Keras和Tensorflow訓練貝葉斯深度學習(BDL)分類器。 在深入瞭解具體的訓練示例之前,介紹幾個重要的高級概念:

• 什麼是貝葉斯深度學習(BDL)?

• 什麼是不確定性(uncertainty)?

• 爲什麼不確定性很重要?

然後,將介紹在深度學習模型中引入不確定性的兩種技術,並將使用Keras在cifar10數據集上通過凍結(frozen)的ResNet50編碼器訓練全連接層。 通過這個例子,還將討論探索貝葉斯深度學習分類器不確定性的預測方法,並提出今後如何改進模型的建議。

1. 什麼是貝葉斯深度學習?

貝葉斯統計(Bayesian statistics)是統計學領域的一種理論,其中關於世界真實狀態的證據用置信程度(degrees of belief)來表達。 貝葉斯統計學與實踐中的深度學習相結合意味着在深度學習模型預測中加入不確定性。早在1991年就有了神經網絡中引入不確定性的想法。簡而言之,貝葉斯深度學習在典型神經網絡模型中發現的每個權重和偏差參數上增加了先驗分佈(prior distribution)。

過去,貝葉斯深度學習模型並不經常使用,因爲它們需要更多參數進行優化,這會使模型難以使用。 然而,最近貝葉斯深度學習變得越來越流行,並且正在開發新技術在模型中引入不確定性,同時參數量與傳統模型相同。

2. 什麼是不確定性?

不確定性指知識有限的狀態,這時候無法準確描述現有狀態、未來結果或不止一種可能的結果。 由於它涉及深度學習和分類,不確定性還包括模糊性; 它是關於人類定義和概念的不確定性,而不是自然界的客觀事實。

3. 不確定性的類型

實際上存在不同類型的不確定性,我們需要了解不同應用所需的類型。這裏將討論兩個最重要的類型 - 認知(epistemic)和任意(aleatoric)不確定性。

認知不確定性

認知的不確定性反映了對哪個模型生成收集數據的無知(ignorance)。給定足夠的數據可以解釋這種不確定性,並且通常稱爲模型(model)不確定性。認知不確定性對於模型非常重要:

• 安全危急(safety critical)應用,因爲需要來理解與訓練數據不同的例子;

• 訓練數據稀疏的小數據集。

觀察認知不確定性的一種簡單方法是用25%的數據集訓練一個模型,並用整個數據集訓練第二個模型。僅在25%數據集上訓練的模型比在整個數據集上訓練的模型具有更高的平均認知不確定性,因爲它看到的例子更少。

在著名的Not Hotdog應用程序中發現了一個有趣的認知不確定性的例子。似乎網絡從未接受過“非熱狗”圖像訓練,包括圖4中的番茄醬。如果模型輸入是腿上有番茄醬的圖片,那麼就會被認爲是熱狗。貝葉斯深度學習模型將預測這種類型的高認識不確定性。

任意不確定性

對於數據無法解釋的信息,任意不確定性解釋了這種不確定性。例如,圖像中的任意不確定性可歸因於遮擋(因爲相機無法穿過物體)或缺乏視覺特徵或圖像的過度曝光區域等。只要通過提高觀察所有可解釋變量(explanatory variables)的精度就能解釋這些不確定性。對於以下情況,任意不確定性建模非常重要:

• 大數據情況,其中認知不確定性大多被解釋;

• 實時應用,無需採用昂貴的蒙特卡羅採樣(Monte Carlo sampling),因爲可以將任意模型(aleatoric models)形成輸入數據的確定性函數。

實際上可以將任意(aleatoric)不確定性分爲兩個類別:

• 數據相關或異方差不確定性(Homoscedastic uncertainty)取決於輸入數據並預測爲模型輸出;

• 任務相關或同方差不確定性(Homoscedastic uncertainty)不依賴於輸入數據。它不是模型輸出,而是一個對輸入數據保持不變的常數並在不同任務之間變化。因此,它可以被描述爲任務相關不確定性。

立體圖像中任意不確定性的具體例子是遮擋(攝像機無法看到的部分),缺乏視覺特徵(即空白牆),或過曝光/曝光不足區域(眩光和陰影)。

4. 爲什麼不確定性很重要?

在機器學習中,試圖創建現實世界的近似表示。流行的深度學習模型產生一個點估計(point estimate)但不是不確定性測度。瞭解一個模型是否缺乏信心或錯誤過度自信可以有助於推理該模型和數據集。上面解釋的兩種不確定性是由於不同的原因導入的。

注意:在分類問題中,softmax輸出提供每個類的概率,但這與不確定性不同。softmax概率是指相對於其他類輸入對給定類的概率。因爲概率是相對於其他類的,所以它無助於解釋模型的整體置信度。

爲什麼任意不確定性很重要?

觀測空間的某些部分具有比其他部分更高的噪聲水平時,任意不確定性很重要。例如,任意不確定性在涉及自駕車第一次死亡事故中起了作用。特斯拉說,在這次事件中, 車上Autopilot未能識別出明亮天空下的白色卡車。可以預測任意不確定性的圖像分割分類器將認識到圖像該特定區域難以解釋並且預測高不確定性。

在特斯拉事件中,雖然汽車的雷達可以“看到”卡車,但雷達數據與圖像分類器數據不一致,並且汽車的路徑規劃最終忽略了雷達數據(雷達數據有噪聲)。如果圖像分類器在其預測中包含高度不確定性,則路徑規劃將忽略圖像分類器預測並使用雷達數據(這顯得過於簡化,但實際就是會發生的情況,參見下面的卡爾曼濾波器)。

爲什麼認知不確定性很重要?

認知不確定性很重要,因爲它確定了模型從未被訓練去理解的情況,因爲它根本不在訓練數據裏。機器學習工程師希望我們的模型能夠很好地適應與訓練數據不同的情況;然而,在深度學習的安全危急應用中,這種希望是不夠的。高認知不確定性是一個紅的旗(red flag),意味着模型更有可能做出不準確的預測,當這種情況發生在安全危急應用中,該模型不應該被信任。

認知不確定性也有助於探索數據集。例如,認知不確定性對20世紀80年代這種特殊的神經網絡事故(mishap)有所幫助。當時,研究人員訓練了一個神經網絡識別隱藏在樹木中的坦克,相對那些沒有坦克的樹木。經過訓練,網絡在訓練集和測試集上表現非常出色。唯一的問題是坦克的所有圖像都是在陰天拍攝的,而所有沒有坦克的圖像都是在晴天拍攝的。分類器實際上已經學會識別晴天和陰天。

深度學習模型中的不確定性預測在機器人技術中也很重要。比如自駕車使用卡爾曼濾波器跟蹤物體。卡爾曼濾波器結合了一系列包含統計噪聲的測量數據,併產生比任何單次測量更準確的估計。傳統的深度學習模型無法爲卡爾曼濾波器做出貢獻,因爲它們只預測結果而不包括不確定性項。理論上,貝葉斯深度學習模型可以促進卡爾曼濾波器跟蹤。

5. 計算分類深度學習模型的不確定性

任意和認知不確定性是不同的,因此,它們的計算方式不同。

計算任意不確定性

任意不確定性是輸入數據的函數。因此,深度學習模型可以用修改的損失函數來學習預測任意不確定性。對於分類任務,貝葉斯深度學習模型有兩個輸出,即softmax值和輸入方差,而不是僅預測softmax值。教模型預測任意方差是無監督學習的一個例子,因爲該模型沒有可供學習的方差標籤。

可以通過改變損失函數來模擬異方差任意不確定性。由於這種不確定性是輸入數據的函數,就可以學習從輸入到模型輸出的確定性映射來預測。對於迴歸任務,通常使用歐幾里德/ L2損失進行訓練:損失= || y-ŷ|| 2。要學習異方差不確定性模型,可以用以下方法代替損失函數:

Loss = 0.5||y−ŷ ||2/σ2 + 0.5logσ2

同方差不確定性的損失函數類似。

下面是一個標準分類交叉熵(cross entropy)損失函數和一個計算貝葉斯分類交叉熵損失的函數。



創建的損失函數基於本文中的損失函數。 在本文中,損失函數創建了一個均值爲零的正態分佈和預測的方差。從分佈中採樣來扭曲預測的logit數值,並使用扭曲的預測(distorted predictions)來計算softmax分類交叉熵。損失函數運行T個蒙特卡洛樣本,然後將T個樣本的平均值作爲損失。

注:logit定義如下

在下圖中,y軸是softmax分類交叉熵。 x軸是“right”logit值與“wrong”logit值之間的差異。

'right’表示此預測的正確類。 'wrong’表示此預測的錯誤類。用’logit差異’來表示圖9的x軸。當圖中的’logit差異’爲正時,softmax預測將是正確的。當’logit差異’爲負時,預測將是不正確的。

該圖有助於理解正態分佈扭曲(distortion)的結果。當使用正態分佈使logit值(在二元分類中)扭曲時,這個扭曲有效地創建原來預測的“logit差異”做分佈均值、預測方差做分佈方差的正態分佈。將softmax交叉熵應用於扭曲的logit值與沿着圖9中的線採樣“logit差異”值相同。

採用扭曲logit的分類交叉熵理想情況下應該會產生一些有趣的屬性。

  1. 當預測的logit值遠大於任何其他logit值(圖右邊)時,增加方差應該只會增加損失。這是正確的,因爲在圖右邊導數是負的。即增加“logit差異“,相比於同等的“logit差異”減少,只導致softmax分類交叉熵略微減小。在這種情況下,最小損失應接近0。

  2. 當’錯誤’logit遠大於’正確’logit(圖左邊)並且方差大約爲0時,丟失應該大約是wrong_logit-right_logit。你可以看到這是在圖的右邊。當‘logit差異’是-4時,softmax交叉熵是4。圖的這一部分的斜率大約是-1,應該真的’ logit差異’是在繼續下降。

  3. 爲了使模型能夠學習任意不確定性,當’錯誤’的logit值大於’正確’logit值(圖左半部分)時,最小化損失函數的應該是大於0的方差。具有較高任意不確定性(即模型難以對該圖像進行準確預測)的圖像,該特徵鼓勵模型在訓練期間通過增加預測方差來找到局部損失最小值。

通過增加方差,當“錯誤”logit值大於“正確”logit值時,可以用建議的損失函數來減少損失,但增加方差導致的損失減小非常小(<0.1)。在訓練期間,模型很難在這個輕微的局部最小值上找到,而模型中任意方差(aleatoric variance)的預測沒有意義。相信這是因爲圖的左半部分斜率是-1。沿着斜率爲-1的直線對正態分佈進行採樣將造成另一個正態分佈,並且平均值與之前大致相同,但我們想要的是,隨着方差增加T個樣本的平均減小。

爲了使模型更容易訓練,想要的是,隨着方差增加帶來更顯着的損失變化。上述損失函數用均值0和預測方差的正態分佈扭曲了T蒙特卡洛樣本的logit數值,然後計算了每個樣本的分類交叉熵。爲了在方差增加時獲得更顯著的損失變化,對損失減少的蒙特卡羅樣本,比起那些損失增加的樣本,損失函數加權更多。解決方案是使用ELU(exponential linear unit)激活函數,這是一個以0爲中心的非線性函數,如圖所示。

將ELU函數用於分類交叉熵的改變,即扭曲損失和原始未扭曲損失相比,undistorted_loss - distorted_loss。 對於圖的左半部分,ELU使正常分佈的平均值偏離零。對於接近0的非常小數,ELU也是線性的,因此圖的右半部分的平均值保持不變。

如下圖所示,right < wrong對應於圖9左半部分的一個點,wrong < right對應於圖右半部分的一個點。可以看到“錯誤”logit的結果分佈,看起來類似於正態分佈,“正確”logit大多是接近零的小值。對損失的變化應用-elu,right < wrong的均值變得更大。在此例子中,它從-0.16變成0.25。wrong < right的均值保持不變。下圖中底部的均值稱爲“損失的扭曲平均變化”。 在圖的右半部分,隨着方差增加,“損失的扭曲平均變化”應該保持在0附近,並且應該總是增加。

然後,通過原始未扭曲的分類交叉熵來縮放“損失的扭曲平均變化”。這樣做是因爲對於大於3的所有logit差異,錯誤logit情況下扭曲平均變化大致相同(因爲導數爲0)。爲了確保損失大於零,添加未扭曲的分類交叉熵。“損失的扭曲平均變化”總是隨着方差的增加而減小,但是對於小於無窮大的方差,損失函數應該最小化。爲了確保最小化損失的方差小於無窮大,添加了方差指數。如下圖所示,方差指數是方差大於2以後的主要特性。

這是計算二元分類例子損失函數的結果,其中“正確”logit值保持爲1.0,而 “錯誤”logit值每行發生變化。當’錯誤’logit小於1.0(因此小於’正確’logit值),最小方差爲0.0。 隨着錯誤“logit”值增加,最小化損失的方差也會增加。

注意:運行10,000次蒙特卡羅模擬才創建平滑線條。 在訓練模型時,只進行100次蒙特卡羅模擬,這足以得到合理的均值。

計算認知不確定性

對認知不確定性建模的一種方法是在測試時使用蒙特卡洛退出採樣(dropout sampling),一種變分推理。注:退出是一種避免在簡單網絡中過擬合的技術,即模型無法從其訓練數據到測試數據的泛化。在實踐中,蒙特卡洛退出採樣意味着模型包括退出並且模型測試時打開退出多次運行得到結果分佈。然後,可以計算預測熵(預測分佈的平均信息量)。

要了解使用輟學計算認知不確定性,請考慮將貓狗圖像垂直分成兩半,如圖所示。

如果看到左半邊,你會預測狗。 如果看到右半邊,你會預測貓。完美的50-50分裂。這個圖像具有很高的認知不確定性,因爲它具有與貓類、狗類相關聯的特徵。

以下是兩種計算認知不確定性的方法。完全相同的做法,但第一個更簡單,只使用numpy,第二個使用額外的Keras層(並獲得GPU加速)預測。




注意: 認知不確定性不用於訓練模型,它僅在評估實驗/現實世界例子的測試時(但在訓練階段)估計。 這與任意不確定性不同,後者預測爲訓練過程的一部分。 而且,根據經驗,認知不確定性比任意不確定性更容易產生合理的預測。

6. 訓練貝葉斯深度學習分類器

除了上面的代碼之外,訓練貝葉斯深度學習分類器來預測不確定性,不需要訓練一般分類器以外的額外代碼。

這個實驗用Resnet50的凍結卷積層和來自ImageNet的權重來編碼圖像。最初試圖在沒有凍結卷積層的情況下訓練模型,但發現模型很快過擬合。

模型的可訓練部分是ResNet50輸出層之上的兩組BN、Dropout、Dense和ReLU層。 用單獨的Dense層計算logits和方差。請注意,方差層(the variance layer)用softplus激活函數以確保模型始終預測大於零的方差值。然後,將logit和方差層重新組合用於任意損失(aleatoric loss)函數,並且僅使用logit層計算softmax。

使用兩個損失訓練模型,一個是任意不確定性損失函數,另一個是標準分類交叉熵函數。 允許創建logits的最後一個Dense層僅學習如何產生更好的logit值,而創建方差的Dense層僅學習預測方差。這兩個先前的Dense層將對這兩種損失進行訓練。任意不確定性損失函數的加權值小於分類交叉熵損失,因爲分類交叉熵損失是任意不確定性損失中的一項。

使用100蒙特卡羅模擬來計算貝葉斯損失函數。每個訓練時期(epoch)花了大約70秒。 發現當蒙特卡羅模擬量從100增加到1,000,每個訓練時期增加了大約4分鐘。

隨機取伽瑪值等於0.5或2.0來減少或增加每個圖像的亮度,這樣可添加增強數據(augmented data)到訓練集中,如圖所示。實踐中,發現cifar10數據集並沒有很多任意不確定性理論上很高的圖像。這可能是設計的。調整伽瑪值的圖像添加到訓練集,可以給模型提供更多高任意不確定性的圖像。

不幸的是,預測認知不確定性需要相當長的時間。對於全連接層,Mac CPU需要大約2-3秒來預測訓練集的所有50,000個類,但對於認知不確定性預測,這個過程超過五分鐘。這並不驚訝,因爲認知不確定性需要在每張圖像上運行蒙特卡羅模擬。運行100次蒙特卡羅模擬,可以合理地估計,預測過程花費大約100倍時間來預測認知不確定性而不是任意不確定性。

這個項目可輕鬆切換底層編碼器網絡(encoder network),併爲以後其他的數據集來訓練模型。

7. 實驗結果

在測試數據集上,模型分類準確率爲86.4%。實際上能夠產生高於93%的分數,但只能犧牲任意不確定性的準確性。可以使用一些不同的超參數來提高分數,但貝葉斯深度學習關心的是預測和不確定性估計,所以下面主要評估模型不確定性預測的有效性。

任意不確定性值往往比認知不確定性小得多,如表所示。這兩個值無法直接在同一圖像上進行比較。 然而,在同一數據集可以和模型爲其他圖像預測的不確定性值進行比較。

爲了進一步探索不確定性,根據‘正確’logit的相對值將測試數據分成三組。在下表中,'first’包括所有正確的預測(帶有’right’標籤的logit值是最大值)。 ‘second’,包括’right’標籤是第二大logit值的所有情況。 'rest’包括所有其他情況。86.4%的樣本屬於“第一”組,8.7%屬於“第二”組,4.9%屬於“休息”組。表3顯示了這三組測試集的任意和認知不確定性的均值和標準方差。正如所希望的那樣,認知和任意不確定性與“正確”logit的相對排序相關。這表明模型更可能確認不正確的標籤,因爲此時它不確定。此外,當模型的預測正確時,模型預測大於零不確定性(zero uncertainty)。期望這個模型能夠展現出這種特性,因爲即使模型預測正確,模型也不確定。

下面兩個圖分別是具有最高任意不確定性和認知不確定性的圖像。訓練圖像分類器產生不確定性的一個缺點是沒有直觀性,整個圖像的不確定性變成單個值。通常在圖像分割模型中不確定性理解要容易得多,因爲更容易比較圖像中每個像素的結果。


如果模型很好地理解任意不確定性,則它應該預測出那些較低對比度、高亮度/暗度或高遮擋的圖像有較大的任意不確定度值。爲此,將一系列伽瑪值應用於測試圖像以增加/減少像素強度,以及數據增強的預測結果,如圖所示。

在數據增強後的圖像,模型準確度爲5.5%。這意味着伽馬圖像完全欺騙了模型。該模型沒有經過訓練,無法在這些伽馬扭曲上得分。上圖顯示了左側八個數據增強的圖像以及預測不確定性和右側八個原始圖像和不確定性。前四幅圖像是數據增強中任意不確定性預測最高,後四幅圖像是數據增強中任意不確定性預測最低。

8. 下一步

這裏模型僅探討了貝葉斯深度學習冰山一角(the tip of the Bayesian deep learning iceberg),並且是可以通過幾種方式來改進模型的預測。例如,可以繼續使用損失權重並解凍Resnet50卷積層,看看是否可以在不丟失不確定性特徵情況下獲得更好的準確度分數。還可以嘗試在一個新數據集上訓練模型,它具有更多高度任意不確定性的圖像。一個候選是德國交通標誌識別基準數據集(German Traffic Sign Recognition Benchmark dataset)。該數據集專門用於“應對由於光照變化、部分遮擋、旋轉、天氣條件引起的視覺外觀的大變化” 的分類器。

除了改進模型,還可以進一步探索訓練的模型。一種方法是查看模型如何處理對抗性示例(adversarial examples)。爲此,可以使用像Ian Goodfellow創建的CleverHans庫。該庫使用對抗NN來幫助探索模型漏洞。

另一個可探索的庫是Edward,一個用於概率建模、推理和批評的Python庫。 Edward支持使用概率分佈創建網絡層,並可以輕鬆執行變分推理(variational inference)。

參考文獻

  1. 網頁:https://towardsdatascience.com/building-a-bayesian-deep-learning-classifier-ece1845bc09

  2. 網頁:https://alexgkendall.com/computer_vision/bayesian_deep_learning_for_safe_ai/

  3. 網頁:http://mlg.eng.cam.ac.uk/yarin/blog_3d801aa532c1ce.html

  4. 項目:https://github.com/kyle-dorman/bayesian-neural-network-blogpost

  5. 代碼:https://github.com/yaringal/DropoutUncertaintyCaffeModels

  6. A Kendall and Y Gal, “What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision? ”,2017.

  7. A Kendall, Y Gal,R Cipolla, “Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics”. 2017.

作者介紹

黃浴,奇點汽車美研中心總裁和自動駕駛首席科學家,上海大學兼職教授。曾在百度美研自動駕駛組、英特爾公司總部、三星美研數字媒體研究中心、華爲美研媒體網絡實驗室,和法國湯姆遜多媒體公司普林斯頓研究所等工作。發表國際期刊和會議論文30餘篇,申請30餘個專利,其中13個獲批准。

原文鏈接:本文源自黃浴的知乎:https://zhuanlan.zhihu.com/p/77140176

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章