LIME - Local Interpretable Model-Agnostic Explanation 技術介紹

Kaishen Tseng
18 min readDec 27, 2017

--

Murmur

之前就有聽過 LIME 這套工具 (或說是分析流程),對於任意模型,都能對單一樣本去解釋模型為何做出如此判斷。在覺得神奇之餘,一直沒去試著瞭解其中的概念。

直到最近看到 NIPS 2017 針對“機器學習可解釋性”的辯論會相關文章,以及之前在 R user group 的一場 Meetup ,才讓我真正去點開這篇 paper。

這篇是在 KDD 2016 發表的 paper -“Why Should I Trust You?”: Explaining the Predictions of Any Classifier,以下就我的理解,簡單分享這篇 paper 的一些內容,以及該篇所提出的分析框架 LIME ( Local Interpretable Model-Agnostic Explanation)。

附註:此篇大部分的圖片,都是截自論文以及網路的教學文。

0. Outline

篇幅有些長,把大標跟摘要整理於此,希望能減少各位迷失的可能性。

  1. Some Examples Before We Start:介紹通篇會用到的範例。
  2. Overall And By-Instance Feature Importance:特徵重要性介紹。
  3. Why We Need Explanation? 從幾個觀點看模型解釋性的重要。
  4. Desired characteristics from Explainers:一個解釋器該具備的特徵。
  5. LIME :包含 LIME 的目標、背後直覺以及分析步驟。
  6. Example — Image Classification:以影像辨識範例帶過 LIME 的步驟。
  7. Conclusion簡單結論。
  8. Reference:所用到的參照。

1. Some Examples Before We Start

整篇會圍繞兩個案例,所以在最前面先簡單敘述情境。先假設我們已經有足夠的 training data,以及一個效果不錯的模型。

1 - Image Recognition:

  • 訓練過程:輸入照片,模型回傳這張照片有什麼物件。
  • 可能實作:輸入照片在 RGB channel 上的 pixel 數值,利用 CNN 訓練。

2 - Article Classification:

  • 訓練過程:給一篇文章 (電影評論),模型判斷這篇文章是帶有正面還是負面情緒 (喜歡或是不喜歡這部電影)。
  • 可能實作:利用 word embedding,把文章的所有字,利用 embedding vector 表示,並加總作為這篇文章地表示式,然後利用分類模型訓練。

2. Overall And By-Instance Feature Importance

先比較 Overall 和 By Instance 在意義上的差異。

Overall Feature Importance所代表的是哪一些自變項 (Independent Variable, Feature, X) 對依變項 (Dependent Variable, Y) 的影響程度最高,舉 tree-based 模型為例,從某變數為起點,一刀切下去,可以讓樣本分得最開,那這個變數就是整體重要性最高的特徵。

By-Instance Feature Importance 所代表的是針對某個想分析的樣本 (假設是分類問題),那他會被分成某一類,是因為哪個變數造成的影響最大。

舉個範例,現在要透過量測病患的某些身理指標數字,來判斷該用戶是否會感冒。以 Overall Feature Importance 而言,可能「發高燒」會是最重要的特徵 (代表透過「發高燒」這個特徵可以把整體病患分得最開);但對於某個病患 (小明),他並沒有發燒,但他有流鼻水,所以也被預測為感冒,那對於小明這個樣本而言,將他預測為感冒的原因,就不是發高燒,而是流鼻水了。

而這篇論文想探討是後者,也就是 By-Instance Feature Importance。意即針對一個樣本,怎麼得到該樣本如何被模型判斷的依據。

3. Why We Need Explanation?

「機器模型的可解釋性」在 NIPS 上的辯論,可以看出這個議題的重要性。為什麼需要機器學習的可解釋性,該篇論文提供兩個方向,我覺得非常清楚的闡述為何需要解釋性 (不是所有狀況都一定需要)。

  1. 說服別人:在導入機器學習方法來幫助專業人士判斷時,像是醫療或是法律等領域,十分重視理由。你總不會希望當醫生告訴你有病時,醫生說:「哦這是模型說的」。
  2. 說服自己:在建立模型後,透過樣本的可解釋性,可以幫助人類判斷,模型是否真的學到如人類所預期的事情。以下舉文中特別設計的案例為例。

我的目標,是想要建立一個模型,可以準確的分辨哈士奇和狼。假使我真的做到了,而且這個分類模型在驗證的過程中,也同樣表現得非常好。

Wolf & Huskies

接著測試資料進來,那我就拿這個很準確的模型來測測看吧!結果一測發現,把一隻哈士奇,預測成狼了。就第一直覺而言,會認為模型本來就不可能百分之百正確,這應該只是誤判吧。

