在PyTorch中實(shí)現(xiàn)可解釋的神經(jīng)網(wǎng)絡(luò)模型的方法詳解
目的
深度學(xué)習(xí)系統(tǒng)缺乏可解釋性對(duì)建立人類信任構(gòu)成了重大挑戰(zhàn)。這些模型的復(fù)雜性使人類幾乎不可能理解其決策背后的根本原因。
深度學(xué)習(xí)系統(tǒng)缺乏可解釋性阻礙了人類的信任。
為了解決這個(gè)問題,研究人員一直在積極研究新的解決方案,從而產(chǎn)生了重大創(chuàng)新,例如基于概念的模型。這些模型不僅提高了模型的透明度,而且通過在訓(xùn)練過程中結(jié)合高級(jí)人類可解釋的概念(如“顏色”或“形狀”),培養(yǎng)了對(duì)系統(tǒng)決策的新信任感。因此,這些模型可以根據(jù)學(xué)習(xí)到的概念為其預(yù)測(cè)提供簡(jiǎn)單直觀的解釋,從而使人們能夠檢查其決策背后的原因。這還不是全部!它們甚至允許人類與學(xué)習(xí)到的概念進(jìn)行交互,讓我們能夠控制最終的決定。
基于概念的模型允許人類檢查深度學(xué)習(xí)預(yù)測(cè)背后的推理,并讓我們重新控制最終決策。
在本文中,我們將深入研究這些技術(shù),并為您提供使用簡(jiǎn)單的 PyTorch 接口實(shí)現(xiàn)最先進(jìn)的基于概念的模型的工具。通過實(shí)踐經(jīng)驗(yàn),您將學(xué)習(xí)如何利用這些強(qiáng)大的模型來(lái)增強(qiáng)可解釋性并最終校準(zhǔn)人類對(duì)您的深度學(xué)習(xí)系統(tǒng)的信任。
概念瓶頸模型
在這個(gè)介紹中,我們將深入探討概念瓶頸模型。這模型在 2020 年國(guó)際機(jī)器學(xué)習(xí)會(huì)議上發(fā)表的一篇論文中介紹,旨在首先學(xué)習(xí)和預(yù)測(cè)一組概念,例如“顏色”或“形狀”,然后利用這些概念來(lái)解決下游分類任務(wù):

