为可解释性解释 Alibi

441 阅读15分钟

AI 中的可解释性是指理解和解释机器学习模型或算法做出的决策或预测的能力。它涉及对模型如何做出决策或预测提供清晰易懂的解释,例如哪些特征或输入在决策过程中影响最大。

本质上,它提出了一个重要问题:

image.png

随着 AI 模型开始变得越来越复杂,拥有数百万和数十亿个参数,理解和解释各种模型变得越来越困难。

然而,为机器学习和深度学习增加可解释性是当务之急。它对机器学习模型的用户和创建者都至关重要。

为了在系统中引入信任和透明度,向用户表明将考虑道德因素,并且 AI 将对其做出的决定负责,可解释性很重要。此外,它还允许开发人员分析如何改进他们的模型。

Alibi-Explain 库实现了一些现有的流行算法,以增加机器学习模型的可解释性。预测函数只需传递给解释器,解释器实现用户选择的任何可解释性算法。

image.png

它可以通过以下方式实现:

def  predictor ( X: np.ndarray ) -> np.ndarray: 
    inp = transform_input(X) 
    output = model(inp) # 或者调用模型特定的预测方法
    output = transform_output(output) 
    return output 

explainer = SomeExplainer(predictor, **kwargs)

Alibi 算法和其他相关的实施示例也可以在他们的网站上看到这里

在本文中,我们将通过创建情感分析模型来学习如何使用 Alibi。

让我们从创建情感分析的基本模型开始。此处附有此笔记本。

我们使用 IMDb 电影数据集。这是一个非常有名的数据集,其中包含电影及其信息,以及用户对这些电影的评分和评论。此数据通常用于电影推荐系统,但今天我们将使用 IMDb 数据集评论来检查其中表达的情绪是正面的还是负面的。

image.png

资料来源:Kaggle

image.png

评论示例:

正面评价:

雷切尔·格里菲思 (Rachel Griffiths) 撰写并执导了这部获奖短片。一个关于应对悲伤和缅怀我们所爱和失去的人的感人故事。虽然只有 15 分钟,但格里菲斯设法在短时间内将如此多的情感和真相捕捉到电影中。巴德·廷威尔 (Bud Tingwell) 饰演威尔 (Will),他的表演感人至深,威尔是一位努力应对妻子去世的鳏夫。威尔开始照顾露丝的宠物牛郁金香时,他面临着孤独和无助的严酷现实。这部电影展示了一个人对他们所爱和失去的人的悲伤和责任。良好的电影摄影,出色的方向和出色的表演。它会让所有失去亲人并幸存下来的人流泪。

差评:

这部电影缺乏我一开始无法理解的东西:女主角的魅力。当她与男主角共享屏幕时,这不可避免地转化为缺乏化学反应。即使是浪漫的场景也只是演员在表演。很可能是导演错误地估计了他对演员的需求。我只是不知道。

但这会不会是剧本?厨师究竟爱上了谁?他似乎更迷恋他的厨艺和餐厅,最终迷恋他自己和他年轻时的功勋,胜过其他任何人或任何事物。他从未让我相信他爱上了公主。

我对这部电影很失望。但是,不要忘记它获得了奥斯卡提名,所以自己判断吧。

我们可以从官方网站下载这个数据集,或者我们可以简单地从 tensorflow 数据集导入它,如下所示:

从tensorflow.keras.datasets导入imdb

加载数据集之后就很简单了:

max_features = 10000
 maxlen = 100
部电影 = imdb.load_data(num_words=max_features) 
print ( '加载数据...' ) 
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features 
) copy() 
train_labels = y_train.copy() 
print ( len (x_train), '训练序列' ) 
print ( len (x_test), '测试序列' ) 
y_train, y_test = to_categorical(y_train), to_categorical(y_test) 

print ( '填充序列(样本 x 时间)' ) 
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen) 
print ( 'x_train shape:' , x_train.shape) 
print ( 'x_test shape:' , x_test.shape) 

index = imdb.get_word_index() 
reverse_index = {value: 键为index.items()中的(键,值) }

要解码部分数据集:

def  decode_sentence ( x, reverse_index ): 
    return  " " .join([reverse_index.get(i - 3 , 'UNK' ) for i in x]) 

train_data = [(decode_sentence(x, reverse_index))   for x in x_train]
测试数据= [(decode_sentence(x, reverse_index))   for x in x_test]

现在我们的数据集已准备就绪,让我们最终使用向量化器和简单的逻辑回归来预测我们观察到的是负面情绪还是正面情绪。

vectorizer = CountVectorizer(min_df = 1clf = LogisticRegression(求解器='liblinear')
clf.fit(vectorizer.transform(train_data),train_labels)

因此,预测功能将是:

predict_fn = lambda x: clf.predict(vectorizer.transform(x))

现在我们准备好进入可解释性部分。

使用锚点实现可解释性:

我们实施的第一个可解释性算法是锚点。锚点算法基于Anchors: High-Precision Model-Agnostic ExplanationsRibeiro 等人的论文。该技术是一种可以为机器学习模型生成准确且易于理解的解释的方法,无论模型的架构或算法如何。该技术确定了一组“锚定规则”,这些规则确定了模型进行特定预测所需的条件。通过提供此类规则,该技术可以帮助使模型的决策过程更加透明和可信。为了生成这些规则,Anchors 技术首先随机选择一个数据子集。然后,它搜索可以准确解释该子集中一定百分比的数据点的最小锚定规则集。

可以使用以下行导入它:

来自不在场证明。解释器 导入 AnchorText

为了说明这在现实中有多大用处,我想带回电影推荐场景。通过评论,您不仅可以了解哪些词语暗示评论是负面的,还可以了解哪些词语可能导致电影获得负面评论。基于此,您可以收集有关用户不喜欢电影的哪些方面甚至内容的信息,并根据评论找到推荐用户喜欢的电影的方法。

为了演示的简单性,让我们尝试使用一个示例评论。因此,在这里我们将尝试在评论中找到使预测器将测试预测为正面或负面的词语。

让我们从引入 Spacy 开始,它将用于执行文本标记化、pos-tagging、计算单词相似度等。它可以按如下方式加载:

model = 'en_core_web_md'
 spacy_model(模型=模型) 
nlp = spacy.load(模型)

未知采样

这里我们将使用未知词采样策略。本质上,随机选择的词,除了那些在锚点中查询的词,被替换为该策略的 UNK 令牌。示例如下:

审查:

这部电影中的母亲对她的孩子鲁莽到被忽视的地步我希望我对她和她的行为没有那么生气,否则我会喜欢这部电影她听了我的建议并快速浏览你的一切看到她直到最后还有其他人厌倦了看那些拍摄得如此黑暗的电影,作为观众,我们几乎看不到正在拍摄的内容,我们对屏幕上的动作一无所知,所以为什么他妈的不能我们有夜视仪

解释:

主持人:建议和生气,否则和母亲

精度:0.91

应用锚点且模型预测为 0 的示例:

  1. UNK UNK UNK UNK 鲁莽的 UNK 她的孩子 UNK UNK of UNK 我希望我对她的 UNK UNK 行为不那么生气,因为 UNK 会 UNK 否则会享受 UNK 什么 UNK 编号 UNK 是 UNK 我的建议和 UNK 通过 UNK 转发UNK UNK 她的 UNK UNK UNK 也是任何人 UNK 厌倦了看那个 UNK UNK UNK UNK 't UNK UNK 晚上 UNK
  2. UNK 妈妈在这部电影中 UNK UNK UNK 她的孩子 UNK UNK 点 UNK 忽视 UNK UNK UNK 被 UNK UNK 生气 UNK UNK 和 UNK UNK 因为我 UNK UNK 否则喜欢 UNK 什么 UNK UNK UNK UNK 建议 UNK UNK UNK UNK UNK 看看她的 UNK 直到 UNK 结束 UNK 是任何人 UNK 厌倦了看 UNK UNK UNK UNK UNK UNK 一个 UNK UNK UNK UNK UNK 被拍摄为 UNK 我们参与 UNK UNK UNK UNK UNK UNK 那么为什么 UNK ca UNK 我们 UNK晚上UNK

锚点应用和模型预测 1 的示例:

  1. UNK 母亲 UNK 这个 UNK 是鲁莽的 UNK UNK 孩子们对 UNK 的忽视 我希望 UNK 对她和她的行为不那么生气你 UNK UNK 做 UNK UNK 也 UNK 任何人 UNK UNK UNK UNK UNK 电影 UNK UNK 拍摄 UNK 黑暗了UNK UNK夜视仪
  2. UNK 妈妈在这个 UNK UNK 鲁莽地对待她的孩子以至于忽视我 UNK UNK UNK 对她和她的行为非常生气,因为否则我会喜欢 UNK UNK UNK UNK 她接受了 UNK 建议 UNK UNK 通过一切 UNK 看到UNK do UNK UNK UNK UNK UNK UNK UNK UNK UNK UNK UNK UNK UNK UNK UNK UNK 太黑了恩恩恩恩恩恩恩恩

可以按如下方式实现:

explainer = AnchorText( 
    predictor=predict_fn, 
    sampling_strategy= 'unknown' , 
    nlp=nlp, 
) 
explanation = explainer.explain(样本, 阈值= 0.95 )

相似性抽样

这里我们将使用未知词采样策略。本质上,随机选择的词,除了那些在锚中查询的词,被这个策略的相似标记所取代。示例如下:

审查:

这部电影中的母亲对她的孩子鲁莽到被忽视的地步我希望我对她和她的行为没有那么生气,否则我会喜欢这部电影她听了我的建议并快速浏览你的一切看到她直到最后还有其他人厌倦了看那些拍摄得如此黑暗的电影,作为观众,我们几乎看不到正在拍摄的内容,我们对屏幕上的动作一无所知,所以为什么他妈的不能我们有夜视仪

解释:

主持人:建议 AND 否则 AND 母亲 AND 生气

精度:0.93

应用锚点且模型预测为 0 的示例:

  1. 另一部电影中的母亲对她的孩子鲁莽到荒谬的地步我反对我对她和她的让步并不感到惊讶,因为否则我会珍惜另一部电影她处理了多少我的建议并在你的一切中预先加载看到她所做的直到那一刻广泛是其他任何人都厌倦了拍摄如此黑暗愚蠢的电影,以至于几乎看不到正在拍摄的内容,因为我们是 UNK 参与其中的欣赏如此缓慢地通过动作将动作播放到另一个屏幕上为什么另一个地狱不能我们有夜间照明吗
  2. 这部剧本中的另一位母亲在她的社区之间令人遗憾到离题的地步我希望除了她和她的权利之外我没有那么生气因为否则我会激怒这部电影她利用我的建议和强大的前进游戏一切你看到她的借口,直到时间表机械地是这里的任何人都对观看被冷落得令人难以置信的黑暗的有声读物感到不高兴,人们可以温和地看到整个过程中正在拍摄的内容,我们肯定参与了另一个屏幕上的动作,那么为什么他妈的不能'我们认识到夜视

锚点应用和模型预测 1 的示例:

  1. 那部电影之外的母亲通过她的孩子对我需要的不正当行为的阻碍是令人发指的,尽管她和她的行为我并没有那么生气,因为否则我会赢得电影她每次流行她都会接受我的建议并开始通过一切你重看她的所作所为,因为结局广泛是其他任何人都厌倦了蹲伏的故事,这些故事被拍摄得如此黑暗可怕,一个人可以令人惊讶地重新观看正在拍摄的观众我们是 UNK 通过另一个组织仔细审查霍华德录像带可能很可怕为什么坏蛋可以 n '我们将夜间受孕联系起来
  2. 盗窃电影中的另一位母亲鲁莽地向被忽视的神族预示我打算我对她和她的处境并不十分生气,否则我会让另一个杀手感到惊讶,她的数量是多少,她会寻求我的建议并慢慢向前推进一切你希望她在饥荒之后做的还有其他任何人在白日梦电影中生病,这些电影拍摄得非常丰富多彩,幸运的是,我们可以重新观看正在拍摄的内容,尽管我们的本能是 UNK 迟来的另一个动作播放另一个屏幕那么为什么坏蛋不能'我们有视觉想象力吗

可以按如下方式实现:

explainer = AnchorText( 
    predictor=predict_fn2, 
    sampling_strategy= 'similarity' , 
    nlp=nlp, 
) 

explanation = explainer.explain(样本, 阈值= 0.95 )

语言建模

Anchors 技术提供了使用语言模型采样策略指定扰动分布的能力。这涉及随机选择单词(不包括被查询的锚中的单词)并用语言模型预测的单词替换它们。Alibi 支持三种不同的基于转换器的语言模型:DistilbertBaseUncased、BertBaseUncased 和 RobertaBase。该技术很简单,但由于缺乏计算能力,我们还没有实现它。但是,它可以按如下方式实现:

来自alibi.utils import DistilbertBaseUncased, BertBaseUncased, RobertaBase 
language_model = DistilbertBaseUncased() 
explainer = AnchorText( 
                       predictor=predict_fn, 
                       sampling_strategy= "language_model" , 
                       language_model=language_model) 
explanation = explainer.explain(sample, threshold= 0.95 )

拥有一个工具来解释为什么模型以它的方式运行总是有用的。在电影推荐场景中,它有助于解释为什么模型认为用户对电影有积极或消极的反应。然而,这些解释很可能是可疑的。

在锚点算法中,有好几次,锚点解释都是空的。这意味着不存在预测成立所必需的显着特征子集。这并没有给我们太多关于推理的信息。

另外,像锚文本的语言模型采样这样的方法需要大量的计算,并且即使在colab提供的环境中也不会针对某些示例运行,因此在生产过程中运行它是不可行的。

恭喜!有了这个,你已经学会了如何理解你的机器学习模型。现在您可以找出偏差,甚至可以调试您的模型以找出模型出错的地方。

使用集成梯度实现可解释性

为了了解如何获得深度网络的可解释性,我们将实施集成梯度方法。这是 Mukund Sundararajan、Ankur Taly 和 Qiqi Yan 在论文“Axiomatic Attribution for Deep Networks”中提出的一种解释深度神经网络预测的方法。

该方法基于这样的想法,即对给定预测的解释应考虑每个特征或输入变量对预测的贡献。Integrated Gradients 通过计算每个输入特征对预测的“属性”来解决这个问题,它表示该特征影响预测的程度。

为了计算每个特征的属性,Integrated Gradients 在从基线输入到实际输入的路径上对模型输出相对于输入特征的梯度进行积分。选择基线输入作为参考输入,其中所有输入特征都具有固定且已知的值,例如零向量或平均输入向量。该路径是输入空间中的一条直线,使用梯形法则沿该路径进行积分。所得积分表示沿路径的累积梯度,用于计算每个特征的属性。

Integrated Gradients 方法满足几个理想的属性,例如灵敏度、实现不变性、完整性和实现不变性。这些属性确保属性是一致的、忠实的并且对实际用途有用。

这种方法计算单个特征属性的能力使其成为理解复杂模型决策过程和提高其可解释性和透明度的宝贵工具。所以在影评场景中,我们可以观察到影评中有哪些品质和哪些词语使其成为正面或负面的,以及对电影表达的仇恨赞扬到何种程度。

让我们从构建架构模型开始。代码存在于主笔记本中。

image.png

然后我们调用集成梯度解释器,就像我们对锚文本所做的那样。

layer = model.layers[ 1 ] 
n_steps = 50 
method = "gausslegendre" 
internal_batch_size = 100 
nb_samples = 10 
ig   = IntegratedGradients(模型,
                          层=层,
                          n_steps =n_steps,
                          方法=方法,
                          internal_batch_size =internal_batch_size)
x_test_sample = x_test [:nb_samples ] 
predictions = model(x_test_sample).numpy().argmax(axis= 1 ) 
explanation = ig.explain(x_test_sample, 
                         baselines =None,
                         目标=预测,
                         attribute_to_layer_inputs = False

然后我们收集每个样本的所有属性,并在 n 个步骤中对每个样本求和。

我们可以将这些归因可视化为评论。该技术分别根据正或负属性值以不同深浅的绿色或粉红色突出显示单词。对于具有更高属性值的词,阴影变得更强。正属性值表示预测类别的概率增加,例如积极情绪,而负属性值对应于预测类别概率的降低。这种可视化可以轻松解释锚定规则,并提供对模型决策过程中哪些词最有影响力的见解。

例如:

image.png

结论

使用 alibi 运行可解释性确实有一些缺点,例如白盒可解释性方法不适用于所有模型,并且某些方法确实需要更长的运行时间,但这也取决于底层算法。

但是,Alibi 是将可解释性集成到系统中的一种简单方法。可解释性算法通常难以集成,而 Alibi 优化了评估性能,并且可以很容易地在生产模型中实施,以识别它们可能存在的任何类型的偏差,理解它们的推理线,甚至调试它们,这这就是为什么它在今天被证明非常有用的原因。