Classify a husky as a wolf.

若這時存在一個角色,暫且稱他為「解釋器 (Explainer)」,它的用處在於,可以告訴我們,為什麼這個樣本 (哈士奇) 被分成這類 (狼)。

Explainer

解釋器:「因為這張圖除了本體以外的部分是白色的,所以模型把這張照片分類為狼」。

我:…

what…

從上述例子可以發現,在樣本刻意的選取下,模型學到了只要背景是白色的 (雪地),就很有可能這張照片是狼,反之,只要背景不是白色的,那就很可能是哈士奇。而這樣的結果肯定不是我們想要模型學習的內容。

上述的例子可能很極端,但其實他比想像中要容易發生。而透過這個解釋器,上述的慘劇,就有可能在模型真正使用前發現。

4. Desired characteristics from Explainers

身為一個解釋器,至少有要以下特徵:

  1. Interpretable (可解釋):包含兩個部分,分別是模型特徵。舉模型為例,像是決策樹或是線性回歸,都是很適合拿來解釋的模型,但前提是特徵也是要容易解釋才行。所以利用可解釋的模型,去配適可解釋的特徵,才是真正的可解釋性。否則像是用詞嵌入 (word embedding) 的方式,即使是簡單線性回歸,也無法達成可解釋性。
  2. Local Fidelity (局部忠實):既然都已經用了可解釋的特徵跟模型,不可能期望這樣的建立方式下,效果會等同一個複雜特徵搭配複雜模型。所以這邊不要求在全局要和複雜模型的效果一致,但至少在局部上效果要很接近,而此處的局部,也代表的是我們想觀察的那個樣本的周圍。後面會有圖例會更清楚。
  3. Model-Agnostic (與模型無關):此處的和模型無關,是指和複雜模型無關。換言之,無論多複雜的模型,像是 SVM 或是 neural network,都必須要可以利用這個解釋器。
  4. Global Perspective (全局觀點):從哈士奇跟狼的例子可以知道,「準確度」不一定是一個好的指標,所以我們才需要去「解釋」模型。那解釋器所能做的,就是提供一個觀點 (對樣本提供解釋),來幫助人類對模型產生信任。

5. LIME - LOCAL INTERPRETABLE MODEL-AGNOSTIC EXPLANATIONS

「局部」、「可理解」、「與模型無關」的「解釋」。

Goal

「對於一個分類器 (複雜模型),想要用一個可解釋模型 (簡單模型),搭配可解釋的特徵 (Feature) 來配適,並且這個可解釋模型在局部的表現上,很接近複雜模型的效果。」

對於上述這段話,可能會覺得似懂非懂。像是「可解釋的特徵」以及「局部」,這些部分會在接下來的部分依序釐清。

Intuition

從「解釋器的必要特徵」有提到,這個解釋器要和模型無關,因此 LIME 所提出的方式,就是透過擾動輸入樣本 (perturb the input),來判斷哪些特徵的存在與否,對於影響輸出有最大的影響。而擾動的精髓在於,這些擾動是要人類可以理解的。像是一張照片中,部分影像區塊刻意的遮蓋,對於辨識的效果影響;或是對於一篇文章,移除某些字對預測的影響。

在敘述完直覺後,接著用一張圖片來闡述。

以下圖為例,這是一個複雜分類器的結果,這個分類器的邊界,用紅色和藍色表示,可以想像成這個分類器會把落在紅色區域的點分類為 Negative (+),落在藍色的分類為 Positive (O)。

而現在想對「粗 + 號」的這個樣本來解釋,為何他會被分成 Negative (紅)。解釋的方式,就是藉由擾動這個樣本 (粗 + 號),而得到該圖的其他點,而這些點在原始模型中,可以得到預測值 (被標記成 + 或是 O)。接著再對這些樣本,配適一個簡單的模型 (簡單線性回歸),也就是圖中的灰色虛線,再利用這個簡單模型,來對「粗 + 號」這個樣本,解釋哪些特徵影響輸出結果。

從全局來看,這個線性模型的呈現,比複雜模型差得多 (簡單線性模型只會把左半邊分類為 Negative,右半邊分類為 Positive),但在「粗 + 號」的附近而言,這個簡單模型的表現其實不差,套用這篇論文的說法,以局部來看,這個簡單模型確實很好的切割了附近的樣本。

所以前面提到的「局部」,就是在欲觀察的樣本 (粗 + 號) 附近,簡單模型 (灰虛線) 的表現,和複雜模型 (紅藍邊界) 會很接近。

local-fidelity

Step

接著介紹 LIME 的步驟,就會提到「可解釋的特徵」是怎麼一回事了。