通過遵循這種方法,我們可以將預(yù)測(cè)追溯到提供解釋的概念,例如“輸入對(duì)象是一個(gè){apple},因?yàn)樗莧spherical}和{red}。”
概念瓶頸模型首先學(xué)習(xí)一組概念,例如“顏色”或“形狀”,然后利用這些概念來(lái)解決下游分類任務(wù)。
實(shí)現(xiàn)
為了說明概念瓶頸模型,我們將重新審視著名的 XOR 問題,但有所不同。我們的輸入將包含兩個(gè)連續(xù)的特征。為了捕捉這些特征的本質(zhì),我們將使用概念編碼器將它們映射為兩個(gè)有意義的概念,表示為“A”和“B”。我們?nèi)蝿?wù)的目標(biāo)是預(yù)測(cè)“A”和“B”的異或 (XOR)。通過這個(gè)例子,您將更好地理解概念瓶頸如何在實(shí)踐中應(yīng)用,并見證它們?cè)诮鉀Q具體問題方面的有效性。
我們可以從導(dǎo)入必要的庫(kù)并加載這個(gè)簡(jiǎn)單的數(shù)據(jù)集開始:
import torch import torch_explain as te from torch_explain import datasets from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split x, c, y = datasets.xor(500) x_train, x_test, c_train, c_test, y_train, y_test = train_test_split(x, c, y, test_size=0.33, random_state=42)
接下來(lái),我們實(shí)例化一個(gè)概念編碼器以將輸入特征映射到概念空間,并實(shí)例化一個(gè)任務(wù)預(yù)測(cè)器以將概念映射到任務(wù)預(yù)測(cè):
concept_encoder = torch.nn.Sequential(
torch.nn.Linear(x.shape[1], 10),
torch.nn.LeakyReLU(),
torch.nn.Linear(10, 8),
torch.nn.LeakyReLU(),
torch.nn.Linear(8, c.shape[1]),
torch.nn.Sigmoid(),
)
task_predictor = torch.nn.Sequential(
torch.nn.Linear(c.shape[1], 8),
torch.nn.LeakyReLU(),
torch.nn.Linear(8, 1),
)
model = torch.nn.Sequential(concept_encoder, task_predictor)然后我們通過優(yōu)化概念和任務(wù)的交叉熵?fù)p失來(lái)訓(xùn)練網(wǎng)絡(luò):
optimizer = torch.optim.AdamW(model.parameters(), lr=0.01)
loss_form_c = torch.nn.BCELoss()
loss_form_y = torch.nn.BCEWithLogitsLoss()
model.train()
for epoch in range(2001):
optimizer.zero_grad()
# generate concept and task predictions
c_pred = concept_encoder(x_train)
y_pred = task_predictor(c_pred)
# update loss
concept_loss = loss_form_c(c_pred, c_train)
task_loss = loss_form_y(y_pred, y_train)
loss = concept_loss + 0.2*task_loss
loss.backward()
optimizer.step()訓(xùn)練模型后,我們?cè)u(píng)估其在測(cè)試集上的性能:
c_pred = concept_encoder(x_test) y_pred = task_predictor(c_pred) concept_accuracy = accuracy_score(c_test, c_pred > 0.5) task_accuracy = accuracy_score(y_test, y_pred > 0)
現(xiàn)在,在幾個(gè) epoch 之后,我們可以觀察到概念和任務(wù)在測(cè)試集上的準(zhǔn)確性都非常好(~98% 的準(zhǔn)確性)!
由于這種架構(gòu),我們可以通過根據(jù)輸入概念查看任務(wù)預(yù)測(cè)器的響應(yīng)來(lái)為模型預(yù)測(cè)提供解釋,如下所示:
c_different = torch.FloatTensor([0, 1])
print(f"f({c_different}) = {int(task_predictor(c_different).item() > 0)}")
c_equal = torch.FloatTensor([1, 1])
print(f"f({c_different}) = {int(task_predictor(c_different).item() > 0)}")這會(huì)產(chǎn)生例如 f([0,1])=1 和 f([1,1])=0 ,如預(yù)期的那樣。這使我們能夠更多地了解模型的行為,并檢查它對(duì)于任何相關(guān)概念集的行為是否符合預(yù)期,例如,對(duì)于互斥的輸入概念 [0,1] 或 [1,0],它返回的預(yù)測(cè)y=1。
概念瓶頸模型通過將預(yù)測(cè)追溯到概念來(lái)提供直觀的解釋。
淹沒在準(zhǔn)確性與可解釋性的權(quán)衡中
概念瓶頸模型的主要優(yōu)勢(shì)之一是它們能夠通過揭示概念預(yù)測(cè)模式來(lái)為預(yù)測(cè)提供解釋,從而使人們能夠評(píng)估模型的推理是否符合他們的期望。
然而,標(biāo)準(zhǔn)概念瓶頸模型的主要問題是它們難以解決復(fù)雜問題!更一般地說,他們遇到了可解釋人工智能中眾所周知的一個(gè)眾所周知的問題,稱為準(zhǔn)確性-可解釋性權(quán)衡。實(shí)際上,我們希望模型不僅能實(shí)現(xiàn)高任務(wù)性能,還能提供高質(zhì)量的解釋。不幸的是,在許多情況下,當(dāng)我們追求更高的準(zhǔn)確性時(shí),模型提供的解釋往往會(huì)在質(zhì)量和忠實(shí)度上下降,反之亦然。
在視覺上,這種權(quán)衡可以表示如下:

