在前面的學習之中,我們已經學習了很多的模型,它能夠針對特定的任務,接受我們的輸入併產生目標的輸出。但我們並不滿足於此,我們甚至希望機器告訴我們,它是如何得到這個答案的,而這就是可解釋的機器學習。
Why we need Explainable ML
首先我們要明確,即使我們訓練出來的模型能夠得到一個正確的輸出,但是這並不代表它真正學習到了核心的規律所在,因此我們總是希望能夠知道為什麼機器給出這個答案,在一些特定的場景也是如此:
- 例如將機器學習用於醫療診斷,那我們希望機器做出來的決策是有根據的
- 將機器學習用於法律,那我們也希望看到機器學習做出判定背後的原因,是否存在歧視問題等
而且如果我們能夠擁有可解釋性的機器學習,那麼在模型的效果不好的時候,我們便能夠知道是哪部分出現了問題,可直接調整解決。
而對於可解釋性的機器學習,它的評價標準來說一直很難定奪,因為一個理由的可解釋是因人而異的。
可解釋性VSPowerful
對比一下線性模型、深度學習網路、決策樹這三個模型的特點:
- 線性模型的可解釋性比較強,我們能夠透過各個權重和偏置來簡單地理解線性模型之間各個變數的關係;但是線性模型其擬合未知函式的能力較弱
- 深度學習網路的能力很強大,能夠完成非常多複雜的任務,但是它的可解釋性比較差, 我們很難理解其內部的含義
- 單顆決策樹的可解釋性很強,並且決策森林的擬合能力也是很好的。但是如果決策森林中決策樹的數目很多的話,其可解釋性也一樣會變差
因此並沒有模型能夠簡單地完美解決擬合能力和可解釋性的問題
Explainable ML
假設模型是根據一張圖片做出其所屬的分類,那麼可解釋性的機器學習大致可以分為兩大類:
- Local Explanation:它要回答的問題是機器為什麼會覺得這張圖片是屬於這一類
- Global Explanation:它要回答的問題是你覺得這一類的圖片應該長什麼樣子,這個類別的模型比較特殊,沒有針對某張圖片而是針對整個類。
Local Explanation:Explain the Decision
這個類別的模型,我們可以把問題轉換成更具體一點:是輸入中的哪一個部分讓機器覺得它屬於這個類別呢?例如對於輸入x來說可以寫成多個組成部分\(\{x_1,...,x_n,...,x_N\}\),例如在圖片中每一個就代表一個畫素,在句子中每一個就代表一個詞彙等等。那麼如果我們希望找到哪個對結果影響最大的組成部分,可行的辦法是逐個改變或刪除組成部分,看看在改變哪一個的時候機器的輸出會發生變化,例如下圖的例子:
上面代表在每一張圖片中使用一個灰色方塊去不斷遮擋某一部分,當遮擋到藍色部分的時候就會發現機器無法做出正確預測。
那麼還有一個更進階的想法叫做Saliency Map,即將輸入表示成一個向量\(\{x_1,...,x_n,...,x_N\}\),那麼該輸入對應的輸出與真正的輸出之間就可以計算損失Loss。那麼具體的想法就是不斷嘗試改變每一個分量的值為\(x_n=x_n+\Delta x\),那麼相應的Loss也變化,因此我們可以從Loss變換的程度來看這個變數對於結果的影響性有多大,即:
相當於梯度的值越大,該值對於結果的影響力就越大,該變數就越重要,如下圖:
但這個方法也存在一定的侷限性, 或者說在某些場景中表現也不是很好,例如下圖的中間圖片,雖然它將羚羊的大致輪廓表達了出來,但是另外區域的雜訊還是特別的多;因此我們可以用SmoothGrad來嘗試解決,得到右邊的圖,可以看到效果更好:
那麼SmoothGrad的做法是為原始的圖片重複多次,每次加入隨機產生的雜訊來影響每一個畫素點,然後對於每一次得到的影像都畫Saliency Map,最後再將其平均起來即可。
而上述的透過梯度計算然後畫出對應Saliency Map的方法也存在一定的侷限性,就是在梯度上產生了問題,例如下面的例子為某種生物鼻子的長度的變化所引起該生物是否是大象的機率的變化:
可以看到在鼻子長度較大的點處,此處因為是大象的機率已經很高了,因此其梯度很小,那我們如果直接計算其梯度的話就會得到結果說鼻子的長度對是否是大象的機率沒有影響,這顯然是不符合邏輯的!
那麼還有另外一個能夠認識到模型各個模組相關功能的辦法,具體可以用一個語音辨認的例子來解釋:假設我們當前的語音辨識模型有很多層,那我們訓練一個模型將向量轉換為語音的輸出,那麼就可以對每一層輸出的Embedding都放入這個轉換為語音的模型中得到輸出,我們再聽每一層對應的語音輸出,就可以明確每一層對聲音的處理起到了什麼作用。
Global Explaination:Explain the Whole Model
對於這個類別的可解釋性模型來說,它並不是告訴我們一個特定的樣本長什麼樣子、屬於什麼分類,而是根據模型內的引數來理解說為什麼某一個類的樣本會長這個樣子,可以簡單理解為我們要機器告訴我們它心理想象的貓長什麼樣子。
下面透過一個影像檢測的例子來說明我們對於這種問題的解決思路。
對於圖中的每一個filter,可以看成它是對上一層所輸出的影像的某一塊區域的監測,如果監測到它希望得到的資訊,那麼它的值就會比較大。但是現在Global Explaination的任務不是針對特定樣本而言,也就是說我們沒有樣本來生成各層的影像。而為了知道每一層的每一個filter它想要監測什麼內容,我們可以來創造影像,即如上圖所示,我們創造一個圖片對應的向量,使得它輸出進入能夠使得我們當前觀察的這個filter最大,即
那麼我們再來觀測\(X^*\)對應的影像,我們就可以知道這個filter它想檢測什麼樣的型別了,如下圖:
例如上圖就有的filter檢測橫條紋、豎條紋等等等等。
那麼上述的思路,我們能否將其直接用於輸出層呢?例如我們直接讓:
也就是說我們找一張圖片,讓這個圖片透過機器後輸出某一個類別的機率最大,那麼有可能實現嗎?實際上效果很差!例如在手寫數字的識別例子中:
為什麼會這樣呢?這其中的解釋大概可以說成:因為機器它不一定是看到某個數字的樣子才會輸出對應的類別,它可能真的沒有學習到這個規律,只是學習到從一堆雜訊中尋找到它認為是某個類別的資訊。那麼如果真的要用這個方法,需要根據我們對於影像的深層次理解加上一大堆的假設,並且好好調整引數才可能得到,如下圖:
那麼為了避開上述這麼多的約束呢,我們還有一個辦法就是引入生成器來幫助。即我們假設已經透過很多的圖片訓練完成了一個生成器(用GAN、VAE等),然後我們將生成器接到原分類模型之前,即:
那現在我們的目標就轉換成:
即找到一個z的向量,生成圖片之後能夠使得y對該圖片的分類的信心分數最大。那麼我們要得到可解釋性的東西,就再將向量\(z^*\)轉換成圖片即可,即:
這樣得到的效果可能是很好的。