关于深度学习:在-PyTorch-中实现可解释的神经网络模型

40次阅读

共计 3199 个字符,预计需要花费 8 分钟才能阅读完成。

动动发财的小手,点个赞吧!

目标

深度学习零碎不足可解释性对建设人类信赖形成了重大挑战。这些模型的复杂性使人类简直不可能了解其决策背地的根本原因。

深度学习零碎不足可解释性妨碍了人类的信赖。

为了解决这个问题,钻研人员始终在踊跃钻研新的解决方案,从而产生了重大翻新,例如基于概念的模型。这些模型不仅进步了模型的透明度,而且通过在训练过程中联合高级人类可解释的概念(如“色彩”或“形态”),造就了对系统决策的新信任感。因而,这些模型能够依据学习到的概念为其预测提供简略直观的解释,从而使人们可能查看其决策背地的起因。这还不是全副!它们甚至容许人类与学习到的概念进行交互,让咱们可能管制最终的决定。

基于概念的模型容许人类查看深度学习预测背地的推理,并让咱们从新管制最终决策。

在这篇博文中,咱们将深入研究这些技术,并为您提供应用简略的 PyTorch 接口实现最先进的基于概念的模型的工具。通过实践经验,您将学习如何利用这些弱小的模型来加强可解释性并最终校准人类对您的深度学习零碎的信赖。

概念瓶颈模型

在这个介绍中,咱们将深入探讨概念瓶颈模型。这模型在 2020 年国内机器学习会议上发表的一篇论文中介绍,旨在首先学习和预测一组概念,例如“色彩”或“形态”,而后利用这些概念来解决上游分类工作:

通过遵循这种办法,咱们能够将预测追溯到提供解释的概念,例如“输出对象是一个 {apple},因为它是{spherical} 和{red}。”

概念瓶颈模型首先学习一组概念,例如“色彩”或“形态”,而后利用这些概念来解决上游分类工作。

实现

为了阐明概念瓶颈模型,咱们将从新扫视驰名的 XOR 问题,但有所不同。咱们的输出将蕴含两个间断的特色。为了捕获这些特色的实质,咱们将应用概念编码器将它们映射为两个有意义的概念,示意为“A”和“B”。咱们工作的指标是预测“A”和“B”的异或 (XOR)。通过这个例子,您将更好地了解概念瓶颈如何在实践中利用,并见证它们在解决具体问题方面的有效性。

咱们能够从导入必要的库并加载这个简略的数据集开始:

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)

接下来,咱们实例化一个概念编码器以将输出特色映射到概念空间,并实例化一个工作预测器以将概念映射到工作预测:

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)

而后咱们通过优化概念和工作的穿插熵损失来训练网络:

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()

训练模型后,咱们评估其在测试集上的性能:

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)

当初,在几个 epoch 之后,咱们能够察看到概念和工作在测试集上的准确性都十分好(~98% 的准确性)!

因为这种架构,咱们能够通过依据输出概念查看工作预测器的响应来为模型预测提供解释,如下所示:

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)}")

这会产生例如 f([0,1])=1 和 f([1,1])=0,如预期的那样。这使咱们可能更多地理解模型的行为,并查看它对于任何相干概念集的行为是否合乎预期,例如,对于互斥的输出概念 [0,1] 或 [1,0],它返回的预测 y =1。

概念瓶颈模型通过将预测追溯到概念来提供直观的解释。

吞没在准确性与可解释性的衡量中

概念瓶颈模型的次要劣势之一是它们可能通过揭示概念预测模式来为预测提供解释,从而使人们可能评估模型的推理是否合乎他们的冀望。

然而,规范概念瓶颈模型的次要问题是它们难以解决简单问题!更一般地说,他们遇到了可解释人工智能中家喻户晓的一个家喻户晓的问题,称为准确性 - 可解释性衡量。实际上,咱们心愿模型不仅能实现高工作性能,还能提供高质量的解释。可怜的是,在许多状况下,当咱们谋求更高的准确性时,模型提供的解释往往会在品质和忠实度上降落,反之亦然。

在视觉上,这种衡量能够示意如下:

可解释模型善于提供高质量的解释,但难以解决具备挑战性的工作,而黑盒模型以提供软弱和蹩脚的解释为代价来实现高工作准确性。

为了在具体设置中阐明这种衡量,让咱们思考一个概念瓶颈模型,该模型利用于要求稍高的基准,即“三角学”数据集:

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)

在该数据集上训练雷同的网络架构后,咱们察看到工作准确性显着升高,仅达到 80% 左右。

概念瓶颈模型未能在工作准确性和解释品质之间获得均衡。

这就引出了一个问题:咱们是永远被迫在准确性和解释品质之间做出抉择,还是有方法获得更好的均衡?

本文由 mdnice 多平台公布

正文完
 0