最简单的网络解释,逻辑解释网络
最简单的网络解释,逻辑解释网络你——那又怎样?深度神经网络就像“黑洞”:你看不到里面的东西!好吧,你会不会……你——为什么?我——因为深度神经网络是“黑匣子”:它们的设计目的不是解释它们是如何得出预测的!
• 问题——神经网络无法解释它们是如何得出预测的,因此不鼓励将它们部署在安全关键应用程序中。
• 解决方案——逻辑解释网络是新颖的“可解释设计”深度学习模型,为其预测提供逻辑解释。
• 试试吧! ——“PyTorch,解释一下!”是一个 python 包,提供简单的 API 来实现逻辑解释网络。
为什么你可能感兴趣?我——你是研究人员还是创业者?你想要部署一个超酷的深度学习系统来拯救世界?
好吧,你会不会……
你——为什么?
我——因为深度神经网络是“黑匣子”:它们的设计目的不是解释它们是如何得出预测的!
深度神经网络就像“黑洞”:你看不到里面的东西!
你——那又怎样?
我——嗯,现在美国和欧洲的许多安全关键应用程序都禁止使用“黑匣子”。
你——那么,我能做什么?
我— 阅读这篇文章,了解如何安全合法地部署最先进的深度学习系统!
可解释人工智能 (XAI) 的知识差距为什么我们不能使用(标准)深度学习来解决现实世界的问题?
深度学习 (DL) 在安全关键领域的应用受到立法者的强烈限制,因为 DL 模型通常被认为是黑匣子,其决策过程不透明且过于复杂,外行人(甚至 DL 专家!) .
出于这个原因,可解释的人工智能 (XAI) 研究要么专注于解释黑盒决策,要么专注于开发“可通过设计解释”的机器学习模型(如决策树)。然而,虽然可解释模型产生对其预测的信任(这就是我们喜欢它们的原因......),但黑盒模型,如神经网络,通常可以提供最先进的任务性能(这是为什么我们喜欢它们!)。
XAI 研究中的知识差距
大多数解释黑匣子的技术都侧重于寻找或排序黑匣子用来进行预测的最相关的特征。这种“特征评分”方法非常有效且应用广泛,但它们无法解释神经网络如何组合这些特征来进行预测 。此外,大多数解释方法的一个关键问题是,解释是根据输入特征(例如像素强度)给出的,这些特征与人类可以轻松理解的高级类别不对应。
为了克服这个问题,基于概念的方法变得越来越流行,因为它们根据人类可理解的类别(即“概念”)而不是原始特征提供解释 。简单来说,基于概念的模型是将分类输入 C(即“概念”)映射到分类输出 Y(即目标类别)的函数 f:
f: C ↦ Y
如果您的输入特征不是分类特征(例如图像的像素强度),您可以首先使用函数 g 将您的输入 X 映射到分类“概念空间”C:
g:X↦C
看看这个基于 CUB 数据集的例子(一个来自图像的鸟类分类数据集):
• 首先,分类器g 学习如何将像素强度(图像的输入特征)映射到分类概念空间C,其中每个类别对应一个鸟类特征;
• 其次,分类器 f 学习如何将根据概念 C 描述的输入样本映射到对应于鸟类名称(目标类别)的分类输出。
一个黑盒概念瓶颈模型。
然而,尽管有用,但这些基于概念的方法中的大多数都侧重于识别最相关的概念,但它们无法解释分类器 f 如何利用这些概念,更不能提供可评估其有效性的简明解释数量上。
很少有方法能够解释神经网络如何组合特征/概念以进行预测。
那你需要什么?
总之,您需要的是一种新的深度学习范式,允许您部署以下模型:
1. 达到接近由等效“标准”黑匣子达到的最新技术水平的分类精度。
2. 解释输入特征是如何组成以进行预测的。
3. 提供清晰的解释,其质量可以定量评估。
您是否仍想安全合法地部署最先进的深度学习驱动系统?
逻辑解释网络 (LEN)逻辑解释网络(或 LEN)是一个特殊的基于概念的神经网络系列,为其决策提供一阶逻辑 (FOL) 解释。
看一下 CUB 数据集上的相同示例:
• T分类器 g 执行相同的操作(即从图像中预测概念);
• 然而,分类器 f 现在是一个逻辑解释网络,提供目标类别的预测 解释网络 f 如何利用输入概念做出决定的逻辑公式!
为什么要逻辑解释?
与其他 XAI 技术相比,一阶逻辑解释提供了许多关键优势:
1. 清晰——FOL 中报告的解释是严格且明确的声明。这种形式上的明确性可以用于认知行为目的,例如产生信任、帮助识别偏见或采取行动/决定。例如,为了简单起见去掉量词和变量,公式“雪 ∧ 树 ↔ 狼”可以很容易地概述训练数据集合中存在的偏差。
2. 模块化——可以组合不同的基于逻辑的解释来描述观察组或全局现象。例如,对于仅显示人脸的图像,解释可以是“鼻子∧嘴唇→人”,而对于从后面显示人的另一个图像,有效解释可以是“脚∧头发∧耳朵→人”。两种局部解释可以组合为“(鼻子∧嘴唇)∨(脚∧头发∧耳朵)→人”。
3. 可测量性——可以定量测量基于逻辑的解释的质量,以检查其有效性和完整性。例如,一旦为“人类”类提取了解释“(鼻子∧嘴唇)∨(脚∧头发∧耳朵)'',就可以将该逻辑公式应用于测试集,以检查其在量化指标方面的普遍性比如准确性、保真度和一致性。
4. 简化性——FOL 解释可以用等价的形式重写,例如析取范式 (DNF) 和连接范式 (CNF)。此外,Quine-McCluskey 算法等技术可用于简化逻辑解释。例如,公式“(人∧鼻子)∨(¬人∧鼻子)”可以很容易地简化为“鼻子”。
逻辑解释网络是一种特殊的基于概念的神经网络,为其决策提供一阶逻辑解释。
LEN 范式:设计的可解释性
LENs 系列是一类可通过设计解释的神经模型。
“可以通过设计解释的模型是什么意思?”,您可能会问。嗯,事后方法和 LEN 范式之间有明显的区别,这可以通过设计来解释。事后方法通常不会对分类器施加约束:模型本身不受与解释方法相关的任何约束。这就是为什么这类方法被称为 post hoc:在完成通常的训练后,XAI 方法开始发挥作用。 LENs 范式可以通过设计来解释,因为它在架构和损失函数中嵌入了额外的约束,使得网络自我解释。这就是为什么我们说 LEN 可以通过设计来解释:分类器本身被限制以一种使解释自动出现的方式学习。
LENs 范式可以通过设计来解释,因为它在架构和损失函数中嵌入了额外的约束,使解释自动出现。
理论细节
逻辑解释网络的设计需要三个方面的规范:架构、损失函数和简约标准。这三个元素的混合允许逻辑解释网络的唯一标识。虽然架构和损失函数是任何神经网络的标准要求,但简约标准对 LEN 起着特殊的作用,因为它们允许分类器模仿人类学习和提供解释的方式。事实上,当人类比较一组概述相同结果的假设时,他们往往对最简单的假设有隐含的偏见。亚里士多德在他的“后分析”中观察到了这种现象,后来的哲学家(如奥卡姆)重新发现了这一现象,并且最近在认知心理学、行为经济学和决策制定方面进行了研究(一些最著名的作品来自乔治·米勒 ] 和诺贝尔奖和图灵奖获得者赫伯特·西蒙 )。这种认知偏差是 XAI 研究迫切需要简单解释的主要原因。简约标准是在端到端可微模型(例如逻辑解释网络)中编码这种归纳偏差的一种方法!
当人类比较一组概述相同结果的假设时,他们往往对最简单的假设有隐含的偏见——简约标准在端到端可微模型中编码了这种归纳偏差。
如果您有兴趣了解有关 LEN 及其简约标准的更多信息,可以在我们最近的论文中找到更多详细信息。但是,如果您只是想玩转 LEN,那么下一部分就是为您准备的!
PyTorch Explain!阅读要求:Python、pip、PyTorch基础知识。
什么是“PyTorch Explain!”?
“PyTorch Explain!”是 PyTorch 开发逻辑解释网络的扩展库!
您可以从 PyPI 安装 torch_explain 及其所有依赖项:
pip install -r requirements.txt torch-explain
代码可在 github 上免费获得。
示例 #1
对于这个简单的例子,让我们使用 Ciravegna 等人提出的第一个逻辑解释网络来解决 XOR 问题。 2020 年,作者将其称为“ψ 网络”。此 LEN 的特点是:
• 一系列具有 sigmoid 激活函数的全连接层;
• 训练时的修剪阶段以简化架构。
你只需要导入两个库:
import torch
import torch_explain as te
并生成如下训练数据:
x_train = torch.tensor([
[0 0]
[0 1]
[1 0]
[1 1]
] dtype=torch.float)
y_train = torch.tensor([0 1 1 0] dtype=torch.long)
让我们定义一个 3 层的 ψ 网络:
layers = [
torch.nn.Linear(x_train.shape[1] 10)
torch.nn.Sigmoid()
torch.nn.Linear(10 5)
torch.nn.Sigmoid()
torch.nn.Linear(5 1)
torch.nn.Sigmoid()
]
model = torch.nn.Sequential(*layers)
您现在可以通过优化二元交叉熵损失和 l1_loss 损失函数来训练网络,将人类先验结合起来进行简单的解释。我们将在 1000 个 epoch 后修剪网络:
optimizer = torch.optim.AdamW(model.parameters() lr=0.01)
loss_form = torch.nn.BCELoss()
model.train()
for epoch in range(6001):
optimizer.zero_grad()
y_pred = model(x_train)
loss = loss_form(y_pred y_train) 0.000001 * te.nn.functional.l1_loss(model)
loss.backward()
optimizer.step()
model = prune_equal_fanin(model epoch prune_epoch=1000)
训练后,您可以提取描述网络如何组成输入特征以获得预测的一阶逻辑公式:
from torch_explain.logic.nn import psi
from torch.nn.functional import one_hot
y1h = one_hot(y_train.squeeze().long())
explanation = psi.explain_class(model x_train)
解释将是析取范式的逻辑公式。在这种情况下,解释将是 y=1 IFF (f1 AND ~f2) OR (f2 AND ~f1) 对应于 y=1 IFF f1 XOR f2。
逻辑解释的质量可以从分类准确度和规则复杂度方面进行定量评估,如下所示:
from torch_explain.logic.metrics import test_explanation complexity
accuracy preds = test_explanation(explanation x_train y1h target_class=1)
explanation_complexity = complexity(explanation)
在这种情况下,准确度为 100%,复杂度为 4。
示例#2
现在让我们把问题复杂化一点:让我们解决增加了 100 个虚拟特征的 XOR 问题。您只需要按如下方式生成训练数据:
x0 = torch.zeros((4 100))
x_train = torch.tensor([
[0 0]
[0 1]
[1 0]
[1 1]
] dtype=torch.float)
x_train = torch.cat([x_train x0] dim=1)
y_train = torch.tensor([0 1 1 0] dtype=torch.long)
为了解决这个任务,让我们使用我们最近引入的特殊层(即熵层)定义一个更强大的 LEN,以实现一种非常有效的 LEN,称为“基于熵的 LEN”[10]:
layers = [
te.nn.EntropyLinear(x_train.shape[1] 10 n_classes=2)
torch.nn.LeakyReLU()
torch.nn.Linear(10 4)
torch.nn.LeakyReLU()
torch.nn.Linear(4 1)
]
model = torch.nn.Sequential(*layers)
您现在可以通过优化交叉熵损失和 entropy_logic_loss 损失函数来训练网络,结合人类先验进行简单的解释:
optimizer = torch.optim.AdamW(model.parameters() lr=0.01)
loss_form = torch.nn.CrossEntropyLoss()
model.train()
for epoch in range(1001):
optimizer.zero_grad()
y_pred = model(x_train).squeeze(-1)
loss = loss_form(y_pred y_train) 0.00001 * te.nn.functional.entropy_logic_loss(model)
loss.backward()
optimizer.step()
训练后,您可以提取描述网络如何组成输入特征以获得预测的一阶逻辑公式:
from torch_explain.logic.nn import entropy
from torch.nn.functional import one_hoty1h = one_hot(y_train)
explanation _ = entropy.explain_class(model x_train y1h x_train y1h target_class=1)
解释将是析取范式的逻辑公式。在这种情况下,解释将是 y=1 IFF (f1 AND ~f2) OR (f2 AND ~f1) 对应于 y=1 IFF f1 XOR f2。
逻辑解释的质量可以从分类精度和规则复杂度方面进行定量评估,如下所示:
from torch_explain.logic.metrics import test_explanation
complexityaccuracy preds = test_explanation(explanation x_train y1h target_class=1)
explanation_complexity = complexity(explanation)
在这种情况下,准确度为 100%,复杂度为 4。
LEN 功能强大吗?在这一点上,您可能会相信 LEN 会做他们所做的。但是,您可能仍然有一些实际问题!现在,我会尽力猜测其中的一些并提供一个简短的答案:)
问题 1 — LEN 有多强大?或者,换句话说,如果使用 LEN 而不是等效的黑盒神经网络,在分类准确度方面可能会损失多少?
答案 1 — LEN 的准确度与等效的黑匣子相当。在我们的论文中,我们展示了如何在具有挑战性的数据集上,基于熵的 LEN 相对于等效的黑盒具有相当的竞争力,并且它们通常优于决策树和贝叶斯规则列表等白盒方法:
LEN 相对于最先进的白盒模型的分类精度。
问题 2 — 在实践中提取的 FOL 解释的质量如何?逻辑公式是否准确简洁?或者,换句话说,LEN 是否提供了有缺陷的解释?完全是垃圾吗?
答案2——解释简单准确!多少?好吧,至少可以与最先进的白盒模型提供的质量相媲美。下图从(1)平均分类测试误差(y轴)和(2)逻辑解释的平均复杂度(文字数)(x轴)方面显示了逻辑解释的质量。在提供一些最准确的公式的同时,基于熵的网络也在生成最简单的公式。多么简单?好吧,垂直虚线红线标志着外行人可以处理的最大解释复杂性(约 9 个文字)。来自基于熵的网络的大多数解释更简洁(3-4 个字面量),因此它们的解释很简单:)
传递的信息在这篇文章中,我试图传达 4 个关键信息:
1. 迫切需要可解释且准确的模型。
2. 一阶逻辑解释很酷,因为它们可以定量评估(这对于实际的实际应用至关重要)。
3. 逻辑解释网络是一系列可解释的设计神经模型,提供一阶逻辑解释。
4. 逻辑解释网络既可解释又准确(且易于实施!!!)。