模型的可解释性有助于你更深入地理解模型的工作原理。
可解释性本身并没有一个数学定义。Biran 和 Cotton 提出了一个关于可解释性的良好定义。他们写道,系统,或者在本例中是模型,"如果其操作可以被人类理解,无论是通过自省还是通过产生的解释,那么它们是可解释的。"换句话说,如果有某种方法可以让人类弄清楚为什么模型产生了某个特定的结果,那么这个模型就是可解释的。
术语"可解释性"(explainability)也常被使用,但可解释性和可解释性之间的区别并没有明确的定义。在本章中,我们主要将这两个术语统称为可解释性。
随着模型变得越来越复杂,可解释性变得既重要又难以实现。但好消息是,实现可解释性的技术也在不断改进。
可解释性人工智能
可解释性是更大领域------负责任AI(Responsible AI)的一部分。AI的发展以及其在越来越多问题上的成功应用,使得我们能够完成以前不可能完成的任务,这种能力迅速增长。这创造了许多伟大的新机遇,但也引发了关于我们应该多大程度上信任这些模型的结果的问题。有时,也会有人质疑这些模型在处理影响人类并可能造成伤害的诸多因素时,是否足够负责任。
可解释性对于负责任AI至关重要,因为我们需要了解模型是如何生成其结果的。模型生成的结果可以用不同的方式解释。其中最可靠的技术之一是构建一种本质上具有可解释性的模型架构。一个简单的例子就是基于决策树的模型,这类模型本身就具有可解释性。不过,越来越多的先进和复杂的模型架构也可以被设计为本质上具有可解释性。
为什么AI的可解释性如此重要?从根本上说,是因为我们需要解释我们的模型所做出的结果和决策。对于那些具有高度敏感性的模型来说,这尤其重要,包括自然语言模型,这些模型在面对某些例子时,可能会产生极其错误(或者冒犯、危险或误导)的结果。
可解释性对于评估模型对攻击的脆弱性也很重要(后面会讨论),我们需要持续地评估,而不仅仅是在攻击发生后进行评估。公平性也是一个关键问题,因为我们希望确保对模型的每个用户都是公平的。不公平不仅会影响我们的声誉和品牌,尤其是在客户或其他利益相关者可能质疑或挑战我们模型的决策时,但其实只要涉及到我们生成预测的任何情况,这一点都适用。当然,还有法律和监管方面的考量,尤其是在有人非常不满,以至于在法庭上挑战我们和我们的模型,或者当模型的结果导致了一些伤害性的行为时。
深度神经网络(DNN)可能会被欺骗,将输入错误分类,从而产生与真实类别完全不符的结果。这在图像分类的例子中最为直观,但从根本上说,这种情况可以发生在任何模型架构中。图9-1中的示例展示了一种"黑箱"攻击,在这种攻击中,攻击是在没有访问模型的情况下构建的。该示例基于一个用于图像分类的手机应用程序,通过物理对抗性样本进行攻击。
图9-1展示了来自数据集的堆叠洗衣机和干衣机的干净图像(左侧的图像A),并用它生成了一幅干净图像和两幅带有不同程度扰动的对抗性图像。图像B、C 和D展示了干净图像和对抗性图像,以及使用TensorFlow相机演示应用程序对它们进行分类的结果。
图像B被正确识别为"堆叠洗衣机和干衣机",而随着对抗性扰动在图像C和D中的增加,误分类也变得更加严重。关键的结果是,在图像D中,模型认为该设备要么是保险箱,要么是扬声器,但绝对不是堆叠洗衣机和干衣机。看看这幅图像,你会同意模型的判断吗?你能看到所施加的对抗性扰动吗?这并不容易。
图9-2展示了这种模型攻击中或许最著名的一个例子。通过加入几乎不可察觉的一点精心设计的噪声,一张熊猫的图片可以被错误分类为长臂猿------并且置信度高达99.3%!这远高于模型最初判断为熊猫的置信度。
通过为模型解释而设计的工具和技术,建立对模型如何做出预测的深刻理解,是防御此类攻击的一个重要部分。在研究模型的过程中,发现的过程也可能在攻击成为紧急事件之前揭示其脆弱性。
模型解释方法
现在让我们来看看一些基本的模型解释方法。大体上可以分为两大类,且两类之间存在重叠:一类是可以应用于一般模型的技术,另一类是可以应用于本质上具有可解释性模型架构的技术。从实际操作的角度来看,所需的努力程度也需要是可行的,并且衡量模型可解释性的一个标准是理解给定结果所需的努力或分析量。
理想情况下,你希望能够查询模型以了解它为什么以及如何做出特定决策。为什么模型以某种方式表现?你希望能够识别并验证驱动模型输出的相关特征。这样做将帮助你在不可预见的情况下也能对预测系统的可靠性建立信任。这种诊断有助于确保模型的问责性和对其安全性的信心。
理想情况下,你还应该能够验证任何给定的数据点,以向业务利益相关者和同事证明模型按预期工作,但在实践中,这可能会很困难。能够做到这一点将帮助你向利益相关者,包括用户和公众,保证模型的透明性。
模型可以提供什么信息来避免预测错误?在理想的情况下,你应该能够查询并理解潜在变量的相互作用,以及时评估和理解哪些特征在驱动预测,但在实践中这可能会很困难。像学习可解释性工具(LIT,见第8章)这样的工具可以帮助你可视化、探索和理解你的模型。
方法类别
有一些标准可以用于对模型解释方法进行分类。例如,可解释性方法可以根据是内在的(intrinsic)还是事后分析的(post hoc)来分组。它们还可以是模型特定的(model specific)或模型无关的(model agnostic)。此外,它们还可以根据是局部(local)还是全局(global)来分组。让我们来讨论这些分类标准。
内在的还是事后分析的?
一种对模型可解释性方法进行分类的方法是看模型本身是否具有内在的可解释性,或者是否必须将其作为黑箱进行解释。内在可解释的模型架构已经存在了很长时间,经典的例子是线性模型和基于树的模型。然而,最近开发了更先进的模型架构,如格子模型,以实现对复杂建模问题的可解释性和高精度。格子模型,例如,能够匹敌,甚至在某些情况下超过神经网络的精度。总体而言,内在可解释的模型比事后分析方法对为什么生成特定结果具有更高的确定性。
事后分析方法将模型视为黑箱,通常不区分不同的模型架构。它们倾向于对所有模型一视同仁,并在训练后应用,以尝试检查特定的结果,以便了解是什么原因导致模型生成这些结果。有些事后分析方法,尤其是针对卷积网络的,会检查网络中的各层,以尝试理解结果是如何生成的。然而,由于事后分析方法不评估生成结果的实际操作顺序,因此对于某些结果的解释是否正确,总是存在一定程度的不确定性。事后分析的示例包括特征重要性和部分依赖图。
各种解释方法也可以根据它们生成的结果类型大致分类。有些方法创建特征统计的摘要。有些方法为特征返回一个单一的值;例如,特征重要性为每个特征返回一个数字。一个更复杂的例子是成对特征交互强度,它为每对特征关联一个数值。
有些方法,比如部分依赖图,依赖可视化来汇总特征。部分依赖图是显示特征及其平均预测输出的曲线。在这种情况下,曲线的可视化比简单地在表格中表示数值更有意义和直观。
一些特定于模型的方法查看模型的内部。对内在可解释模型的解释就属于这一类。例如,对于较简单的模型,如线性模型,可以查看它们的学习权重以生成解释。同样,基于树的模型中学习的树结构也可以作为解释。在格子模型中,每一层的参数就是该层的输出,这使得分析、理解和调试模型的每个部分相对容易。
一些方法会检查特定的数据点。其中一种方法是反事实解释。反事实解释用于解释数据点的预测。通过这种方法,你可以通过更改一些特征找到另一个数据点,以使预测输出以相关的方式发生变化。这种变化应当是显著的,例如,新的数据点应属于不同的预测类别。
特定于模型还是与模型无关?
特定于模型的方法仅限于特定类型的模型。例如,线性模型中回归权重的解释就是特定于模型的。根据定义,用于解释内在可解释模型的技术是特定于模型的。但特定于模型的方法并不限于内在可解释模型,也有一些工具专门用于神经网络的解释。
与模型无关的方法不针对任何特定模型,可以在模型训练完成后应用于任何模型。本质上,它们是事后分析方法。这些方法无法访问模型的内部,如权重和参数。通常通过分析特征输入和输出对,尝试推断关系。
局部还是全局?
除了将解释方法分类为与模型无关或特定于模型外,还可以根据它们生成的解释是局部还是全局来进行分组。
可解释性方法可以是局部的或全局的,这取决于方法是解释单个预测还是整个模型的行为。有时,范围可以介于局部和全局之间。
局部可解释性方法用于解释单个预测。例如,它可以解释数据集中某个单一示例预测中的特征归因。特征归因衡量每个特征对给定结果的预测的贡献。
图9-3展示了使用一个名为SHAP的库(我们将在本章后面详细讨论SHAP)进行的特征归因,该图展示了糖尿病数据集中一个回归模型对单个示例的预测。该模型预测了基准一年后的疾病进展。图中显示了特征在推动模型输出从基准值向实际模型输出移动时的贡献。图中的平衡图展示了各方力量在197.62处达到平衡。左侧的力量推动平衡向上,而右侧的力量推动平衡向下。
可解释性方法也可以是全局的。全局可解释性方法解释整个模型的行为。例如,如果该方法为整个测试数据集的预测创建了特征归因的摘要,那么它可以被视为全局的。
图9-4展示了使用 SHAP 库创建的全局解释的一个示例。它展示了糖尿病预测数据集中每个特征对每个样本的特征归因(即 SHAP 值)。颜色表示特征值。随着 S1(总血清胆固醇)增加,患糖尿病的可能性往往会降低。由于这个解释展示了数据集中所有实例中所有特征归因的概览,因此它应被视为全局的。
内在可解释的模型
自统计分析和机器学习的早期开始,就存在一些内在可解释的模型架构。现在让我们来看看这些模型以及最近的进展,并了解它们如何帮助提高可解释性。
那么,什么是内在可解释的模型呢?
一种定义是,模型的工作过程足够透明和直观,使得通过检查模型本身来理解模型如何生成特定结果变得相对容易。许多经典的模型是高度可解释的,例如基于树的模型和线性模型。
尽管我们已经看到神经网络能够产生非常惊人的结果,但其中的一个问题是它们往往非常不透明,尤其是那些更大、更复杂的架构,这使得我们在解释它们时将其视为黑箱。这限制了我们对其结果的解释能力,需要使用事后分析工具来尝试理解它们是如何达到特定结果的。
然而,新近的架构被专门设计为具有可解释性,但它们仍然保留了深度神经网络的强大功能。这仍然是一个活跃的研究领域。
有助于提高可解释性的一个关键特征是特征是单调的。单调意味着随着特征值的变化,该特征对模型结果的贡献要么持续增加,要么持续减少,要么保持不变。这与许多问题中许多特征的领域知识相匹配,因此,当你尝试理解模型结果时,如果特征是单调的,它就与您对所要建模的世界的直觉相匹配。
例如,假设你正在创建一个模型来预测二手车的价值。当其他所有特征保持不变时,行驶的里程数越多,车辆的价值应该越低。你不会期望一辆里程数更多的车比它里程数更少时更值钱,其他条件都相同。这与您对现实世界的认知一致,因此你的模型也应该与之匹配,行驶里程这个特征应该是单调的。在图9-5中,其中两条曲线是单调的,而一条不是,因为它并不始终增加、减少或保持不变。
让我们来看看一些被认为是可解释的模型架构。首先,线性模型非常可解释,因为线性关系易于理解和解释,并且线性模型的特征总是单调的。其他一些模型架构也具有线性特征。例如,当用于回归时,规则拟合(rule fit)模型是线性的。而在所有情况下,TensorFlow Lattice 模型在格点之间使用线性插值,我们将很快学习这一点。
一些模型可以自动包括特征交互,或者对特征交互施加约束。理论上,你可以通过特征工程在所有模型中包含特征交互。符合领域知识的交互往往使模型更加可解释。
根据你尝试建模的损失曲面的特征,更复杂的模型架构可以实现更高的精度。但这通常以可解释性为代价。出于前面讨论的许多原因,可解释性可能是模型的严格要求,因此你需要在可解释的模型和生成所需精度的模型之间找到平衡。同样,有些新近的架构既能提供更高的精度,也能提供良好的可解释性。TensorFlow Lattice 就是这种架构的一个例子。
可能可解释性方面的终极模型就是老朋友------线性回归。对于大多数开发人员来说,线性回归是他们学习的第一个模型。即使是多元线性回归,也很容易理解特征贡献之间的关系。随着特征值的增加或减少,它们对模型结果的贡献也会随之增加或减少。
图9-6中的例子建模了蟋蟀根据空气温度每分钟发出鸣叫的次数。这是一个非常简单的线性关系,因此线性回归能够很好地对其进行建模。顺便说一句,这也意味着,当你在夜晚外出时,如果仔细听蟋蟀鸣叫并数数它们的叫声次数,就可以测量空气的温度。想了解更多,可以查阅 Dolbear 定律。
特征重要性
当然,特征对模型结果的实际贡献取决于它的权重。这一点在线性模型中尤其容易看出。对于数值特征,特征值增加或减少一个单位,预测值就会根据对应权重的值增加或减少。对于二元特征,根据特征值是1还是0,预测值会增加或减少权重的值。分类特征通常会通过独热编码(one-hot encoding)分成若干个单独的特征,每个特征都有一个权重。使用独热编码时,只有一个类别会被设置,因此模型结果中只会包含一个权重。
我们如何确定某个特征在预测中的相关性呢?
特征重要性告诉我们某个特征对于生成模型结果的重要程度。特征越重要,我们就越希望将其包括在特征向量中。但不同模型的特征重要性计算方法不同,因为不同模型计算结果的方式不同。
对于线性回归模型,特征的 t-统计量的绝对值是该特征重要性的一个很好的衡量指标。t-统计量是特征的学习或估计权重,经过标准误差的缩放。因此,特征的重要性随着其权重的增加而增加。但如果权重的方差越大(即我们对权重的正确值越不确定),则特征的重要性越低。
格子模型
如图9-7所示,格子模型在特征空间上覆盖了一个网格,并在网格的每个顶点上设置它试图学习的函数的值。当收到预测请求时,如果请求的点不正好落在某个顶点上,结果会通过从最近的网格顶点使用线性插值进行插值。
使用格子模型的一个好处是,可以通过在特征空间上施加规则网格来正则化模型,并大大降低对输入的敏感性,即使是那些超出训练数据覆盖范围的例子。
TensorFlow Lattice 模型超越了简单的格子模型。TensorFlow Lattice 进一步允许你在模型中添加约束和注入领域知识。图9-8中的图展示了正则化和领域知识的好处。比较左上角的图和右下角的图,注意到该模型与真实值相比其他类型模型有多么接近。
当你知道领域中的某些特征是单调的、凸的,或有一个或多个特征相互作用时,TensorFlow Lattice 可以让你在模型学习的过程中将这些知识注入到模型中。对于可解释性而言,这意味着特征值和结果很可能与你对结果的期望和领域知识相匹配。
你还可以表达特征之间的关系或交互,以表明一个特征反映了对另一个特征的信任。例如,评论数量越多,你对餐厅的平均星级评分的信心就越大。这种情况你自己在网上购物时可能也考虑过。所有这些基于领域知识或你对想要建模的世界的了解的约束,帮助模型生成有意义的结果,从而使其更加可解释。此外,由于模型在顶点之间使用线性插值,因此在可解释性方面,它具有许多线性模型的优点。
除了基于领域知识添加约束的所有好处外,TensorFlow Lattice 模型在复杂问题上的准确性也与 DNN 相似,额外的好处是 TensorFlow Lattice 模型比神经网络更容易解释。
然而,格子模型确实有一个弱点:维度性是它的"氪石"。
格子层的参数数量随着输入特征数量的增加呈指数增长,这会在特征数量较多的数据集上导致扩展性问题。一个粗略的经验法则是,特征数量最好不超过 20,但这也取决于你指定的顶点数量。然而,还有另一种方法可以应对这种维度问题,那就是使用集成方法,但这超出了本次讨论的范围。
与模型无关的方法
不幸的是,你不总是能够使用内在可解释的模型。出于各种原因,可能会被要求尝试解释一些本质上不易解释的模型的结果。幸运的是,有几种方法可以不依赖于特定类型的模型------换句话说,它们是与模型无关的。
与模型无关的方法将解释与模型分离开来,这些方法可以在模型训练完成后应用于任何模型。例如,它们可以应用于线性回归或决策树,甚至黑箱模型,如神经网络。
理想的与模型无关的方法应该具有模型灵活性和解释灵活性。解释不应限于某种特定类型。该方法应能够以公式的形式提供解释,或者在某些情况下,解释可以是图形化的,比如特征重要性。
这些方法还需要具有表示灵活性。所使用的特征表示应在模型的解释上下文中具有意义。让我们以一个使用词嵌入的文本分类器为例。在这种情况下,个别单词的存在用于解释是有意义的。
当前有许多与模型无关的方法被使用------太多了,这里无法详细展开。所以我们只讨论两种:部分依赖图和置换特征重要性。
部分依赖图
部分依赖图(PDP)帮助你理解特定特征对你看到的模型结果的影响,以及这些特征与训练数据中的目标或标签之间的关系。PDP 通常集中在一个或两个特征对模型结果的边际影响上。这样的关系可能是线性和/或单调的,也可能是更复杂的。例如,对于线性回归模型,PDP 总是显示线性、单调的关系。部分依赖绘图是一种全局方法,因为它考虑了所有实例并评估了特征与结果之间的全局关系。以下公式展示了如何计算特征取值对结果的平均边际影响:
<math xmlns="http://www.w3.org/1998/Math/MathML"> f x S ( x S ) = n 1 i = 1 ∑ n f ( x S , x C ( i ) ) f^xS(xS)=n1i=1∑nf^(xS,xC(i)) </math>fxS(xS)=n1i=1∑nf(xS,xC(i))
在上述公式中,部分函数 f^xS\hat{f}_{x_S}f^xS 是通过蒙特卡罗方法估计的。公式展示了部分函数的估计,其中 nnn 是训练数据集中的示例数量,SSS 是我们感兴趣的特征,而 CCC 是所有其他特征。
部分函数告诉我们,给定 SSS 中特征的值,对结果的平均边际影响是什么。在这个公式中,xC(i)x_C(i)xC(i) 是我们不感兴趣的特征的特征值。
PDP 假设 CCC 中的特征与 SSS 中的特征不相关。
图9-9展示了一个在自行车租赁数据集上训练的随机森林模型,预测每天租赁的自行车数量,给定一组特征,包括温度、湿度和风速。这些是温度、湿度和风速的 PDP。注意,随着温度上升到大约15°C(59°F),更多的人可能会选择租赁自行车。这是有道理的,因为人们喜欢在天气好的时候骑车,而在这个温度下,我们可以说天气刚刚变好。但请注意,这个趋势在约25°C(77°F)以上先趋于平稳,然后开始下降。你还可以看到湿度是一个因素,当湿度高于约60%时,人们对骑车的兴趣开始减弱。你呢?这些图是否符合你骑车的偏好?
要计算分类特征的部分依赖图(PDP),我们将所有实例强制设置为相同的类别值。图9-10展示了自行车租赁数据集中分类特征"季节"的图表。它有四个可能的值:春季、夏季、秋季和冬季。为了计算夏季的 PDP,我们将数据集中所有实例的"季节"特征的值强制为"夏季"。
注意到季节变化对自行车租赁的影响并不大,除了在春季租赁数量略低。坦白说,我们本不会期望这种情况发生,但这就是数据告诉我们的!你的直觉并不总是可靠的。
使用 PDP 有一些明显的优点。首先,当特征不相关时,结果往往是直观的。在特征不相关的情况下,PDP 显示当特征发生变化时平均预测的变化。PDP 的解释通常也具有因果性,因为如果我们改变一个特征并测量结果的变化,我们期望结果是一致的。最后,PDP 的实现相对容易,尤其是在日益增多的开源工具的帮助下。
然而,像大多数事物一样,PDP 也有一些缺点。实际上,你一次只能真正处理两个特征,因为人类难以可视化超过三维的情况。不过,我们并不认为这是 PDP 的错。
一个更严重的局限性是独立性的假设。PDP 假设你正在分析的特征(在前面的公式中为 C)与其他特征(S)不相关。正如我们在特征选择讨论中所学,消除相关特征是一个好主意。但如果你仍然有相关特征,PDP 就不太准确了。
例如,假设你想预测一个人的行走速度,给定这个人的身高和体重。如果身高在 C 中而体重在 S 中,PDP 会假设身高和体重不相关,这显然是一个错误的假设。因此,可能会出现一个身高 6 英尺 5 英寸(2 米)、体重 110 磅(50 公斤)的人,即使对于时尚模特来说,这也有点不现实,虽然我们在网上查找时惊讶地发现有些模特实际上确实接近这个值。总之,你明白了:相关特征是不好的。
置换特征重要性
置换特征重要性是一种衡量特征重要性的方法。通过置换特征,打破特征与模型结果之间的关系,本质上是为特征分配一个几乎随机的值。
对于置换特征重要性,我们通过在置换特征后预测误差的增加来衡量特征的重要性。如果打乱特征值会增加模型误差,那么这个特征是"重要的",因为在这种情况下,模型依赖于该特征进行预测。如果打乱特征值不会改变模型误差,那么该特征是"不重要的"。同样,如果我们发现有不重要的特征,我们应该考虑将它们从特征向量中移除。特征对模型误差的改变量给出了特征重要性的数值。
这是基本算法。输入是模型、特征、标签或目标,以及我们的误差指标。首先,你用所有特征的真实值测量模型误差。接下来,你对每个特征开始一个迭代过程:
- 首先置换你正在检查的特征的值,并测量模型误差的变化。
- 将特征重要性表示为置换后的误差与原始误差的比率,或表示为两者之间的差异。
- 然后按特征重要性排序,以确定最不重要的特征。
置换特征重要性有一个很好的解释,因为特征重要性是当特征的信息被破坏时模型误差的增加。这是对模型行为的高度压缩的全局洞察。由于通过置换特征你也破坏了它与其他特征的交互效应,它还展示了特征之间的交互。这意味着它同时考虑了主要特征效应和对模型性能的交互效应。而且一个很大的优点是,它不需要重新训练模型。其他一些方法建议删除特征,重新训练模型,然后比较模型误差。由于重新训练模型可能需要很长时间并需要大量资源,不需要这样做是一个很大的优势。
然而,使用置换特征重要性也有一些固有的缺点。首先,对于是否应该使用训练数据还是测试数据来测量置换特征重要性,并不明确,因为两种选择都有问题。使用训练数据测量置换特征重要性可能会导致度量反映模型对特征的过拟合,而不是这些特征的真正预测价值。另一方面,使用测试数据来测量置换特征重要性意味着测试集的样本会减少(如果使用测试数据的子集专门用于测量置换特征重要性),或者会导致模型性能测量出现偏差。与 PDP 类似,相关特征也是一个问题。此外,你还需要访问原始的带标签训练数据集,因此如果你从其他人那里获得模型,而他们没有提供训练数据,你就无法使用置换特征重要性。
局部可解释模型无关解释 (LIME)
局部可解释模型无关解释(LIME)是一个创建模型结果局部解释的流行和知名框架。这个想法相当直观。首先,忘记训练数据,假设你只有一个黑箱模型,你可以输入数据点并获得模型的预测结果。你可以尽可能多次探测这个黑箱。你的目标是理解为什么模型做出了某个预测。LIME 是 LIT 中包含的一种技术(见第8章)。
LIME 测试当你给模型输入数据的不同变体时,预测结果会发生什么变化。LIME 生成一个新的数据集,其中包含置换后的样本以及模型的对应预测。通过这个新数据集,LIME 然后训练一个可解释的模型,该模型的权重基于从采样实例到你正在解释的结果的距离。这个可解释的模型可以是任何易于解释的模型,如线性模型或决策树。
新模型应该在局部对模型结果进行合理的近似,但它不需要是一个全局的近似。这种精度也被称为局部忠实度。然后你通过解释新的局部模型来解释预测结果,正如我们所说,这个模型是容易解释的。
Shapley 值
Shapley 值是合作博弈论中的一个概念,以劳埃德·沙普利(Lloyd Shapley)的名字命名。他在1951年引入了这个概念,并因此获得了诺贝尔奖。
想象一群玩家合作,这种合作带来了总体收益。由于某些玩家可能比其他人贡献更多,或者拥有不同的谈判能力,那么应该如何在玩家之间分配收益呢?换句话说,每个玩家对整体合作有多重要,玩家合理地可以期待多少回报?Shapley 值提供了这个问题的一个可能答案。
对于机器学习和可解释性来说,"玩家"就是数据集的特征,我们使用 Shapley 值来确定每个特征对结果的贡献有多大。了解特征的贡献将帮助你理解它们在生成模型结果中的重要性。由于 Shapley 值不特定于任何特定类型的模型,因此它可以应用于任何模型架构。
这只是 Shapley 值背后概念的快速概述。现在让我们关注一个具体的例子。假设你训练了一个模型来预测卡车的价格。你需要解释为什么模型预测某辆卡车的价格为 $42,000。我们有那些数据可以使用呢?在这个例子中,汽车是一辆皮卡车,完全是电动的,载重量为半吨。
所有半吨皮卡车的平均预测价格是 <math xmlns="http://www.w3.org/1998/Math/MathML"> 36 , 000 ,但该模型对这辆特定卡车的预测是 36,000,但该模型对这辆特定卡车的预测是 </math>36,000,但该模型对这辆特定卡车的预测是42,000。为什么呢?
Shapley 值源于博弈论,所以让我们澄清如何将其应用于机器学习可解释性。这个"游戏"是数据集中单个实例的预测任务。"收益"是该实例的实际预测减去所有实例的平均预测。"玩家"是合作产生收益的实例的特征值。在卡车的例子中,特征值引擎=电动和载重=½ 吨共同作用,实现了 $42,000 的预测。
我们的目标是解释实际预测( <math xmlns="http://www.w3.org/1998/Math/MathML"> 42 , 000 )与平均预测( 42,000)与平均预测( </math>42,000)与平均预测(36,000)之间的差异,即 $6,000 的收益。
一种可能的解释是半吨载重贡献了 <math xmlns="http://www.w3.org/1998/Math/MathML"> 36 , 000 ,而电动引擎贡献了 36,000,而电动引擎贡献了 </math>36,000,而电动引擎贡献了6,000。这些贡献加起来就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> 6 , 000 :即最终预测减去卡车的平均预测价格。你可以把这看作绝对值 6,000:即最终预测减去卡车的平均预测价格。你可以把这看作绝对值 </math>6,000:即最终预测减去卡车的平均预测价格。你可以把这看作绝对值6,000,或者你也可以把它看作平均值的百分比,约为 16%。
与可能的其他解释模型结果的方法不同,Shapley 值基于坚实的理论基础。其他方法是基于直观合理性,这是可解释性的一个重要因素,但它们没有相同的严格理论基础。这也是 Shapley 因其工作而获得诺贝尔奖的原因之一。该理论定义了四个必须满足的属性:效率、对称性、虚拟性和可加性。
Shapley 值的一个关键优势是它在实例的特征值之间公平地分配了贡献。一些人认为 Shapley 可能是唯一能够提供完整解释的方法。在法律要求可解释性的情况下------例如欧盟的"解释权"------一些人认为 Shapley 值可能是唯一符合法律要求的方法,因为它基于坚实的理论,并且公平地分配了影响。
Shapley 值还允许对比解释。你可以将预测与整个数据集的平均预测进行比较,也可以与一个子集,甚至单个数据点进行比较。这种对比的能力是像 LIME 这样的局部模型所不具备的。
像任何方法一样,Shapley 也有一些缺点。可能最重要的缺点是它的计算成本高,这在许多现实情况下意味着只能计算一个近似解。它也很容易被误解。Shapley 值不是去掉特征后重新训练模型预测值的差异,它是特征值对实际预测与平均预测之间差异的贡献。
与其他一些方法不同,Shapley 不创建模型。这意味着你无法用它来测试输入的变化,例如"如果我换成混合动力卡车,预测会如何变化?"
最后,像许多其他方法一样,它在特征相关性很高时效果不好。但你已经知道在进行特征选择时应该移除相关特征,所以这对你来说不是问题,对吧?好吧,无论如何,这是需要注意的地方。
如果你只想解释少数特征或者模型可解释性不是特别关键,Shapley 可能不是合适的方法。Shapley 总是使用所有特征。人们往往更喜欢选择性解释,比如 LIME 和类似方法所提供的解释,因此这些方法可能是更适合非专业人士处理的解释的选择。另一个解决方案是使用 SHAP,它基于 Shapley 值,但也可以只使用少数特征进行解释。接下来我们将讨论 SHAP。
SHAP 库
现在让我们来看看开源的 SHAP 库,这是一个用于处理 Shapley 值和其他类似度量的强大工具。
SHAP,全称为 SHapley Additive exPlanations,是一种基于博弈论的方法,用于解释任何机器学习模型的输出,因此它是与模型无关的。它使用博弈论中的经典 Shapley 值及其相关扩展,将最佳信用分配与局部解释相结合,这些扩展最近成为了一些论文的主题。记住,Shapley 在1951年提出了他的初始理论,最近的研究者们在扩展他的工作。
SHAP 为每个特定的预测分配一个特征重要性值,并且包含了一些非常有用的扩展,许多都基于最近的理论工作。这些扩展包括:
- TreeExplainer:用于树集成模型的高速精确算法
- DeepExplainer:用于深度学习模型中 SHAP 值的高速近似算法
- GradientExplainer:将集成梯度、SHAP 和 SmoothGrad 的思想结合到单一的期望值方程中
- KernelExplainer:使用特定加权的局部线性回归来估计任何模型的 SHAP 值
SHAP 还包含了多种可视化图表来展示结果,帮助你解释模型。
你可以将 Shapley 值可视化为"力",如图 9-11 所示。每个特征值都是增加或减少预测的"力"。预测从基准开始,对于 Shapley 值来说,基准是所有预测的平均值。在力图中,每个 Shapley 值显示为推动预测增加或减少的箭头。这些力在预测点相遇,彼此平衡。
汇总图将特征重要性与特征效果结合起来。如图 9-12 所示,汇总图上的每个点表示一个特征的 Shapley 值和一个实例。重叠的点在 y 轴方向上有轻微抖动,因此我们可以感受到每个特征的 Shapley 值的分布情况,并且特征按照其重要性排序。因此,在图 9-12 中,我们可以很快看到最重要的两个特征是 s1(总血清胆固醇)和 s5(血清甘油三酯水平的对数)。
如图 9-13 所示,在 SHAP 依赖图中,特征值被绘制在 x 轴上,SHAP 值被绘制在 y 轴上。从这个示例中的图可以看到体重指数(BMI)与血压(bp)之间的相关性。
测试概念激活向量
理解深度学习模型如何做出决策可能非常棘手。它们的巨大规模、复杂的工作机制,以及通常隐藏的内部过程使得这些模型难以解释。此外,像图像分类器这样的系统往往会专注于细微的细节,而不是更广泛、更易于理解的概念。为了帮助解读这些复杂的模型,Google 的研究人员开发了概念激活向量(Concept Activation Vectors,CAVs)。CAVs 将神经网络的内部工作转换为人类易于理解的概念。一种称为测试 CAVs(TCAV)的方法被用来评估这些解释,并且是 LIT 工具包(详见第 8 章)的关键组成部分。
我们可以使用与我们正在研究的模型相关的一组示例输入数据来定义更广泛、更易于理解的概念。例如,为了为图像模型定义"卷曲"这一概念,我们可以使用展示卷发和纹理的图像集合。请注意,这些示例不必是原始训练数据的一部分;用户可以提供新的数据来定义概念。使用这样的示例已被证明是让专家和非专家都能与模型互动和理解模型的有效方法。
CAVs 允许我们根据与特定概念的关联对示例(如图像)进行排列。这种可视化的确认有助于确保 CAVs 准确地表示所意图的概念。由于 CAV 表示模型内部表示中某个概念的方向,我们可以计算一组图像与 CAV 之间的余弦相似度,以此对它们进行排序。需要注意的是,排序所用的图像并未用于训练 CAV。图 9-14 通过两个概念(CEO 和模特女性)说明了如何根据与每个概念的相似度对图像进行排序。
左侧是根据从一个更抽象概念"CEO"(从 ImageNet 中收集)学习的 CAV 排序的条纹图像。最上面的三幅图像与 CEO 概念最相似,看起来像细条纹,这可能与 CEO 穿的领带或西装有关,这也印证了 CEO 更有可能穿细条纹而不是水平条纹的观点。
右侧是根据"模特女性"CAV 排序的领带图像。最上面的三幅图像与女性模特的概念最相似,但最下面的三幅图像显示了男性佩戴领带的情况。这也表明,CAV 可以用作一个独立的相似度排序器,将图像排序,以揭示从中学习 CAV 的示例图像中是否存在偏见。
AI 解释
基于云的工具和服务在解释模型结果方面也非常有价值。现在让我们来看其中之一------Google 的 AI Explanations 服务。
AI Explanations 将特征归因集成到 Google 的 AI 平台预测服务中。AI Explanations 帮助你理解模型在分类和回归任务中的输出。每当你在 AI 平台上请求预测时,AI Explanations 会告诉你数据中的每个特征对预测结果的贡献有多大。你可以使用这些信息来验证模型是否按预期运行,识别模型中的偏见,并获得改进模型和训练数据的思路。
特征归因指示了每个特征对每个给定预测的贡献。当你使用 AI 平台预测从模型中请求预测时,你通常只得到预测结果。然而,当你请求解释时,你会同时得到预测结果和这些预测的特征归因信息。还有一些可视化图表提供,帮助你理解特征归因。
AI Explanations 目前提供三种特征归因方法,包括采样 Shapley、集成梯度和 XRAI,但这些方法最终都基于 Shapley 值。关于 Shapley,我们已经讨论得足够多了,这里就不再重复,而是来看另外两种方法:集成梯度和 XRAI。
集成梯度
集成梯度是一种使用与 Shapley 值相同公理性质的不同方法来生成特征归因的方法,基于使用梯度,并且在深度网络中应用时,其效率比原始的 Shapley 方法高几个数量级。在集成梯度方法中,沿着积分路径计算预测输出相对于输入特征的梯度。梯度根据可以指定的缩放参数在不同的间隔处计算。对于图像数据,可以将这个缩放参数想象成一个"滑块",将图像的所有像素缩放为黑色。所谓"集成梯度",意味着它们首先被平均在一起,然后计算平均梯度和原始输入的逐元素乘积。集成梯度是 LIT 工具包中包含的技术之一(见第 8 章)。
XRAI
带有排名区域积分的解释(XRAI)方法专注于图像分类。XRAI 方法通过额外的步骤扩展了集成梯度方法,以确定图像中哪些区域对给定的预测贡献最大。
XRAI 使用集成梯度方法对输入图像进行像素级的归因。除了像素级归因,XRAI 还对图像进行过度分割,以创建一个由小区域组成的拼图。XRAI 在每个分段内聚合像素级归因,以确定该分段的归因密度,然后对每个分段进行排序,从最正到最负排列。这确定了图像中哪些区域最显著或对给定的预测贡献最强。
示例:使用 SHAP 探索模型敏感性
生产环境中的机器学习应用需要深入研究模型的敏感性,以避免对模型终端用户造成任何不良意外。正如我们在本章讨论的那样,SHAP 是一个很好的工具,可以用来研究任何机器学习模型,无论其框架如何。
SHAP 支持处理表格数据、文本数据或图像数据的模型。首先,你需要通过以下命令安装 SHAP:
ruby
$ pip install shap
安装 SHAP 后,你可以以多种方式使用它。这里,我们演示了两个最常见的使用案例。
回归模型
假设你有一个回归模型,使用表格输入特征,并预测一个介于 0 到 1 之间的值。你可以使用 SHAP 来研究模型的敏感性,如下所示。
让我们从一个示例模型开始。在这里,我们训练一个线性回归模型来预测糖尿病的可能性:
ini
import shap
from sklearn import linear_model
# 加载糖尿病数据集
X, y = shap.datasets.diabetes(n_points=1000)
# 将数据集划分为训练集和测试集
diabetes_X_train = X[:-20]
diabetes_X_test = X[-20:]
# 将目标划分为训练集和测试集
diabetes_y_train = y[:-20]
diabetes_y_test = y[-20:]
# 创建线性回归对象
regr = linear_model.LinearRegression()
# 使用训练集训练模型
regr.fit(diabetes_X_train, diabetes_y_train)
一旦回归模型训练完成,我们可以使用 SHAP 来测试模型的敏感性。首先,让我们创建一个 SHAP 的解释器对象。该对象统一了 SHAP 库的接口,并帮助生成解释图:
ini
explainer = shap.Explainer(regr, diabetes_X_train)
通过调用解释器对象,可以生成 shap_values
。shap_values
是特定数据集的敏感性表示,在我们的例子中是测试集:
ini
shap_values = explainer(diabetes_X_test)
我们可以通过调用 shap.plots.waterfall
以瀑布图的形式可视化生成的敏感性解释:
css
shap.plots.waterfall(shap_values[0])
图 9-15 中的瀑布图很好地展示了对于给定输入示例,哪个特征对敏感性的影响最大。
这个示例展示了对简单回归模型的敏感性测试。在接下来的部分中,我们将扩展这个示例,检查文本中特定单词标记的重要性。
自然语言处理模型
测量文本中特定单词或标记的影响可以类似于前面的例子进行,但需要对每个文本样本进行标记化处理。
像在之前的示例中一样,让我们定义我们的模型,训练它,或加载一个已训练的模型。在本例中,我们使用预训练的 GPT-2 模型,但你可以使用任何自然语言处理(NLP)模型。加载模型和标记器:
ini
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2", use_fast=True)
model = AutoModelForCausalLM.from_pretrained("gpt2")
注意:加载的标记器和标记 ID 必须与模型训练和部署过程中使用的预处理设置相匹配,这一点非常重要。
现在,让我们使用模型和标记器来创建 SHAP 解释器。模型也可以用预测包装函数来替代,该函数将生成模型的输出:
ini
import shap
explainer = shap.Explainer(model, tokenizer)
创建解释器对象后,我们可以通过使用 shap.plots.text
绘制敏感性图来评估哪个标记对测试句子的影响最大。在我们的例子中,显示出"Machine"、"best" 以及字符"!" 对模型的影响最大:
ini
shap_values = explainer(["Machine learning is the best!"])
shap.plots.text(shap_values)
图 9-16 展示了结果。
总结
在本章中,我们介绍了模型可解释性的重要性。我们还讨论了几种解释模型的技术,以理解模型如何进行预测,并指导模型改进以减少潜在的危害。这包括讨论内在可解释模型架构(如基于树的模型和格子模型)与必须使用事后方法解释的其他模型架构之间的区别。此外,我们介绍了特征重要性、Shapley 值和测试 CAVs 等技术。尽管这是一个不断演变的领域(就像几乎所有的机器学习一样),但本章应该为你在模型解释方面提供了坚实的基础。