可解釋模型擅長(zhǎng)提供高質(zhì)量的解釋,但難以解決具有挑戰(zhàn)性的任務(wù),而黑盒模型以提供脆弱和糟糕的解釋為代價(jià)來(lái)實(shí)現(xiàn)高任務(wù)準(zhǔn)確性。
為了在具體設(shè)置中說明這種權(quán)衡,讓我們考慮一個(gè)概念瓶頸模型,該模型應(yīng)用于要求稍高的基準(zhǔn),即“三角學(xué)”數(shù)據(jù)集:
x, c, y = datasets.trigonometry(500) x_train, x_test, c_train, c_test, y_train, y_test = train_test_split(x, c, y, test_size=0.33, random_state=42)
在該數(shù)據(jù)集上訓(xùn)練相同的網(wǎng)絡(luò)架構(gòu)后,我們觀察到任務(wù)準(zhǔn)確性顯著降低,僅達(dá)到 80% 左右。
概念瓶頸模型未能在任務(wù)準(zhǔn)確性和解釋質(zhì)量之間取得平衡。
這就引出了一個(gè)問題:我們是永遠(yuǎn)被迫在準(zhǔn)確性和解釋質(zhì)量之間做出選擇,還是有辦法取得更好的平衡?
以上就是在PyTorch中實(shí)現(xiàn)可解釋的神經(jīng)網(wǎng)絡(luò)模型的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于PyTorch 神經(jīng)網(wǎng)絡(luò)模型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Pytorch神經(jīng)網(wǎng)絡(luò)參數(shù)管理方法詳細(xì)講解
- Pytorch之8層神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)Cifar-10圖像分類驗(yàn)證集準(zhǔn)確率94.71%
- GCN?圖神經(jīng)網(wǎng)絡(luò)使用詳解?可視化?Pytorch
- pytorch簡(jiǎn)單實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)功能
- Pytorch卷積神經(jīng)網(wǎng)絡(luò)遷移學(xué)習(xí)的目標(biāo)及好處
- Pytorch深度學(xué)習(xí)經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)resnet模塊訓(xùn)練
- Pytorch卷積神經(jīng)網(wǎng)絡(luò)resent網(wǎng)絡(luò)實(shí)踐
相關(guān)文章
Keras中 ImageDataGenerator函數(shù)的參數(shù)用法
這篇文章主要介紹了Keras中 ImageDataGenerator函數(shù)的參數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-07-07
Python?Fire實(shí)現(xiàn)自動(dòng)生成命令行接口
命令行程序是平時(shí)寫一些小工具時(shí)最常用的方式,隨著命令行程序功能的豐富,也就是參數(shù)多了以后,解析和管理參數(shù)之間的關(guān)系會(huì)變得越來(lái)越繁重,而本次介紹的?Fire?庫(kù)正好可以解決這個(gè)問題,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧2023-09-09
Python利用for循環(huán)修改列表的常見錯(cuò)誤解析
在Python編程中,for循環(huán)是最常用的控制結(jié)構(gòu)之一,而列表(list)是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)之一,但在使用for循環(huán)遍歷列表并對(duì)列表進(jìn)行增刪改操作時(shí),往往會(huì)遇到意想不到的錯(cuò)誤,下面我們就來(lái)深入研究一下吧2025-06-06
Python 實(shí)現(xiàn)判斷圖片格式并轉(zhuǎn)換,將轉(zhuǎn)換的圖像存到生成的文件夾中
今天小編就為大家分享一篇Python判斷圖片格式并轉(zhuǎn)換,將轉(zhuǎn)換的圖像存到生成的文件夾中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-01-01
Django框架使用內(nèi)置方法實(shí)現(xiàn)登錄功能詳解
這篇文章主要介紹了Django框架使用內(nèi)置方法實(shí)現(xiàn)登錄功能,結(jié)合實(shí)例形式詳細(xì)分析了Django框架內(nèi)置方法實(shí)現(xiàn)登錄功能的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-06-06
Python程序打包成EXE的四種方法詳解與實(shí)戰(zhàn)
將Python代碼打包成可執(zhí)行文件是一種使你的應(yīng)用程序更易于分享和分發(fā)的方法,本文一步一步地教你如何用 Pyinstaller 模塊將Python程序打包成exe文件,這篇教程絕對(duì)是全網(wǎng)最全面、最詳細(xì)的教程,包含四種打包的方法,需要的朋友可以參考下2025-07-07
Python運(yùn)算符的使用保姆級(jí)教學(xué)
這篇文章主要給大家介紹了關(guān)于Python運(yùn)算符使用的相關(guān)資料,文中總結(jié)了Python中的算術(shù)運(yùn)算符、賦值運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符和成員運(yùn)算符的用法和特性,需要的朋友可以參考下2024-11-11
pytorch masked_fill報(bào)錯(cuò)的解決
今天小編就為大家分享一篇pytorch masked_fill報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-02-02

