隨著深度學習模型的普及,理解模型決策過程的需求日益增長。本文介紹的反事實解釋和對比性解釋方法,為模型的可解釋性提供了新的思路。這些方法並非僅僅關注模型的預測結果,更重要的是揭示模型做出決策的依據,例如哪些特徵促使模型將影像分類別為特定數字,或者哪些特徵的缺失會導致分類別結果的改變。這對於理解模型的行為、提高模型的透明度以及建立使用者對模型的信任至關重要。以 MNIST 手寫數字資料集為例,我們可以利用 CEM 方法分析 CNN 模型如何識別不同的數字,並透過調整輸入資料的特定特徵來驗證模型的行為。自動編碼器模型則可以輔助生成對比性解釋,進一步提高模型的可解釋性。
反事實解釋在XAI模型中的應用
反事實解釋是一種用於解釋機器學習模型預測結果的方法,尤其是在需要了解模型如何做出特定決策的情況下。本章節將探討反事實解釋在XAI(可解釋的人工智慧)模型中的應用,特別是在分類別和迴歸任務中的使用。
分類別任務中的反事實解釋
在分類別任務中,反事實解釋可以幫助我們瞭解模型如何對輸入資料進行分類別。以下是一個使用糖尿病資料集的例子:
explanation = cf.explain(X)
print(explanation)
print(f'原始預測: {explanation.orig_class}')
print('反事實預測: {}'.format(explanation.cf['class']))
內容解密:
explanation = cf.explain(X):使用CounterFactual方法對輸入資料X進行反事實解釋。print(explanation):輸出反事實解釋的結果。print(f'原始預測: {explanation.orig_class}'):輸出原始輸入資料的預測結果。print('反事實預測: {}'.format(explanation.cf['class'])):輸出反事實資料的預測結果。
在這個例子中,原始預測結果為0(無糖尿病),而反事實預測結果為1(有糖尿病)。這意味著,如果輸入資料的某些特徵被修改(即反事實資料),模型的預測結果將會改變。
反事實解釋的輸出結果解讀
反事實解釋的輸出結果包括多個部分,如下表所示:
| 輸出 | 解讀 |
|---|---|
Cf.X | 反事實例項 |
Cf.class | 反事實例項的預測類別 |
Cf.proba | 反事實例項的預測機率 |
Cf.grads_graph | 從TensorFlow圖計算出的梯度值 |
Cf.grads_num | 數值梯度值 |
orig_class | 原始例項的預測類別 |
orig_proba | 原始例項的預測機率 |
All | 一個字典,包含每次迭代中找到的反事實例項 |
迴歸任務中的反事實解釋
在迴歸任務中,反事實解釋可以用於瞭解模型如何預測連續值。以下是一個使用波士頓房價資料集的例子:
boston = load_boston()
data = boston.data
target = boston.target
feature_names = boston.feature_names
內容解密:
boston = load_boston():載入波士頓房價資料集。data = boston.data:取得資料集中的特徵資料。target = boston.target:取得資料集中的目標變數(房價)。feature_names = boston.feature_names:取得特徵名稱。
在這個例子中,反事實解釋可以用於瞭解哪些特徵對於房價的預測有最大的影響。例如,透過分析反事實資料,可以發現如果要提高房價,需要降低1940年以前建造的自住房比例和人口中的低社會地位比例。
explanation = cf.explain(X)
內容解密:
explanation = cf.explain(X):使用CounterFactualProto方法對輸入資料X進行反事實解釋。
根據反事實解釋的結果,可以得出結論:要提高房價,需要將1940年以前建造的自住房比例降低5.95%,並將人口中的低社會地位比例降低4.85%。
對比性解釋在機器學習中的應用
對比性學習是一種較新的方法,用於在機器學習流程中尋找相似和不相似的候選物件。對比性解釋的目標是找出兩個特徵之間的相似性,以幫助預測某個類別。典型的黑箱模型經過訓練後,對於不同的超引數和在各種迭代和學習率下最佳化的引數集,很難被解釋,甚至更難推理為什麼模型預測了A類別而不是B類別。為了產生更多的解釋,以便業務使用者能夠理解預測結果,許多開發者已經建立了能夠產生價值的創新框架。對比性解釋的重點是解釋為什麼模型預測了A類別而不是B類別。這個原因有助於業務使用者理解模型的行為。
對比性解釋(CE)是什麼?
為了理解機器學習中的對比性解釋(CE),讓我們考慮一個銀行貸款審批流程或信用風險評估流程的例子。沒有銀行會向風險客戶提供貸款。同樣,沒有銀行會拒絕向非風險客戶提供貸款。當貸款申請或信用申請被拒絕時,這不是銀行內某個人隨意做出的決定。相反,這是一個AI模型根據一個人的多個特徵(包括財務歷史和其他因素)做出的決定。被拒絕貸款的人可能會想知道是什麼因素決定了他們的貸款資格,他們與其他人在貸款資格方面有什麼不同,以及他們的個人資料中缺少什麼元素。同樣,在從多個其他可用影像中識別出感興趣的物件時,是什麼讓感興趣的物件與其他影像不同?
程式碼範例
import tensorflow as tf
tf.get_logger().setLevel(40) # 抑制棄用訊息
tf.compat.v1.disable_v2_behavior() # 停用TF2行為,因為Alibi程式碼仍然依賴於TF1結構
import tensorflow.keras as keras
from tensorflow.keras import backend as K
from tensorflow.keras.layers import Conv2D, Dense, Dropout, Flatten, MaxPooling2D, Input, UpSampling2D
內容解密:
- 這段程式碼首先匯入了必要的TensorFlow模組,並設定日誌級別以抑制棄用訊息。
tf.compat.v1.disable_v2_behavior()用於停用TensorFlow 2的行為,以保持與Alibi函式庫的相容性,因為Alibi仍然依賴於TensorFlow 1的結構。- 接著,從
tensorflow.keras匯入了多個層,包括卷積層、密集層、丟棄層、扁平層、最大池化層、輸入層和上取樣層,用於構建深度學習模型。
對比性解釋的核心概念
對比性解釋有兩個核心概念:
- 相關正面(Pertinent Positives, PP)
- 相關負面(Pertinent Negatives, PN)
相關正面(PP)
PP解釋找出機器學習模型識別相同類別所需的特徵。例如,一個人的收入和年齡決定了個人的淨資產。要讓ML模型根據高收入和高年齡組來識別高淨資產人群的類別。這與機器學習模型中的錨點解釋在某些方面是相似的。
相關負面(PN)
PN與PP相反,它解釋了在保持原始輸出類別的同時,記錄中應該缺失的特徵。這也被一些研究人員稱為反事實解釋。
使用Alibi進行對比性解釋
對模型的對比性解釋有助於向終端使用者澄清為什麼會發生某個事件或預測結果,而不是另一個事件或預測結果。為了透過Python函式庫實作對比性解釋,讓我們使用Alibi。首先,您將開發一個根據Keras的深度學習模型,以TensorFlow作為後端。
卷積神經網路模型訓練與對比解釋方法(CEM)應用於MNIST資料集
本章節主要介紹如何使用卷積神經網路(CNN)模型對MNIST手寫數字資料集進行分類別,並進一步探討對比解釋方法(CEM)在該模型上的應用。首先,我們將介紹資料預處理、模型建立與訓練的過程,接著說明如何評估模型的準確性,最後簡要介紹CEM的基本概念及其重要性。
資料預處理
在進行模型訓練之前,需要對資料進行適當的預處理。以下是具體步驟:
- 載入MNIST資料集,並將其分為訓練集和測試集。
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
- 對畫素值進行歸一化處理,以加快模型訓練的速度。
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
x_train = np.reshape(x_train, x_train.shape + (1,))
x_test = np.reshape(x_test, x_test.shape + (1,))
- 將標籤資料轉換為分類別格式。
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
- 對資料進行標準化處理,將畫素值對映到特定範圍內。
xmin, xmax = -.5, .5
x_train = ((x_train - x_train.min()) / (x_train.max() - x_train.min())) * (xmax - xmin) + xmin
x_test = ((x_test - x_test.min()) / (x_test.max() - x_test.min())) * (xmax - xmin) + xmin
內容解密:
- 載入MNIST資料集是為了利用其豐富的手寫數字資料,幫助訓練模型識別不同的數字。
- 歸一化處理是將畫素值縮放到0到1之間,這樣可以加快神經網路的訓練速度並提高模型的穩定性。
- 將資料reshape是為了符合卷積神經網路的輸入要求。
- 分類別格式轉換是為了使標籤能夠與模型的輸出層相匹配。
- 標準化處理則是為了將資料對映到一個特定的範圍,有助於模型的收斂。
建立與訓練卷積神經網路模型
接下來,我們將建立一個卷積神經網路模型,並對其進行訓練。以下是模型的架構:
def cnn_model():
x_in = Input(shape=(28, 28, 1))
x = Conv2D(filters=64, kernel_size=2, padding='same', activation='relu')(x_in)
x = MaxPooling2D(pool_size=2)(x)
x = Dropout(0.3)(x)
x = Conv2D(filters=32, kernel_size=2, padding='same', activation='relu')(x)
x = MaxPooling2D(pool_size=2)(x)
x = Dropout(0.3)(x)
x = Conv2D(filters=32, kernel_size=2, padding='same', activation='relu')(x)
x = MaxPooling2D(pool_size=2)(x)
x = Dropout(0.3)(x)
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
x_out = Dense(10, activation='softmax')(x)
cnn = Model(inputs=x_in, outputs=x_out)
cnn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return cnn
內容解密:
Conv2D層用於提取影像特徵,filters引數指定了過濾器的數量,kernel_size指定了過濾器的大小。MaxPooling2D層用於降低特徵圖的維度,減少引數數量並保留重要特徵。Dropout層用於隨機丟棄神經元,以防止過擬合。Flatten層用於將多維特徵圖展平為一維,以便輸入到全連線層。Dense層是全連線層,用於分類別。softmax啟用函式用於輸出層,以計算各類別的機率。
模型訓練與評估
cnn = cnn_model()
cnn.summary()
cnn.fit(x_train, y_train, batch_size=64, epochs=5, verbose=1)
cnn.save('mnist_cnn.h5', save_format='h5')
訓練完成後,我們載入儲存的模型並評估其在測試集上的準確性:
cnn = load_model('mnist_cnn.h5')
score = cnn.evaluate(x_test, y_test, verbose=0)
print('Test accuracy: ', score[1])
內容解密:
- 模型訓練過程中,我們使用了
adam最佳化器和categorical_crossentropy損失函式。 batch_size和epochs分別控制了每次訓練的樣本數量和訓練的輪數。- 模型評估結果顯示,該模型的測試準確性達到了98.73%,表明其具有良好的泛化能力。
對比性解釋在機器學習中的應用
在機器學習領域中,理解模型預測的結果至關重要。對比性解釋(Contrastive Explanations)是一種能夠幫助我們深入瞭解模型行為的方法。它透過找出輸入資料中對預測結果至關重要的部分來實作這一目標。
自動編碼器模型
要生成對比性解釋,首先需要一個能夠將輸入資料分類別到特定類別的模型。然後,透過對比性解釋方法(CEM)來找出兩種可能的解釋:
- 嘗試找出輸入資料中足以產生相同類別預測的最小資訊量,稱為 PP(Pertinent Positives)。
- 嘗試找出輸入資料中足以防止類別預測改變的最小缺失資訊量,稱為 PN(Pertinent Negatives)。
自動編碼器模型的定義與訓練
自動編碼器是一種神經網路模型,能夠學習將輸入資料壓縮到一個抽象層,然後再重構出原始輸入資料。對於影像分類別問題,可以使用卷積自動編碼器。以下是一個訓練自動編碼器模型的範例程式碼:
# 定義和訓練自動編碼器模型
def ae_model():
x_in = Input(shape=(28, 28, 1))
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x_in)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
encoded = Conv2D(1, (3, 3), activation=None, padding='same')(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
decoded = Conv2D(1, (3, 3), activation=None, padding='same')(x)
autoencoder = Model(x_in, decoded)
autoencoder.compile(optimizer='adam', loss='mse')
return autoencoder
ae = ae_model()
ae.summary()
ae.fit(x_train, x_train, batch_size=128, epochs=4, validation_data=(x_test, x_test), verbose=0)
ae.save('mnist_ae.h5', save_format='h5')
自動編碼器模型的評估
訓練完成後,可以透過比較原始影像和自動編碼器生成的影像來評估模型的效能。以下是一個範例程式碼,用於顯示原始影像和重構影像:
ae = load_model('mnist_ae.h5')
decoded_imgs = ae.predict(x_test)
n = 5
plt.figure(figsize=(20, 4))
for i in range(1, n+1):
# 顯示原始影像
ax = plt.subplot(2, n, i)
plt.imshow(x_test[i].reshape(28, 28))
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# 顯示重構影像
ax = plt.subplot(2, n, i + n)
plt.imshow(decoded_imgs[i].reshape(28, 28))
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
對比性解釋的應用
透過使用自動編碼器模型,可以生成對比性解釋,以幫助理解模型的預測結果。例如,可以使用 CEM 方法來找出輸入資料中對預測結果至關重要的部分。
idx = 15
X = x_test[idx].reshape((1,) + x_test[idx].shape)
plt.imshow(X.reshape(28, 28));
# 模型預測
cnn.predict(X).argmax(), cnn.predict(X).max()
結果分析
透過比較原始影像和自動編碼器生成的影像,可以看出自動編碼器模型能夠很好地重構出原始影像。同時,透過使用 CEM 方法,可以找出輸入資料中對預測結果至關重要的部分,從而更好地理解模型的行為。
內容解密:
此章節主要介紹瞭如何使用自動編碼器模型來生成對比性解釋。首先,定義了一個自動編碼器模型並進行了訓練。然後,透過比較原始影像和自動編碼器生成的影像來評估模型的效能。最後,使用 CEM 方法來找出輸入資料中對預測結果至關重要的部分,以幫助理解模型的行為。
在程式碼部分,首先定義了一個 ae_model 函式來建立自動編碼器模型。該模型使用了卷積神經網路(CNN)架構,並透過 adam 最佳化器和均方誤差(MSE)損失函式進行編譯。接著,使用 fit 方法對模型進行訓練,並將訓練好的模型儲存到檔案中。
在評估模型效能的部分,使用了 load_model 函式來載入訓練好的模型,並使用 predict 方法來生成重構影像。然後,透過比較原始影像和重構影像來評估模型的效能。
最後,使用 CEM 方法來找出輸入資料中對預測結果至關重要的部分。這部分程式碼展示瞭如何使用 CEM 方法來生成對比性解釋,以幫助理解模型的行為。
總的來說,這個範例程式碼展示瞭如何使用自動編碼器模型和 CEM 方法來生成對比性解釋,以提高模型的透明度和可解釋性。
圖表說明
此圖示顯示了原始影像和自動編碼器生成的影像之間的比較。可以看出,自動編碼器模型能夠很好地重構出原始影像。
自動編碼器的優勢
自動編碼器模型具有多個優勢,包括:
- 能夠學習將輸入資料壓縮到一個抽象層,從而減少資料的維度。
- 能夠重構出原始輸入資料,從而實作資料的壓縮和重構。
- 能夠用於生成對比性解釋,以幫助理解模型的行為。
未來,可以進一步研究如何使用自動編碼器模型和其他技術來提高模型的透明度和可解釋性。同時,也可以探索如何將對比性解釋應用於其他領域,例如自然語言處理和推薦系統等。