文本到多类别解释:语言建模示例

本笔记本演示了如何获取语言模型生成的前 k 个最有可能的下一个词的解释。 在此演示中,我们使用 hugging face 提供的预训练 gpt2 模型 (https://hugging-face.cn/gpt2) 来预测前 k 个最有可能的下一个词。 通过查看前 k 个最有可能的下一个词,我们将它们视为 k 个单独的类别,然后学习对这 k 个词中每一个词的解释。 因此,我们能够解释输入中词语的贡献,这些词语负责预测前 k 个最有可能的下一个词的可能性。

[1]:
from transformers import AutoModelForCausalLM, AutoTokenizer

import shap

加载模型和分词器

[2]:
tokenizer = AutoTokenizer.from_pretrained("gpt2", use_fast=True)
model = AutoModelForCausalLM.from_pretrained("gpt2").cuda()

接下来,我们使用 TopKLM 模型包装该模型,该模型提取前 k 个最有可能的下一个词的对数几率,并且还通过使用 mask_token = “…” 初始化 Text masker 并设置 collapse_mask_token = True 来创建 Text masker,这用于在输入扰动期间填充文本。

[3]:
wrapped_model = shap.models.TopKLM(model, tokenizer, k=100)
masker = shap.maskers.Text(tokenizer, mask_token="...", collapse_mask_token=True)

定义数据

这里我们设置初始文本,我们希望 gpt2 模型预测下一个词

[4]:
s = ["In a shocking finding, scientists discovered a herd of unicorns living in a"]

创建解释器对象

[5]:
explainer = shap.Explainer(wrapped_model, masker)

计算 SHAP 值

[6]:
shap_values = explainer(s)

可视化输入句子中前 k 个最有可能的下一个词的 SHAP 值

我们现在可以在下面的图中“输出文本”下看到 gpt2 预测的前 k 个最有可能的下一个词,并将鼠标悬停在每个标记上,以了解输入句子中的哪些词语正在驱动生成要预测的特定输出词语

[7]:
shap.plots.text(shap_values)


[0]
输出
洞穴
森林
小的
沙漠
微小的
"
偏远的
动物园
田野
房子
巢穴
热带的
大的
农场
群体
野生的
非常
单个的
谷仓
丛林
新的
山谷
世界
花园
兽群
自然的
公园
沼泽
实验室
附近的
乡村的
池塘
黑暗的
木头
地下
房间
实验室
笼子
巨大的
新的
群落
巨大的
常见的
状态
深的
人类的
岩石
区域
盒子
河流
部分
空洞的
c
广阔的
村庄
不同的
虚拟的
城市
奇怪的
温室
冰冻的
浅的
平坦的
地块
神秘的
本地的
巨大的
贫瘠的
特殊的
多山的
墓地
蜂巢
新近
关闭的
社区
加利福尼亚
地方
淹没的
史前的
西南
高的
z
热的
远的
1
牧场


-9-12-15-6-3-12.5736-12.5736base value-2.91492-2.91492f cave(inputs)4.799 a 2.87 in 1.266 living 0.741 orns 0.474 of 0.463 unic 0.165 herd 0.138 a 0.115 In -0.304 , -0.304 discovered -0.236 finding -0.2 shocking -0.176 a -0.153 scientists
输入
0.115
在一个
0.138
一个
-0.2
令人震惊的
-0.236
发现
-0.304
,
-0.153
科学家
-0.304
发现
-0.176
一个
0.165
兽群
0.474
0.463
独角兽
0.741
1.266
居住
2.87
4.799
一个

有更多有帮助示例的想法吗? 欢迎提交拉取请求以添加到此文档笔记本!