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

在 PyTorch 中实现可解释的神经网络模型

目的

深度学习体系缺少可解说性对建立人类信任构成了严重应战。这些模型的复杂性使人类简直不可能了解其决议计划背面的根本原因。

深度学习体系缺少可解说性阻碍了人类的信任。

为了处理这个问题,研究人员一直在积极研究新的处理方案,从而产生了严重立异,例如依据概念的模型。这些模型不仅提高了模型的透明度,并且经过在练习过程中结合高级人类可解说的概念(如“色彩”或“形状”),培养了对体系决议计划的新信任感。因此,这些模型能够依据学习到的概念为其猜测供给简略直观的解说,从而使人们能够查看其决议计划背面的原因。这还不是悉数!它们乃至答应人类与学习到的概念进行交互,让咱们能够操控终究的决议。

依据概念的模型答应人类查看深度学习猜测背面的推理,并让咱们重新操控终究决议计划。

在这篇博文中,咱们将深入研究这些技术,并为您供给运用简略的 PyTorch 接口完成最先进的依据概念的模型的工具。经过实践经验,您将学习怎么运用这些强大的模型来增强可解说性并终究校准人类对您的深度学习体系的信任。

概念瓶颈模型

在这个介绍中,咱们将深入探讨概念瓶颈模型。这模型在 2020 年世界机器学习会议上宣布的一篇论文中介绍,旨在首要学习和猜测一组概念,例如“色彩”或“形状”,然后运用这些概念来处理下流分类使命:

在 PyTorch 中实现可解释的神经网络模型

经过遵循这种办法,咱们能够将猜测追溯到供给解说的概念,例如“输入对象是一个{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。

概念瓶颈模型经过将猜测追溯到概念来供给直观的解说。

淹没在准确性与可解说性的权衡中

概念瓶颈模型的首要优势之一是它们能够经过揭示概念猜测形式来为猜测供给解说,从而使人们能够评价模型的推理是否契合他们的期望。

然而,标准概念瓶颈模型的首要问题是它们难以处理复杂问题!更一般地说,他们遇到了可解说人工智能中众所周知的一个众所周知的问题,称为准确性-可解说性权衡。实际上,咱们期望模型不仅能完成高使命性能,还能供给高质量的解说。不幸的是,在许多情况下,当咱们寻求更高的准确性时,模型供给的解说往往会在质量和忠实度上下降,反之亦然。

在视觉上,这种权衡能够表明如下:

在 PyTorch 中实现可解释的神经网络模型

可解说模型拿手供给高质量的解说,但难以处理具有应战性的使命,而黑盒模型以供给软弱和糟糕的解说为价值来完成高使命准确性。

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

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多平台发布