1. Feature and Interpretable Data Representation

  • Feature:訓練複雜模型的特徵。例如 image recognition 中各 channel 的 pixel 數值;或是文章分類的 word embedding。
  • Interpretable Data Representation:簡單模型的特徵,主要用於解釋使用。例如 image classification 中,可以用 super pixel 的方式,先做 image separation,然後用 binary vector,來表示某個 super pixel 是否有存在;若是舉文章資料為例,也是利用 binary vector 來表示某個字是否出現在這篇文章 (bag-of-words)。所以這個 binary vector,無論在影像辨識或文章分類,都代表某個元素 (人類可理解) 存在與否 (presence/absence)。

實際用 Image Recognition 來解說上面的差異。

左邊是原始的影像,右邊則是利用 image separation 的方式取得 super pixel,由於我對 super pixel 的知識不夠充足,我是把他想像成一種分群方式,把相似組成的圖片變成一群。所以可以得到右邊切割後的結果。

Transforming an image into interpretable components. Sources: Marco Tulio Riberio, Pixabay

針對這兩個部分(Original Image & Interpretable Components),設計成 Feature 也會是不同的表現方式。原始圖片進行辨識時,套入 CNN 模型的話,就會是一個三維的向量 (RGB),然後每個維度,就代表所對應 pixel 在該 channel 的數值;若是 super pixel,則是利用一個 binary vector 來表示,而每一個元素,代表第 i 個 super pixel,是否有存在於這張圖片之中。

feature & interpretable data representation

2. Fidelity-Interpretability Trade-off

想要解釋模型,但又希望模型成效不能太差,所以在忠實呈現跟可解釋性上要做個取捨。作者定義了一個目標函數,其中便包含這兩個部分,一起進行最佳化。在講解之前,先定義會用到的符號。除了論文原先的註釋外,加上一些中文解釋。

(Notation)
(符號 (加上一些中文解釋))

在此篇論文,先將簡單模型鎖定為使用「簡單線性回歸」以方便解釋。

3. Sample for Local Exploration

選定一個想解釋的樣本,接下來就是要對這個樣本進行「可解釋的擾動」。並且在擾動完後,要還原到原始特徵的維度。

聽起來有點抽象跟詭異,以下將利用一個例子來試著解釋。

最左邊是原始的影像,由於「擾動樣本」是需要可以被解釋的,因此是基於可解釋性的特徵上來進行。而影像的 Interpretable Data Representation 如前面所述是透過 super pixel 來完成。因此本來的影像就被切割成 𝑑' 個區塊。

為了要進行擾動,把這張影像以一個 𝑑' 維的向量表示,並且向量裡的值只會是 0 或 1,而這個向量的第 i 個位置的數值,就代表第 i 個 super pixel 存在與否。若此向量的第 i 個數值為 0,代表將第 i 個 super pixel 蓋住,以下圖表示就是用灰色覆蓋;反之,若第 i 個數值為 1,則是保留該 super pixel。有了這樣的關係,就可以隨機抽取任 n 個 super pixel,選擇是否要覆蓋或是保留,這樣的做法,就是在進行「可被解釋的擾動」。至於擾動的程度大小或是數目是使用者可以設定。

Fig: perturb

因此透過「可被解釋的擾動」,就可以得到如上圖最右排的 n 個樣本。也就是如下圖的那些 + 和 O。

4. Sparse Linear Explanations

在配適簡單線性回歸前,我們需要得到這些擾動後樣本的預測值,如目標函數所述,我們使要取得這些擾動後樣本在特徵維度 (維度為 d) 上的數值。舉上述的例子,就是拿 Fig: permuted 中最右排的那些影像,取出各個 pixel 在 RGB 三個 channel 上的數值,輸入 CNN 模型來預測,作為這些擾動後樣本的答案。

回到目標函數,擾動前與擾動後樣本相似度 (\pi_x(z)) 中的距離定義,取決於資料的型態 (cosine similarity for text, L2 distance for images),有了相似度的定義,便可以將原先的目標函數改寫為如下所示。

