对于以词嵌入作为输出的模型,SHAP 的特征贡献是如何计算的?

Dan*_*her 6 python neural-network machine-translation shap

在数值回归任务的典型 Shapley 值估计中,有一种明确的方法可以计算输入特征 i 对最终数值输出变量的边际贡献。对于输入特征(age=45,location=\xe2\x80\x99NY\xe2\x80\x99,sector=\xe2\x80\x99CS\xe2\x80\x99),我们的模型可能给出70k的预测工资,并且当该位置被删除时,预计薪资可能为 45k。因此,该特定联盟中特征位置的边际贡献为 70-45=25k。

\n

根据我的理解,如果不存在任何功能\xe2\x80\x99s,则基值将是预测工资,并且将基值和所有功能贡献相加将得到模型\xe2\x80\x99s给定实例的实际工资预测。

\n

将其扩展到分类
\n假设我们将上述问题转换为分类问题,其中使用相同的特征,并且模型输出可以解释为该人做出> 50k的概率。在此示例中,对 p(>50k) 的影响将是测量的内容,而不是对工资本身的影响。如果我正确地遵循了这一点,那么我的 Shapley 值就可以解释为概率。

\n

扩展到词嵌入
\n从 SHAP 文档中,我们可以看到 SHAP 解释器可以计算 Seq2Seq NMT 问题的特征贡献。\n就我而言,我正在使用 Marian NMT 库处理神经机器翻译问题。这是一个序列到序列的问题,其中字符串输入被编码为词嵌入,并从此类词嵌入解码输出。我的问题涉及这种功能贡献的逻辑如何在理论和实践中扩展到这样的问题。我发现SHAP 分区解释器为我提供了 NMT 任务的可靠特征归因,但我不明白为什么

\n

更简洁地说:
\n对于通常输出单词嵌入列表的模型,如何使用 SHAP 库计算特征贡献?

\n

简要示例
\n为了查看我提到的 SHAP 值,请运行以下 MRE。

\n
import shap\nfrom transformers import MarianMTModel, MarianTokenizer\n\nclass NMTModel:\n    def __init__(self, source, target):\n        model_name = "Helsinki-NLP/opus-mt-{}-{}".format(source, target)\n\n        #The tokenizer converts the text to a more NN-suitable\n        #format, as it cannot take raw text.\n        #Uses sentencepiece library\n        self.tokenizer = MarianTokenizer.from_pretrained(model_name)\n\n        #Load the model\n        self.model = MarianMTModel.from_pretrained(model_name)\n\n    def translate(self, src: str):\n        #Encode: convert to format suitable for an NN\n        encode_src = self.tokenizer(src, return_tensors="pt", padding=True)\n\n        #Feed forward through NMT model\n        translation = self.model.generate(**encode_src)\n\n        #Decode: convert to regular string\n        decode_target = [self.tokenizer.decode(t, skip_special_tokens=True) for t in translation]\n        return translation\n    \nnmt_model = NMTModel(\'en\',\'de\')\n\n#Create a SHAP Partition Explainer\nexp_partition = shap.Explainer(\n        model=nmt_model.model, \\\n        masker=nmt_model.tokenizer,\n        algorithm="partition")\n\n#Compute the SHAP estimates\nvalues_partition = exp_partition(["Good morning, Patrick"])\n\n#Plot the SHAP estimates\nshap.plots.text(values_partition)\n
Run Code Online (Sandbox Code Playgroud)\n

在输出中,我们看到英语句子“Good Morning,Patrick”中每个输入特征对输出特征“Morgen”的贡献。它正确地识别出“早晨”是最重要的特征,因为这是德语“Morgen”的正确翻译。我无法解释此处出现的实际 Shapley 值,它们来自哪里?贡献是如何计算的?\n在此输入图像描述

\n

我的想法\n我发现通过探索SHAP 存储库
很难找到答案。我最好的估计是使用神经网络中相应单元的数值输出或logit 。然而,这就引出了一个问题:词嵌入的范围是否对特征重要性有影响。也就是说,如果单词 \xe2\x80\x9cbring\xe2\x80\x9d 的单词嵌入为 500,而 \xe2\x80\x9cbrought\xe2\x80\x9d 的单词嵌入为 6512,则计算出的边际贡献是否与之前好像数字距离在这里很重要?

\n

我非常感谢任何澄清,并希望我的问题得到明确表达。

\n