隨著深度學習模型在電腦視覺領域的廣泛應用,理解模型決策過程的需求日益增長。本篇探討多種影像模型可解釋性技術,包含 LIME、KernelSHAP、Integrated Gradients 以及 xRAI,並分析其優缺點及適用場景。這些技術有助於開發者理解模型預測背後的邏輯,進而提升模型的可靠性和透明度。文中將提供 Integrated Gradients 的 TensorFlow 程式碼實作,並說明如何在 Google Cloud Vertex AI 平台上佈署模型並整合 XAI 技術,包含定義模型簽名、建立解釋後設資料、佈署模型及傳送解釋請求等步驟。此外,本文也將介紹 AutoML 等無程式碼電腦視覺工具的應用優勢,例如快速驗證專案可行性、評估資料品質及建立基準測試模型等,為電腦視覺專案提供更便捷的開發流程。
影像模型的可解釋性方法
在機器學習領域,尤其是在電腦視覺任務中,瞭解模型如何做出預測至關重要。本章節將探討四種常見的影像模型解釋方法:LIME、KernelSHAP、Integrated Gradients(IG)和xRAI。
LIME(區域性可解釋模型無關解釋)
LIME 透過擾動輸入影像來工作,首先識別出由連續相似畫素組成的影像區塊(見圖 10-5),然後用統一的值替換某些區塊,從而有效地移除它們。接著,LIME 要求模型對擾動後的影像進行預測。對於每個擾動後的影像,會獲得一個分類別機率。這些機率根據擾動影像與原始影像的相似程度進行空間加權。最後,LIME 將具有最高正權重的區塊作為解釋呈現給使用者。
KernelSHAP
KernelSHAP 與 LIME 相似,但它對擾動例項的加權方式不同。LIME 對與原始影像相似的例項賦予非常低的權重,理論上認為它們包含很少的額外資訊。另一方面,KernelSHAP 根據根據博弈論的分佈對例項進行加權。包含的區塊越多,例項獲得的權重越少,因為理論上任何這些區塊都可能是重要的。在實踐中,KernelSHAP 的計算成本通常比 LIME 高得多,但提供了更好的結果。
Integrated Gradients(IG)
IG 使用模型的梯度來識別哪些畫素是重要的。深度學習的一個特性是訓練最初關注最重要的畫素,因為使用它們的資訊可以最大程度地降低錯誤率。因此,高梯度與訓練開始時的重要畫素相關聯。然而,神經網路在訓練過程中收斂,在收斂過程中,網路保持與重要畫素對應的權重不變,並關注較罕見的情況。這意味著在訓練結束時,與最重要畫素對應的梯度實際上接近零!因此,IG 需要在整個訓練過程中使用梯度,而不僅僅是在訓練結束時。
IG 根據這樣的直覺:如果提供一個由全 0、全 1 或範圍 [0, 1] 內的隨機值組成的基線影像,模型將輸出先驗類別機率。透過將每個畫素的值從基線值更改為實際輸入,分多個步驟計算梯度變化,並計算每次更改的梯度。然後,具有最高梯度的畫素被疊加在原始影像上(見圖 10-6)。
程式碼範例:使用 TensorFlow 實作 IG
import tensorflow as tf
# 假設 model 是您的 TensorFlow 模型
@tf.function
def integrated_gradients(model, input_image, baseline_image, steps=50):
# 定義插值函式
def interpolate_images(baseline, image, alphas):
alphas_x = alphas[:, tf.newaxis, tf.newaxis, tf.newaxis]
baseline_x = tf.expand_dims(baseline, axis=0)
input_x = tf.expand_dims(image, axis=0)
delta = input_x - baseline_x
images = baseline_x + alphas_x * delta
return images
# 生成插值 alpha 值
alphas = tf.linspace(start=0.0, stop=1.0, num=steps+1)
# 計算插值影像
interpolated_images = interpolate_images(baseline_image, input_image, alphas)
# 使用 GradientTape 計算梯度
with tf.GradientTape() as tape:
tape.watch(interpolated_images)
predictions = model(interpolated_images)
# 取得預測類別的 logits
target_class_logit = predictions[:, target_class]
# 計算梯度
gradients = tape.gradient(target_class_logit, interpolated_images)
# 對梯度進行積分
integrated_gradients = (gradients[:-1] + gradients[1:]) / 2.0
integrated_gradients = tf.reduce_mean(integrated_gradients, axis=0)
return integrated_gradients
#### 內容解密:
1. **`integrated_gradients` 函式**:此函式計算輸入影像相對於基線影像的整合梯度,用於衡量每個畫素的重要性。
2. **`interpolate_images` 函式**:生成基線影像和輸入影像之間的插值影像,用於計算梯度變化。
3. **`GradientTape`**:TensorFlow 的自動微分工具,用於記錄操作並計算梯度。
4. **`integrated_gradients` 計算**:透過對插值影像的梯度進行平均來近似積分,得到最終的整合梯度值。
### xRAI
xRAI 方法結合了 LIME 和 KernelSHAP 的預處理方法,以及 IG 的畫素級歸因優勢。首先,使用 IG 取得畫素級歸因,然後將這些歸因整合到影像區塊中。接著,根據區塊的重要程度對其進行排序,從而得到最終的解釋結果。
## 影像可解釋性技術在生產環境中的應用
在生產環境中佈署機器學習模型時,瞭解模型的預測結果至關重要。影像可解釋性技術能夠幫助我們理解模型是如何做出預測的。本章節將介紹幾種常見的影像可解釋性技術,包括 Integrated Gradients(IG)和 xRAI,並探討如何在 Google Cloud 的 Vertex AI 平台上佈署模型並取得預測結果的解釋。
### Integrated Gradients 和 xRAI 的比較
IG 提供畫素級別的歸因,能夠精確地指出哪些畫素對模型的預測結果貢獻最大。xRAI 則提供根據區域的歸因,將影像劃分為不同的區域,並評估每個區域對預測結果的影響。
#### IG 的適用場景
IG 傾向於在低對比度的影像中表現良好,例如 X 光片或實驗室拍攝的科學影像。在識別眼部疾病(如糖尿病視網膜病變)的模型中,瞭解導致診斷結果的具體畫素非常有用,因此 IG 是較好的選擇。
#### xRAI 的適用場景
xRAI 則更適合於自然影像,例如識別影像中動物的型別。在這種情況下,根據區域的歸因更為合適,因此 xRAI 是較好的選擇。
### Tracin:追蹤訓練過程中的支援和反對樣本
Tracin 是一種新興的方法,用於解釋模型在訓練過程中的行為。它透過追蹤單個訓練樣本在訓練過程中的損失變化,找出對該樣本預測結果有重大影響的其他訓練樣本。這些樣本被稱為支援樣本(proponents)和反對樣本(opponents)。支援樣本是指那些能夠降低損失、改善預測結果的樣本,而反對樣本則是指那些會增加損失、惡化預測結果的樣本。
### 在 Vertex AI 上佈署模型並取得預測結果的解釋
要在 Vertex AI 上佈署模型並取得預測結果的解釋,需要新增兩個額外的簽名:預處理簽名和模型簽名。預處理簽名用於將輸入影像轉換為模型所需的格式,而模型簽名則用於接收處理後的影像並傳回預測結果。
```python
@tf.function(input_signature=[tf.TensorSpec([None,], dtype=tf.string)])
def xai_preprocess(filenames):
input_images = tf.map_fn(
preprocess, # preprocessing function from Ch 6
filenames,
fn_output_signature=tf.float32
)
return {
'input_images': input_images
}
@tf.function(input_signature=[tf.TensorSpec([None, IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS], dtype=tf.float32)])
def xai_model(input_images):
batch_pred = model(input_images) # same as model.predict()
top_prob = tf.math.reduce_max(batch_pred, axis=[1])
pred_label_index = tf.math.argmax(batch_pred, axis=1)
pred_label = tf.gather(tf.convert_to_tensor(CLASS_NAMES), pred_label_index)
return {
'probability': top_prob,
'flower_type_int': pred_label_index,
'flower_type_str': pred_label
}
內容解密:
xai_preprocess函式:此函式負責將輸入的檔名列表轉換為模型所需的輸入格式。它使用tf.map_fn對每個檔名應用preprocess函式,得到處理後的影像資料,並將結果儲存在input_images中。最終傳回一個字典,其中包含處理後的影像資料。xai_model函式:此函式接收處理後的影像資料,並使用模型進行預測。它呼叫模型的predict方法,得到預測結果,然後計算出最高機率、預測標籤的索引以及對應的字串標籤。最終傳回一個包含這些資訊的字典。
透過新增這兩個簽名,可以在 Vertex AI 上佈署模型並取得預測結果的解釋,從而更好地理解模型的行為和決策過程。
模型可解釋性與XAI技術實務應用
在機器學習模型的生產環境中,模型的可解釋性(Explainability)成為一項日益重要的議題。Google Cloud的Explainable AI(XAI)提供了一套完整的解決方案,幫助開發者理解模型預測結果背後的驅動因素。本文將探討如何利用XAI技術對影像分類別模型進行解釋,並佈署於Vertex AI平台。
模型簽名與XAI整合
要實作XAI,首先需要在模型儲存時定義多個簽名(signatures),以滿足不同使用情境的需求。以下程式碼展示瞭如何重構原始簽名並儲存模型:
@tf.function(input_signature=[tf.TensorSpec([None,], dtype=tf.string)])
def predict_filename(filenames):
preproc_output = xai_preprocess(filenames)
return xai_model(preproc_output['input_images'])
model.save(MODEL_LOCATION,
signatures={
'serving_default': predict_filename,
'xai_preprocess': xai_preprocess,
'xai_model': xai_model
})
內容解密:
@tf.function裝飾器:將Python函式編譯為TensorFlow圖函式,提升執行效率。input_signature引數:定義函式輸入的資料型別和形狀,確保輸入的一致性。xai_preprocess與xai_model:分別負責影像預處理和模型預測,將複雜流程模組化。signatures引數:在儲存模型時定義多個簽名,方便不同場景下的呼叫。
解釋後設資料的建立
除了模型本身,XAI還需要額外的後設資料來計算解釋結果。這些後設資料透過Explainability SDK建立並儲存為JSON檔案:
from explainable_ai_sdk.metadata.tf.v2 import SavedModelMetadataBuilder
builder = SavedModelMetadataBuilder(
MODEL_LOCATION,
signature_name='xai_model',
outputs_to_explain=['probability'])
random_baseline = np.random.rand(IMG_HEIGHT, IMG_WIDTH, 3)
builder.set_image_metadata(
'input_images',
input_baselines=[random_baseline.tolist()])
builder.save_metadata(MODEL_LOCATION)
內容解密:
SavedModelMetadataBuilder:用於建立模型後設資料的工具,指定需要解釋的輸出欄位。signature_name='xai_model':指明用於解釋的模型簽名。outputs_to_explain=['probability']:指定需要解釋的輸出變數,此處為預測機率。random_baseline:生成隨機基準影像,用於梯度計算的起始點。set_image_metadata:設定輸入影像的中繼資料,包括基準影像列表。
模型佈署與解釋請求
將儲存的模型和後設資料佈署到Vertex AI,並透過gcloud命令取得解釋結果:
gcloud beta ai-platform versions create \
--origin=$MODEL_LOCATION --model=flowers ig \
--explanation-method integrated-gradients --num-integral-steps 25
內容解密:
--explanation-method:指定解釋方法,此處使用Integrated Gradients(IG)。--num-integral-steps 25:設定數值積分的步數,影響梯度計算的精確度和計算量。gcloud beta ai-platform explain:傳送解釋請求並取得結果。
解釋結果分析
透過XAI獲得的解釋結果可以幫助理解模型的決策過程。例如,使用IG和xRAI方法對花卉影像進行解釋,結果顯示xRAI提供了更精確的歸因分析。
圖表說明
此圖示展示了IG和xRAI對花卉影像的解釋結果對比:
- 第一行顯示原始輸入影像。
- 第二行顯示IG方法的歸因結果。
- 第三行顯示xRAI方法的歸因結果,並進行了色彩調整以便視覺化。
詳細解說:
- IG方法:透過積分梯度計算輸入特徵的重要性,但可能受到背景噪聲的影響。
- xRAI方法:在IG基礎上進一步細分重要區域,並評估其重要性,提供更精確的解釋。
- 結果對比:xRAI能夠更準確地聚焦於影像中的關鍵特徵,如花朵的主體部分,而非背景。
無程式碼電腦視覺技術的應用與優勢
在前面的章節中,我們已經探討瞭如何使用程式碼實作機器學習模型。然而,在實際的電腦視覺專案中,採用無程式碼工具可以帶來許多好處。無程式碼工具不僅能夠快速驗證專案的可行性,還能夠提供基準測試結果,以協助我們收集更高品質的資料。
為什麼使用無程式碼工具?
在電腦視覺專案中,無程式碼工具具有多項優勢,包括:
- 問題可行性評估:無程式碼工具如 AutoML 可以作為健全性檢查,幫助我們瞭解預期達到的準確度。如果達到的準確度遠低於預期,我們可以避免浪費時間在無效的機器學習專案上。
- 資料品質和數量檢查:無程式碼工具可以檢查資料集的品質。透過工具產生的混淆矩陣,我們可以判斷是否需要收集更多或更好的資料。
- 基準測試:從無程式碼工具開始,可以提供一個基準,讓我們能夠比較自行建立的模型。
許多機器學習組織為領域專家提供無程式碼工具,使他們能夠在將問題交給資料科學團隊之前,檢查問題的可行性並協助收集高品質的資料。
使用 AutoML 進行無程式碼電腦視覺
以下將介紹如何使用 Google Cloud AutoML Vision 進行無程式碼電腦視覺專案。
載入資料
首先,我們需要將資料載入 AutoML 系統。我們可以將 all_data.csv 檔案從 Cloud Storage 儲存桶中匯入(參見圖 10-12)。載入資料後,我們可以看到資料集中有 3,667 張圖片,包括 633 張雛菊、898 張蒲公英等(參見圖 10-13)。我們可以驗證所有圖片是否都有標籤,並在必要時修正標籤。
訓練模型
一旦我們對標籤感到滿意,就可以點選「訓練新模型」按鈕來訓練新的模型。這將引導我們完成一系列畫面(參見圖 10-14),在這些畫面中,我們可以選擇模型型別、資料集分割方式和訓練預算。在撰寫本文時,我們指定的 8 小時訓練預算大約需要 25 美元。
### 訓練模型流程圖
此圖示顯示了使用 AutoML 訓練模型的流程:
#### 模型評估與佈署
訓練完成後,我們可以評估模型的效能。評估結果表明,大部分誤分類別的情況是玫瑰被錯誤地識別為鬱金香(參見圖 10-16)。如果我們要繼續進行實驗,可以檢查一些錯誤案例,並嘗試收集更多圖片以減少假陽性和假陰性。
一旦我們對模型的效能感到滿意,就可以將其佈署到端點,從而建立一個 Web 服務,使用者可以透過該服務請求模型進行預測。
### 無程式碼電腦視覺的優勢
對於基本的電腦視覺問題,無程式碼系統具有易用性、低成本和高準確度的優勢。我們建議在電腦視覺專案中,將無程式碼工具作為第一步。
#### 使用無程式碼工具的好處
此圖示總結了使用無程式碼工具的好處:
```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 影像模型可解釋性技術XAI實務應用
package "XAI 可解釋性方法" {
package "擾動方法" {
component [LIME] as lime
component [KernelSHAP] as shap
component [區塊遮罩] as mask
}
package "梯度方法" {
component [Integrated Gradients] as ig
component [xRAI] as xrai
component [梯度計算] as grad
}
}
package "Vertex AI 部署" {
component [模型簽名] as signature
component [解釋後設資料] as metadata
component [解釋請求] as request
}
package "應用場景" {
component [AutoML 視覺] as automl
component [品質評估] as quality
component [基準測試] as benchmark
}
lime --> mask : 區塊擾動
shap --> mask : 博弈論加權
ig --> grad : 插值積分
xrai --> ig : 區域聚合
signature --> metadata : XAI 配置
metadata --> request : API 呼叫
automl --> quality : 快速驗證
note right of ig
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml