深度学习架构师手册——解释神经网络预测

121 阅读34分钟

你是否曾经想过,为什么一个人脸识别系统把一张肤色较深的人的照片标记为假阳性,而正确识别了肤色较浅的人的照片?或者为什么一辆自动驾驶汽车选择转弯导致了事故,而不是刹车避开碰撞?这些问题展示了在关键应用中理解模型为何预测某个特定值的重要性。通过提供模型预测的解释,我们可以深入了解模型是如何工作的,以及为什么做出特定的决策,这对透明度、问责制、信任、法规遵从和性能提升至关重要。

在本章中,我们将探索针对神经网络的模型预测解释方法。此外,我们还将讨论如何量化解释方法的质量。我们还将讨论模型解释中的挑战和局限性,以及如何评估其有效性。

具体来说,本章将涵盖以下内容:

  • 探索预测解释的价值
  • 揭开预测解释技术的神秘面纱
  • 探索基于梯度的预测解释
  • 信任和理解集成梯度
  • 使用集成梯度帮助理解预测
  • 自动解释预测解释
  • 探索预测解释中的常见陷阱及其避免方法

技术要求

本章包含一些 Python 编程语言的实际实现。为了完成本章,你需要在电脑上安装以下库:

  • pandas
  • captum
  • transformers-interpret
  • transformers
  • pytorch
  • numpy

代码文件可以在 GitHub 上找到:github.com/PacktPublis…

探索预测解释的价值

首先,通过模型的预测进行解释的概念被许多不同的名称所称呼,包括可解释人工智能(Explainable AI)、可信人工智能(Trustable AI)、透明人工智能(Transparent AI)、可解释机器学习(Interpretable Machine Learning)、负责任的人工智能(Responsible AI)和伦理人工智能(Ethical AI)。在这里,我们将这种范式称为“预测解释”,这是一种简洁明了的表达方式。

预测解释并不是大多数机器学习从业者采用的技术。预测解释的价值高度依赖于具体的应用场景。尽管有说法指出,预测解释可以增加透明度、问责制、信任、合规性和模型性能的提升,但并不是每个人都关心这些方面。我们不妨从不同的角度来思考,探索一些促使从业者采用预测解释的常见因素,这些因素可归结为以下几点:

预测解释技术提供了以下有关使用模型的好处:

  • 透明度:预测解释使得模型预测的使用者可以访问决策理由,这反过来会增强使用者对预测结果的信任。一个透明的模型让使用者能够客观地衡量其智能,进而增加信任并促进广泛采纳。
  • 问责制:预测解释使得消费者能够进行根本原因分析,这在关键的应用场景中尤为重要,特别是在某些需要人类参与最终决策的情况中,模型的预测作为参考依据。
  • 信任:没有信任,没人会使用模型的预测。预测解释为提高信任提供了小小的助力。
  • 合规性:某些政府强制要求在特定行业(如银行和保险)中,计算机系统做出的决策必须可解释。
  • 指标性能:根本原因分析的能力可以带来对模型行为或训练数据集的更好理解,从而让机器学习从业者能够改进或修正使用预测解释发现的问题,最终提升模型的指标性能。

这些好处使得在任何应用场景和模型中使用预测解释变得有价值。然而,当某些特定条件满足时,使用预测解释的价值会呈指数增长。基于特定目标的应用场景,预测解释方法的价值会加倍。接下来,让我们进一步探讨一些常见的驱动从业者采用预测解释的条件:

  • 关键且高影响力的应用场景:在这些应用场景中,模型的决策通常会对人类福祉、安全或健康产生重大影响。深入了解模型行为有助于减轻最坏情况的发生。这些情况可能包括巨额经济损失,甚至是实际的人命丧失。
  • 未能达到成功的门槛:如果在模型开发阶段无法实现成功的阈值,机器学习项目就无法进入部署阶段。理解模型对不同输入的反应可以帮助判断数据质量是否较差,是否存在导致过拟合的偏倚模式,并且有助于调试如何改善模型性能。
  • 模型在最简单的例子上做出错误预测:在最复杂的例子上做出错误预测是可以预期的,尤其是当人类在做出相同决策时也可能出错时。然而,在最简单的例子上犯错则表明模型未能学习到正确的内容。理解模型关注的点可能是找出模型失败原因的关键。
  • 法律要求机器学习模型在决策中的问责性:这意味着预测解释将不仅仅作为机器学习从业者用来理解模型行为或不同输入下的反应的方法,而是在模型部署后被使用,让预测的消费方理解为何做出某个决策,确保问责制。
  • 模型在部署后未能做出正确预测:你是否考虑过,一个在交叉验证设置中具有高准确度的好模型,是否意味着它关注的是正确的内容?即使使用交叉验证划分策略,数据仍然可能存在对某些特定条件的偏倚。这意味着,当模型部署到现实环境时,它所遇到的数据可能与用于模型开发的原始数据集存在不同的分布和条件。这时,预测解释有助于揭示模型在新数据或用于开发模型的数据中的偏倚和不良行为。换句话说,你需要量化错误预测和正确预测的差异。

在某些应用场景中不使用预测解释技术也是可以的。然而,当这些边缘案例发生时,预测解释技术就是帮助你克服障碍的关键工具。那么,预测解释究竟解释了什么呢?在下一节中,我们将简要介绍预测解释方法,并深入探讨我们本章将介绍的具体适用于神经网络的预测解释方法。

解密预测解释技术

预测解释是一种尝试解释模型在给定输入数据时做出决策背后逻辑的技术。某些机器学习模型在构建时就具备更高的透明性和可解释性。一个例子是决策树模型,它是通过显式的条件规则从底层构建的,将数据划分成多个分区,并根据这些分区做出特定决策,从而使预测能够通过所使用的显式规则来解释。然而,像神经网络这样的模型通常被视为黑箱,没有直接的方式来提取决策做出背后的原因。

模型在数据样本上的决策逻辑可以通过多种方式来解释和呈现,只要它包含关于最终决策是如何做出的信息。此外,机器学习模型做出的预测可以通过模型无关的方式或模型特定的方式来解释。以下是几种可以通过模型的预测进行解释的方式:

  • 基于显著性的解释:这也被称为重要性归因、特征重要性或特征影响。
  • 基于透明模型逻辑的解释:提供关于为什么做出某个决策的理由。
  • 基于示例的解释:使用类似数据推理为什么预测某个标签。

神经网络作为一个“黑箱”模型,通常只能通过基于显著性的解释或基于示例的解释来进行解释。然而,已经发明了变通方法,利用知识蒸馏方法将神经网络中的知识转移到更透明和可解释的模型(如线性模型)上,从而间接实现透明模型逻辑的解释。此外,变换器中的注意力机制通过其注意力图作为显著性方法提供了一种检查特征重要性的浅显方法,但在以下方面仍然存在不足:

  • 注意力权重不是特征特定的,因为它们是通过计算所有输入令牌与目标输出令牌之间的交互获得的。这意味着权重并不代表对某一独立特征的真实依赖。
  • 被注意力机制关注的输入在网络的后续部分仍然无法使用。
  • 注意力图可能存在偏差,导致一些特征被忽视。

此外,基于神经网络的解释技术应优先于模型无关的解释技术,因为它们能够提供更详细和细致的解释,同时在计算要求和时间上更为高效。本章将重点介绍使用更可靠的方法进行神经网络的基于显著性的解释。

在下一节中,我们将深入探讨神经网络模型特定解释的核心技术——基于梯度的显著性解释。

探索基于梯度的预测解释

目前,大多数神经网络模型解释技术是通过反向传播获得梯度的变种。基于梯度的解释之所以有效,是因为它依赖于神经网络在训练过程中如何通过反向传播更新权重的基本原理。在反向传播过程中,会计算损失函数相对于网络中权重的偏导数,从而得到损失函数相对于权重的梯度。

这个梯度为我们提供了输入数据对总体损失的贡献度的量度。记住,梯度衡量的是输入值相对于损失函数的敏感度。这意味着它提供了在修改特定输入值时,预测结果的波动程度,代表了输入数据的重要性。输入数据可以选择为神经网络的权重,也可以是整个神经网络的实际输入。在大多数情况下,基于实际输入的解释足以提供有关重要特征组的清晰度。然而,有时可能需要更精细的解释来解码高度归因和重要的实际输入数据的潜在特征。

例如,考虑使用卷积神经网络(CNN)识别动物品种的用例。对于一张狗站在草地上的图片,如果归因方法表明狗和草都是重要的,为什么草也重要呢?这可能有以下几个原因:

  • 狗的毛发和草被一个卷积滤波器共同识别。
  • 毛发和草由不同的滤波器明确区分开来,但由于模型可能过拟合,认为狗需要和草一起出现,因此它们被同样标记为重要。这可能意味着训练数据集只包含了带草的狗图像,提示需要添加没有草的狗图像。

这将需要深入研究在激活的滤波器中具有高度归因并与草和狗相关的滤波器。即便找到了这些重要的滤波器,它们在图片中的激活情况,且与草和狗有关,我们也无法确定这些滤波器识别的具体模式是什么。是像狗的形状这样的高级特征吗?还是毛发?在这种情况下,直接可视化模式是非常有益的。这个话题将在第12章《解释神经网络》中进行更详细的讨论。

然而,梯度本身并不可靠,不能直接作为解释方法使用。一般来说,纯梯度作为特征重要性解释方法的质量较低。但是,解释方法的质量并不是一个量化指标。生成的解释的感知质量是主观的,取决于消费者的需求。

考虑一个情境,金融机构希望开发一个信用评分模型来决定贷款批准。该机构有兴趣使用一种解释技术来理解哪些特征对模型预测最为重要。银行可能更倾向于使用一种解释技术,专注于那些对信用worthiness有最大影响的特征,如信用历史、收入和未偿债务。这将帮助银行做出明智的贷款决策,并有效管理风险。

另一方面,贷款申请人可能更希望获得更全面的解释,提供关于模型如何评估他们具体财务状况的见解,包括除了前三个最重要特征之外的因素,如就业历史和最近的经济困难。这将帮助申请人做出明智的决策,了解如何提高自己未来的信用worthiness。选择适当的解释技术非常重要,因为它应该迎合目标受众及其具体需求,使解释对其预期目的清晰和有用。

尽管如此,也有基于公理的评估方法,这些评估方法基于一组被认为是理想的原则或公理进行评估。在所有技术中,有一种叫做**集成梯度(Integrated Gradients)**的技术脱颖而出,它专注于神经网络模型,并且被开发出来以满足广泛接受的公理。

接下来,我们将了解集成梯度如何解释神经网络的预测,并理解该方法如何满足广泛接受的公理。

信任和理解集成梯度

首先,集成梯度技术可以在一些开源库中直接使用,例如shap和captum。我们可以直接利用这些库中的方法,而无需重新实现该方法。然而,如果在不了解技术细节的情况下获取解释,这可能会减少对解释的信任。如果你不信任该技术,那么解释结果本身几乎没有意义。接着,如果你没有解释你的预测,那么预测结果本身几乎也没有意义!在本节中,我们将深入探讨集成梯度的工作原理,以便你能信任集成梯度所能为你解释的内容。

集成梯度为基本的基于梯度的特征重要性解释添加了一些额外的组件。这些组件旨在满足一些关键的公理,这些公理决定了解释方法的可靠性。以下是这些公理:

  • 敏感性:一个模型如果在两个数据样本上给出不同的预测,而这两个样本只在单一特征上有所不同,那么该特征应该被赋予非零的重要性分数。像ReLU这样的激活函数会破坏这一公理,因为当输入值为零时,梯度也会变为零,即使两个预测之间有所不同。
  • 实现不变性:对于在所有可能的数据上具有相同表现的两个模型,它们必须产生相同的重要性分数。假设所有外部数据和模型生命周期内接收到的数据都被包含在内。
  • 完整性:提供反事实报告是为人类和机器学习提供高质量解释的最佳方法之一。为了评估模型的准确性,拥有一个基准模型起到了同样的作用。对于解释方法来说,这涉及到工程设计一个能够产生中性预测的基准数据样本。完整性意味着每个特征列的重要性分数必须加起来,等于基准样本和目标样本之间的预测分数差异。这个公理在某些用例中更有用,例如回归问题,其中预测值直接作为输出,而不是在多类设置中,预测仅用于选择最可能的类别。
  • 线性:如果你线性组合两个神经网络模型(即简单的加权相加),那么组合后的神经网络在一个数据样本上的解释必须是两个神经网络单独解释的加权和。模型中实现的线性行为应该被尊重。一个直观的公理是专门设计的,因为某些方法会生成无法解释的重要性值。

现在,我们理解了可以用来比较方法的核心公理,知道集成梯度满足所有这些公理。简而言之,集成梯度通过从一个选定的基准数据样本到目标数据样本的直线路径(线性插值)中采样的样本集成梯度,并将其与目标样本和基准样本之间的预测差异相乘。梯度的路径积分是梯度值沿直线路径的曲线下面积。这个值代表了随着输入特征值沿路径变化,模型输出的变化。变化率直接转化为特征的重要性。通过将这个值与实际输入值和基准输入值之间的差异相乘,我们得到了集成梯度对于特征对模型输出的贡献。图11.1展示了这个过程,结果是通过计算集成梯度在预训练的ResNet50模型上进行的预测,这些预测是在一张橙子图像上的。该模型能够预测图像属于橙子类别,并以46%的概率预测该图像为橙子。

image.png

更直观地说,这意味着集成梯度衡量了当目标输入特征值朝向中性基准样本变化时,模型预测的变化率,并提供了根据预测正确缩放的重要性:

特征重要性 = 预测差异 × 沿路径曲线的梯度面积

这使得它能够捕捉到模型输出对特征在整个取值范围内的敏感度。集成梯度通过聚合基准和目标之间线性插值路径上的样本梯度,确保每个特征的贡献与其对模型输出的影响成正比。使用普通梯度作为核心,使得集成梯度满足实现不变性,因为用来计算偏导数的链式法则允许部分计算梯度。

对于集成梯度,如果某个特征对模型输出的影响是另一个特征的两倍,那么它的归因分数将是另一个特征的两倍,因为沿路径的梯度对该特征的影响将是两倍,从而满足线性公理。此外,由于重要性是由基准输入和目标输入之间的预测差异进行缩放的,因此集成梯度将满足完整性公理。这些是局部解释,通过单个数据样本提供预测的原因。作为额外奖励,通过通过均值或中位数聚合所有数据样本的局部特征重要性,你可以获得模型的全局特征重要性。

接下来,我们将尝试使用集成梯度来解释一个模型的预测。

通过集成梯度来帮助理解预测

在写作时,有两个库提供了易于使用的类和方法来计算集成梯度,分别是 captum 和 shap 库。在本教程中,我们将使用 captum 库。captum 库支持来自 TensorFlow 和 PyTorch 的模型,我们将在这里使用 PyTorch。接下来,我们将解释一个 SoTA Transformer 模型,名为 DeBERTA,应用于文本情感多分类任务。让我们一步一步地了解用例:

首先,导入必要的库和方法:

from transformers import (
    DebertaForSequenceClassification,
    EvalPrediction,
    DebertaConfig,
    DebertaTokenizer,
    Trainer,
    TrainingArguments,
    IntervalStrategy,
    EarlyStoppingCallback
)
import pandas as pd
from sklearn.model_selection import train_test_split
import torch

接着,我们将导入一个为本教程制作的自定义文本情感数据集:

df = pd.read_csv('text_sentiment_dataset.csv')

这个数据集包含 100 行数据,三个情感类别“中性”、“积极”和“消极”分布均衡。稍后我们将深入了解该数据集的一些示例。

现在,我们将定义用于将情感标签映射到数值 ID 的标签映射:

label2id = {"negative": 0, "neutral": 1, "positive": 2}
id2label = {v: k for k, v in label2id.items()}

接下来,我们将创建一个方法,应用文本预处理并使用预训练的基于字节对编码(BPE)的标记器对文本数据进行标记化:

tokenizer = DebertaTokenizer.from_pretrained("microsoft/deberta-base")
def preprocess_function(examples):
    inputs = tokenizer(examples["Text"].values.tolist(), padding="max_length", truncation=True)
    inputs["labels"] = [label2id[label] for label in examples["Sentiment"].values]
    return inputs

为了训练模型,我们需要有一个交叉验证策略,因此这里我们使用一个简单的训练和验证拆分:

train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)

由于我们将使用 Hugging Face Transformers 库中的 PyTorch 模型,因此需要使用 PyTorch 数据集格式并拆分用于训练模型的数据。这里,我们将定义 PyTorch 数据集并初始化训练和验证数据集实例:

class TextClassificationDataset(torch.utils.data.Dataset):
    def __init__(self, examples):
        self.examples = examples    
    def __getitem__(self, index):
        return {k: torch.tensor(v[index]) for k, v in self.examples.items()}    
    def __len__(self):
        return len(self.examples["input_ids"])
train_dataset = TextClassificationDataset(preprocess_function(train_df))
test_dataset = TextClassificationDataset(preprocess_function(test_df))

数据集已预处理完毕并准备好用于训练,接下来加载我们从 Hugging Face 随机初始化的 DeBERTA 模型:

deberta_config = {
    "model_type": "deberta-v2",
    "attention_probs_dropout_prob": 0.1,
    "hidden_act": "gelu",
    "hidden_dropout_prob": 0.1,
    "hidden_size": 768,
    "initializer_range": 0.02,
    "intermediate_size": 3072,
    "max_position_embeddings": 512,
    "relative_attention": True,
    "position_buckets": 256,
    "norm_rel_ebd": "layer_norm",
    "share_att_key": True,
    "pos_att_type": "p2c|c2p",
    "layer_norm_eps": 1e-7,
    "max_relative_positions": -1,
    "position_biased_input": False,
    "num_attention_heads": 12,
    "num_hidden_layers": 12,
    "type_vocab_size": 0,
    "vocab_size": 128100
}
model_config = DebertaConfig(id2label=id2label, label2id=label2id, **deberta_v3_config)
model = DebertaForSequenceClassification(model_config)

由于这是一个多分类设置,我们将使用在每个 epoch 中计算的准确度指标,以及用于训练模型的交叉熵损失:

def compute_metrics(p: EvalPrediction):
    preds = p.predictions[0] if isinstance(p.predictions, tuple) else p.predictions
    preds = np.argmax(preds, axis=1)
    return {"accuracy": (preds == p.label_ids).astype(np.float32).mean().item()}

现在,我们将定义训练参数:

training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=1000,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=16,
    warmup_steps=100,
    weight_decay=0.01,
    logging_dir="./logs",
    logging_steps=10,
    evaluation_strategy=IntervalStrategy.EPOCH,
    save_strategy=IntervalStrategy.EPOCH,
    load_best_model_at_end=True,
    learning_rate=0.000025,
    save_total_limit=2,
)

这将把检查点保存到结果文件夹,训练模型 100 次并进行热身,在训练结束时加载最佳模型,并将学习率设置为非常小的 0.000025,以确保模型正确收敛。

接下来,我们将初始化 Hugging Face 的 trainer 实例,使用训练参数来执行实际的训练过程:

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=test_dataset,
    compute_metrics=compute_metrics,
    callbacks = [EarlyStoppingCallback(early_stopping_patience=20)]
)

注意这里使用了 20 次迭代的早停策略。当模型在验证数据集上的表现不再提升时,训练将停止,并且会进行 1000 次训练。

最后,训练并打印最终的最佳模型评估得分!

trainer.train()
trainer_v2.evaluate()

这将产生如下输出:

{'eval_loss': 0.1446695625782013,
 'eval_accuracy': 0.9523809552192688,
 'eval_runtime': 19.497,
 'eval_samples_per_second': 1.077,
 'eval_steps_per_second': 0.103}

95.23% 的准确率对于一个多分类模型来说是一个相当不错的得分。你可能会认为这个模型已经足够好,能够部署使用,但它的表现真的符合预期吗?让我们通过集成梯度的预测解释来研究模型的行为,看看模型的表现如何。首先,从 transformers_interpret 库中定义解释器实例:

from transformers_interpret import SequenceClassificationExplainer
cls_explainer = SequenceClassificationExplainer(model, tokenizer)

transformers_interpret 库在背后使用了 captum 库,提供了方法和类,使得通过 Hugging Face Transformers 库构建的模型的文本重要性变得易于解释和可视化。在所有这些功能中,我们将重要性分数映射到颜色代码,并将令牌 ID 映射回实际的令牌字符串。

接下来,我们将解释验证集中的两个示例,分别来自负面和正面标签,这些示例方便地位于前几个索引中:

for idx in [0, 8, 6, 12]:
    text = test_df['Text'].iloc[idx]
    label = test_df['Sentiment'].iloc[idx]
    word_attributions = cls_explainer(text)
    cls_explainer.visualize()

这将产生如图 11.2 所示的输出:

image.png

高亮为绿色的单词代表对预测标签类别的正面贡献,而高亮为红色的单词则代表负面贡献。绿色越深,表示对预测标签类别的正面贡献越强;红色越深,表示对预测标签类别的负面贡献越强。

第一个和第二个示例显示的是正确预测的积极情感句子。在第一个示例中,根据常识,"amazing"(惊人)应该是对积极情感贡献最大单词。而在第二个示例中,"happy"(开心)应该是突出的单词,作为积极情感的贡献。然而,在这两个例子中,"bored"(无聊)这个词被强烈地用作积极情感预测的指示词,这并不是我们想要的行为。这表明数据集存在偏差,可能在所有标记为积极情感的样本中都出现了"bored"这个词。

第三和第四个示例显示的是正确预测的消极情感。在第三个示例中,句子 "never going to end"(永远不会结束)和 "keeps dragging on"(不断拖延)应该是消极情感预测的焦点。在第四个示例中,单词"wrong"(错误)以及短语 "has gone wrong"(已经出错)和 "so frustrated"(如此沮丧)应该是消极情感预测的关键。然而,这两个示例一致地显示了对单词"day"(天)产生的消极情感依赖。这表明数据集存在偏差,可能在所有标记为消极情感的样本中频繁出现"day"这个词。

所有这些意味着,要么需要重新准备数据,要么应当向数据集中添加更多多样化的样本,以分散词汇使用的分布,从而构建出一个更合适的模型。

本教程展示了利用预测解释所带来的单一类型的益处。特别地,它展示了模型在未捕捉到部署所需的行为时,仍能在准确度指标上取得较好得分的情况。

集成梯度技术是一种灵活的技术,可以应用于任何类型的神经网络模型和任何类型的输入变量。为了从解释结果中获益,您需要根据业务目标的背景提取有意义的见解。要从集成梯度的结果中提取有意义的见解和结论,必须运用常识和逻辑推理,如本教程中手动演示的那样。然而,当数据量过大且变动过多,无法手动解码时,有一种方法可以帮助您获得有意义的见解。我们将在下一节中深入探讨这个方法。

自动解释预测

一种有助于从预测解释中得出见解的有用方法是使用大型语言模型(LLM),如ChatGPT。ChatGPT是一个经过训练的变压器模型,它能够提供与提供的指令相关的逻辑推理结果。这里的理论是,如果你能将预测解释数据格式化,使其能够输入到变压器模型中,并指示LLM从中得出见解,那么你将能够从多个不同的角度获得见解。

在之前的教程中,我们尝试解释了四个不同样本的解释,包括两个正确预测的积极情感示例和两个正确预测的消极情感示例。现在,我们将使用LLM模型来获得见解。这里,我们将分别为两个正确识别的积极情感示例和两个正确识别的消极情感示例生成见解,因为与直接输入所有四个示例相比,这种方法通常能提供更合理的结果。我们使用了以下提示:

"我使用HuggingFace定义的类构建了一个情感分类模型,包含3个标签“neutral”(中性)、“positive”(积极)、“negative”(消极)。我还利用集成梯度方法获得了以下示例的标记贡献:第一个示例,正确预测的积极情感 ['[CLS]', 0.0), ('I', 0.045...), ('was', 0.325...),...,第二个示例,正确预测的积极情感 ['[CLS]', 0.0), ('I', 0.0029...), ('happy', -0.028...),...,请告诉我这个模型在预测积极和消极贡献时有什么问题。提供完整的分析,看看最强的贡献词汇是否合理。根据相对分数判断模型,并关注单个最高评分的标记,看看它是否合理。"

注意,这些词标和贡献元组是之前教程中word_attributions变量的内容。对于这个提示,ChatGPT模型返回了以下回应,没有任何修改:

"根据给定的示例,模型在预测积极情感时似乎表现良好,因为两个案例中的预测标签都是正确的。然而,值得注意的是,标记贡献应谨慎解释,因为它们不总是可靠地反映每个单词在句子中的重要性。

查看第一个示例的标记贡献,我们可以看到最高贡献的单词是“bored”,其分数为0.494。对于一个积极情感的句子,这可能看起来有些奇怪,但模型可能会将这个词的高重要性归因于它消除了原本存在的负面情感。模型也可能已经学会了克服无聊感是一件被认为是积极的事情。第二个最高贡献的单词是“I”和“was”,两者的分数都超过0.3,这是合理的,因为它们表示作者的个人经验和观点。其他如“to”,“from”和“new”等词也似乎在句子上下文中是有意义的。

查看第二个示例的标记贡献,最高贡献的单词仍然是“bored”,分数为0.709。这可能是因为模型强调了工作让作者不再感到无聊,这是一个积极的事情。第二个最高贡献的单词是“from”,其分数为0.415,在句子的上下文中很有意义,因为它指示了工作让作者避免做的事情。其他高贡献的单词,如“to”和“that”,在句子上下文中似乎也很有意义。

总的来说,虽然模型在预测积极情感时表现良好,但需要注意的是,标记贡献可能会有噪声,因此应谨慎解释。高贡献的单词在句子的上下文中似乎是有意义的,但要全面理解情感,必须查看整个句子,而不仅仅是单个单词。"

这次回应提供了不同的视角,并提到了没有什么不对的可能性。总体而言,这是一个不错的回应,给了我们一个不同的视角,也表明LLM可以作为辅助工具用来解释预测解释的结果。现在,让我们将标记贡献结果替换为两个正确识别的消极情感示例,并使用以下列表:

第三个示例,正确预测的消极情感: [('[CLS]', 0.0), ('It', 0.178...), ('feels', -0.082...), ('like', -0.032...), ('this', -0.055...), ('day', 0.617...), ...]

第四个示例,正确预测的消极情感: [('[CLS]', 0.0), ('Everything', 0.051...), ('that', 0.185...), ('could', 0.166...), ('have', 0.099...), ...]

然后,ChatGPT返回了以下回应:

"从提供的示例来看,模型在这两种情况下正确预测了消极情感。然而,有一些地方需要分析,以确定模型的表现是否良好。

首先,集成梯度方法提供的标记贡献指示了每个标记对模型最终预测的贡献。在这两个示例中,最高正贡献的标记是“day”和“has gone wrong”,这些标记似乎是合理的,因为它们都表明了消极情感。

然而,提供的标记贡献中有一些标记的贡献分数是负值,这意味着它们对最终预测产生了负面贡献。例如,在第一个示例中,“feels”一词的贡献分数为负,但可以认为它实际上指示了消极情感。类似地,在第二个示例中,“'m”一词的贡献分数为负,但它是“I'm”的缩写,表示消极情感。

另一个需要考虑的因素是最高贡献标记的相对分数。在第一个示例中,“day”标记的贡献分数显著高于其他任何标记,这表明它是预测消极情感的最重要特征。而在第二个示例中,有多个标记的贡献分数接近,例如“has gone wrong”和“frustrated”,这表明它们是预测消极情感的同等重要特征。

总的来说,根据提供的示例和标记贡献,模型在预测消极情感方面表现合理。然而,标记贡献的分析表明,集成梯度方法在分配某些标记的分数时可能存在一些问题。同样,考虑最高贡献标记的相对分数和可解释性,判断它们是否在预测标签的上下文中合理。"

ChatGPT的回应表明这可能是一种有效的行为。由于大多数神经网络被配置为非线性模型并具有多个非线性激活,记住模型能够学习标记之间的复杂交互。这意味着标记通常以复杂的方式被模型感知,可能相互依赖。在另一个上下文中应用具有高贡献的标记时,可能不会产生相同的贡献值,因为多个标记可能需要相互依赖才能产生强烈的贡献。此外,标记不局限于与相邻标记的交互,它们可以出现在文本行的任何位置。验证标记是否过拟合的一种方法是预测仅包含“day”标记的文本数据,看看它是否预测为消极情感,并预测仅包含“bored”标记的文本数据,看看它是否预测为积极情感。

(代码示例)

这将返回以下响应:

{'label': 'neutral', 'score': 0.985...} {'label': 'negative', 'score': 0.528...} {'label': 'negative', 'score': 0.910...} {'label': 'negative', 'score': 0.949...} {'label': 'neutral', 'score': 0.985...} {'label': 'positive', 'score': 0.806...} {'label': 'positive', 'score': 0.974...} {'label': 'positive', 'score': 0.977...}