f(z) 就是擾動後樣本,在 d 維空間 (原始特徵) 上的預測值,並把該預測值作為答案 (y),g(z') 則是在 d' 維空間 (可解釋特徵) 上的預測值 (y hat),然後以相似度(\pi_x(z)) 做為權重,因此上述的目標函數,就可以透過線性回歸的方式來最佳化。

因為原先的目標函數還有一個 Ω(𝑔),放在目標函數的目的,就是希望模型越簡單越好,此處模型是以線性回歸而言,就是希望非零係數越少越好。便可透過 LASSO Regression 來達成這個目的。原因在於 LASSO Regression 中對於線性回歸的係數加上 L1 限制式,相比 Ridge Regression 中的 L2 限制式,前者的設定更容易讓很小的係數成為零。

difference between lasso & ridge regression (Pic From Google)

因此就可以就建立出一個簡單線性回歸,並且在特徵上也很容易理解。只要觀察對應的係數,找出係數值最大的 n 個,在取得對應的意義,便可以得到該樣本被模型判斷的依據。以影像的例子而言,找出 n 個最大的係數,並得到是哪些 super pixel,就可以知道模型是因為哪些分割影像來決定輸出。

Pseudo Code with simple explanation

6. Example - Image Classification

以下舉個例子,整個走過一次 LIME 的流程。範例跟圖片取自Introduction to Local Interpretable Model-Agnostic Explanations (LIME)

假設現在已經有了一個 CNN 模型,可以預測一張照片裡面,可能有哪些物件。那我現在輸入下面這張青蛙的照片,然後模型回傳有 54% 的機率他是一隻樹蛙,但也有 7% 的機率是撞球以及 5% 的機率是熱氣球。現在想透過 LIME 來試圖理解模型為什麼會做出這樣的判斷。

Why model make these prediction?

如前面所述,先把原始的照片,轉成可解釋的資料表示 (Feature to Interpretable Data Representation)。左半邊就是原始照片,透過 RGB 三個 channel,將各 pixel 的數值,餵入CNN 模型,所以是一個三維的向量。接著再透過 super pixel 的方式,去取得這張照片的可解釋資料表示式。

feature & interpretable data representation

在透過可解釋的資料表示式,去對樣本進行擾動,得到 N 個擾動後的樣本。

perturbed data in interpretable data representation

然後再將這 N 個樣本,先還原到原始特徵空間,得到預測值做為真實值,並利用可解釋特徵的資料表示,建立簡單線性回歸,然後觀察哪些 super pixel 的係數很大。

fit lasso regression and get coefficients

在得到這些較大的係數後,再把相對應的 super pixel 視覺化,就能理解模型為什麼會做出這些判斷。

explanation

Recap

在這段的最開頭,有寫到「局部」、「可理解」、「與模型無關」的「解釋」。再回頭看,應該就會大略明白各自的原因。

  • 局部:要求簡單模型在欲解釋樣本的附近 (局部) 和全局模型接近。
  • 可理解:可理解的特徵與模型。
  • 與模型無關:透過擾動樣本的方式來解釋複雜模型。
  • 解釋:簡單模型的係數解釋。

Some Notes

  1. 複雜模型效果要好,才有意義。因為會利用複雜模型的預測值,當作真實值,對可解釋特徵維度的樣本建立回歸模型。若預測值很不準,那接下來做的事情都沒有意義了。
  2. 原始特徵和可解釋特徵之間的轉換。如該論文中所提的兩個案例,影像辨識和文章分類,都是屬於可以透過巧妙的設計 (presence/absence of word or image),讓原始特徵和可解釋特徵之間,可以彼此轉換。那有人可能會有疑問,若原本的資料,每個欄位已經是有意義的呢?在這篇 Understanding lime 的第二大段:How to permute an observation 有提供一些說明,簡單來說,是根據每個欄位資料的分佈,進行擾動。以下是我的猜測,實際擾動的方式,可能是根據每個欄位數值的分佈,進行 k 個標準差內的擾動。

Still Have Something…

其實在論文中還有一大段落的敘述,但此處尚未提及。是關於這樣的設定跟解釋成果,是否能真的幫助人類判斷。作者有簡單拋出幾個問題,我在以下簡單列出,若大家可以有興趣可以再去詳讀。

  1. Are explanations (simple model) faithful to the model?
  2. Can the explanations aid users in ascertaining trust in predictions?
  3. Are the explanations useful for evaluating the model as a whole?

作者驗證的方式,是針對這部份,分別設定並進行一些實驗來回應上面的一些猜測 (在第五大段)。因為我尚未完整讀完,就不介紹了。

7. Conclusion

當初讀完,就覺得這樣的想法很有趣,也很容易理解。不過可想而知,要對每個樣本都做這樣的解釋,應該會需要頗多計算資源。所以此篇論文的作者,有提到很多 future work 尚待進行中,像是增加計算效率,或是簡單模型相比於複雜模型的評價等等。

另外值得一提的是,在 Python 跟 R 都有相對應的套件來處理,其中不乏許多參數需要調整,大多就是在擾動樣本那部分。套件的操作方式我還沒有實作,或許在跑完範例後,可以在對此篇進行補充。

--

--