有趣的是,单独使用“day”和“bored”标记将导致预测为中性情感。随着重复标记的增加,预测将更多倾向于消极和积极情感,这证明了模型确实对这些特定单词存在偏见,并且没有正确使用这些单词,就像ChatGPT所说的那样。

探索预测解释中的常见陷阱及如何避免它们

尽管预测解释已被证明是理解AI模型的宝贵工具,但仍存在一些常见的陷阱,可能会阻碍其效果。在本节中,我们将讨论这些陷阱并提供相应的解决策略,以确保预测解释仍然是理解和改进AI模型的重要资源。以下是一些常见的陷阱及其解决方案:

过度依赖解释:
虽然预测解释可以为模型的决策过程提供宝贵的见解,但过度依赖这些解释可能会导致错误的结论。需要记住的是,预测解释只是解答模型行为的一部分,应该与其他评估方法结合使用,以全面了解模型的性能。解决方案是采用多种评估方法的组合,包括性能指标、交叉验证和领域专家知识,以分析和验证模型的表现。

误解解释结果:
解释预测结果可能具有挑战性,尤其是在处理复杂模型和大数据集时。误解这些结果可能会导致对模型行为和性能的错误结论。解决方案是与领域专家合作,帮助解释解释结果,并确保从这些解释得出的结论与实际知识和期望相一致。

忽视模型的局限性:
预测解释可以提供有关模型决策过程的有价值的见解,但它们不能解决模型本身的固有局限性。必须承认并解决这些局限性,以确保模型的最佳表现。解决方案是进行全面的模型评估,识别并解决任何局限性,例如过拟合、欠拟合或有偏的训练数据。根据需要持续重新评估并更新模型,以维持最佳性能。

解释面向错误的受众:
不同的利益相关者可能需要根据其专业知识和需求提供不同类型的解释。为目标受众提供过于技术化或过于简化的解释,可能会妨碍他们理解和使用预测结果。解决方案是根据目标受众的需求和专业知识量身定制解释。有时需要更具全球性的模型解释,而不仅仅是逐个预测的解释,这时可以考虑使用神经网络解释技术和汇总评估指标。对于非技术用户,仅通过提供原始特征重要性来解释预测是不够的,需要使用自然语言来解释通过特征重要性获得的见解,如在“自动解释预测”一节中介绍的那样。对于技术意识较强的用户,预测解释是适合的。

通过意识到这些常见陷阱并实施相应的策略,实践者可以确保预测解释继续成为理解和改进AI模型的宝贵工具。通过将预测解释与其他评估方法结合,并与领域专家合作,可以全面了解模型的性能、行为和局限性,从而最终实现更准确、可靠的AI系统,更好地服务于其预定目标。

总结

在本章中,我们对预测解释的全景有了广泛的了解,并深入探讨了集成梯度技术,实践应用于一个案例,甚至尝试通过LLM手动和自动地解释集成梯度结果。我们还讨论了预测解释中的常见陷阱,并提供了避免这些陷阱的策略,确保这些解释在理解和改进AI模型方面的有效性。

集成梯度是一种有用的技术和工具,可以为您的神经网络做出的预测提供一种基于显著性(saliency)的解释。通过预测解释来理解模型的过程提供了许多好处,能够帮助实现成功的机器学习项目和计划所需的标准。即使在一切顺利,机器学习应用案例并不关键的情况下,通过任何预测解释技术揭示您潜在部署模型的行为,也可以帮助您改进模型的使用方式。

然而,基于显著性的解释仅允许您了解哪些输入数据或输入神经元是重要的。但神经元从输入数据中能够检测到什么模式仍然是未知的。在下一章中,我们将扩展这一方向,揭示理解神经元到底检测了什么的技术。

通过了解常见陷阱并实施避免这些陷阱的策略,实践者可以确保预测解释继续成为理解和改进AI模型的宝贵工具。将预测解释与其他评估方法相结合,并与领域专家合作,可以帮助创建更加准确和可靠的AI系统,更好地服务于其预定目标。

在总结之前,最后要说的是,一定要花些时间通过集成梯度等预测解释技术理解您的神经网络模型,并考虑潜在的陷阱,以最大化其有效性!

进一步阅读

Mukund Sundararajan, Ankur Taly, Qiqi Yan. Axiomatic Attribution for Deep Networks, In: International Conference on Machine Learning. 2017. URL: arxiv.org/abs/1703.01…