deeplift
DeepLIFT(Deep Learning Important FeaTures)是一款专为深度学习模型设计的可解释性分析工具,旨在帮助用户理解神经网络是如何做出预测的。它通过“传播激活差异”的核心算法,将模型的输出归因到各个输入特征上,从而量化每个输入对最终结果的贡献程度。
该工具主要解决了深度学习模型“黑盒”难题,让开发者能够清晰地看到哪些输入特征(如图像中的像素或文本中的词语)推动了模型的决策,以及哪些特征起到了抑制作用。除了核心的 DeepLIFT 算法外,它还集成了梯度、引导反向传播(Guided Backprop)和积分梯度(Integrated Gradients)等多种主流归因方法,方便进行对比分析。
DeepLIFT 特别适合 AI 研究人员、数据科学家以及需要调试和优化模型的深度学习开发者使用。其独特的技术亮点在于引入了“参考值”概念,通过比较当前输入与参考状态的差异来计算贡献分数,这比单纯的梯度方法能提供更丰富的信息(包括负向贡献)。虽然目前官方版本主要支持基于 Keras 和 TensorFlow 的模型,但其提供的理论思路和代码实现对于探索模型内部机制具有极高的参考价值,是提升模型透明度和可信度的得力助手。
使用场景
某生物信息学团队正在利用深度学习模型分析 DNA 序列,试图精准定位导致特定遗传疾病的突变位点。
没有 deeplift 时
- 模型虽然能高精度预测致病风险,但研究人员完全无法理解是哪些具体的碱基对结果产生了关键影响,模型如同“黑盒”。
- 尝试使用传统梯度法解释时,受限于神经元饱和问题,许多实际重要的特征被错误地标记为零贡献,导致漏掉关键突变点。
- 缺乏有效的归因手段使得团队难以向临床医生解释预测依据,严重阻碍了研究成果在医疗诊断中的落地应用。
- 只能依靠耗时耗力的手动突变实验来验证特征重要性,研发周期被大幅拉长。
使用 deeplift 后
- 通过传播激活差异,deeplift 成功量化了每个输入碱基相对于参考序列的贡献分数,清晰揭示了驱动预测的核心基因片段。
- 有效解决了梯度消失导致的特征遗漏问题,即使在不敏感的饱和区域也能准确捕捉到具有生物学意义的微弱信号。
- 生成的可视化热力图直观展示了致病位点,让团队能够迅速构建令人信服的证据链,顺利通过与医学专家的合作评审。
- 自动化的高精度特征筛选替代了部分盲目实验,将候选突变位的验证效率提升了数倍,显著缩短了发现周期。
deeplift 通过提供可信赖的特征归因分析,成功打破了生物医学深度学习模型的可解释性壁垒,让算法决策变得透明且具说服力。
运行环境要求
- 未说明
未说明
未说明

快速开始
DeepLIFT:深度学习重要特征
此版本的DeepLIFT已使用Keras 2.2.4和TensorFlow 1.14.0进行测试。有关其他可能适用于不同版本的TensorFlow/PyTorch以及更广泛架构的DeepLIFT实现,请参阅此常见问题解答。旧版本请查看标签。
本仓库实现了Shrikumar、Greenside和Kundaje在《通过传播激活差异学习重要特征》(arXiv:1704.02685)中提出的方法,以及其他常用方法,如梯度、梯度乘以输入(等价于ReLU网络的逐层相关性传播的一种形式)、引导反向传播和积分梯度。
以下是ICML会议上15分钟演讲的幻灯片和视频链接。这里是更长系列视频教程的链接。如有疑问,请参阅常见问题解答,并提交GitHub问题。
注意:在运行DeepLIFT处理某些计算机视觉任务时,如果您计算的是较高卷积层的贡献分数,而不是输入像素的贡献分数,可能会获得更好的结果。请使用参数find_scores_layer_idx来指定要计算分数的层。
请注意,确定最佳参考仍然是一个开放问题。欢迎提供针对不同应用的良好启发式方法建议。 同时,您可以查看此GitHub问题以获取一般性思路:https://github.com/kundajelab/deeplift/issues/104
请随时关注本仓库,以了解最新更新。
目录
- 安装
- 快速入门
- 示例
- 常见问题解答
- 能否简要解释一下DeepLIFT的工作原理?
- 我的模型架构不被此DeepLIFT实现支持。我该怎么办?
- Ancona等人在ICLR 2018提出的DeepExplain中的DeepLIFT类似实现与SHAP库中的DeepSHAP/DeepExplainer之间有哪些异同?
- DeepLIFT与积分梯度相比如何?
- 本仓库中的实现与Poerner等人在ACL 2018中提出的DeepLIFT实现有何不同?
- 您是否支持非Keras模型?
- 负分意味着什么?
- 如何提供参考参数?
- 我应该使用什么作为参考?
- 如何了解某个输入在整个数据集中的总体贡献程度?
- 我可以有多个输入模式吗?
- 我可以同时获取多个输入层的贡献分数吗?
- 许可证是什么?
- 我听说DeepLIFT可以进行模式发现——这是真的吗?
- 联系方式
- 内部机制
安装
DeepLIFT已在PyPI上发布,因此可以使用pip进行安装:
pip install deeplift
如果您希望对代码进行修改,建议克隆仓库并使用--editable标志进行安装。
git clone https://github.com/kundajelab/deeplift.git #克隆deeplift仓库
pip install --editable deeplift/ #从克隆的仓库中安装deeplift。“editable”标志表示对代码的更改会自动生效。
虽然DeepLIFT不要求您的模型必须使用特定的深度学习框架训练,但我们提供了自动转换函数,可将使用Keras训练的模型转换为DeepLIFT格式。如果您使用了其他框架训练模型,仍可通过使用DeepLIFT层重新构建模型来使用DeepLIFT。
此版本的DeepLIFT已在TensorFlow 1.7上进行了测试,自动转换功能则使用Keras 2.0进行了测试。
快速入门
这些示例展示了如何自动转换 Keras 模型并获取重要性得分。如果非 Keras 模型以 Keras 2.0 格式保存,也可以将其转换为 DeepLIFT 格式。
# 转换一个 Keras 顺序模型
import deeplift
from deeplift.conversion import kerasapi_conversion as kc
# NonlinearMxtsMode 定义了计算重要性得分的方法。
# NonlinearMxtsMode.DeepLIFT_GenomicsDefault 在 Dense 层使用 RevealCancel 规则,
# 在卷积层使用 Rescale 规则(具体原因请参阅论文)。
# 其他支持的值包括:
# NonlinearMxtsMode.RevealCancel - 所有层都使用 DeepLIFT-RevealCancel(用于 MNIST 示例)
# NonlinearMxtsMode.Rescale - 所有层都使用 DeepLIFT-rescale
# NonlinearMxtsMode.Gradient - “乘数”将与梯度相同
# NonlinearMxtsMode.GuidedBackprop - “乘数”将是引导反向传播的结果
# 使用 deeplift.util.get_integrated_gradients_function 计算积分梯度
# 如有任何疑问,请随时发送邮件至 avanti [dot] shrikumar@gmail.com
deeplift_model =\
kc.convert_model_from_saved_files(
saved_hdf5_file_path,
nonlinear_mxts_mode=deeplift.layers.NonlinearMxtsMode.DeepLIFT_GenomicsDefault)
# 指定要计算重要性得分的层的索引。
# 在下面的示例中,我们为输入层计算得分,该层在 deeplift_model.get_layers() 中的索引为 0。
find_scores_layer_idx = 0
# 编译计算贡献得分的函数
# 对于 sigmoid 或 softmax 输出,target_layer_idx 应设置为 -2(默认值)。这会计算关于 logits 的解释。(理由请参阅 https://arxiv.org/abs/1704.02685 中的“3.6 目标层的选择”)
# 对于具有线性输出的回归任务,target_layer_idx 应设置为 -1(即最后一层)。
# 注意,在 softmax 输出的情况下,最好对 softmax logits 进行归一化,使其在所有任务上之和为零。这样可以确保如果某个特征对所有 softmax logits 的贡献相等,它实际上不会对任何任务产生影响(向 softmax 的所有 logits 加上一个常数并不会改变输出)。这一点在 https://github.com/kundajelab/deeplift/issues/116 中有所讨论。一种高效实现这种归一化的办法是按照 https://arxiv.org/pdf/1605.01713.pdf (“关于 Softmax 激活的一点说明”) 第 2.5 节公式 21 的方法,对进入 Softmax 层的权重进行均值归一化。
# 如果您想要的是 DeepLIFT 乘数而不是贡献得分,可以使用 get_target_multipliers_func。
deeplift_contribs_func = deeplift_model.get_target_contribs_func(
find_scores_layer_idx=find_scores_layer_idx,
target_layer_idx=-1)
# 您还可以为 find_scores_layer_idx 提供一个索引数组,以便一次性获取多个层的得分。
# 在输入数据上计算得分
# input_data_list 是一个包含不同输入层数据的列表。
# 例如:对于 MNIST,只有一个输入层,其维度为 1 x 28 x 28。
# 在下面的示例中,假设 X 是一个维度为 n x 1 x 28 x 28 的数组,其中 n 是样本数量。
# task_idx 表示我们希望计算得分的输出层节点的索引。
# 例如:如果输出是一个 10 类的 softmax,且 task_idx 为 0,则我们将计算第一个 softmax 类别的得分。
scores = np.array(deeplift_contribs_func(task_idx=0,
input_data_list=[X],
batch_size=10,
progress_update=1000))
此方法适用于包含密集层和/或 conv1d/conv2d 层以及线性/ReLU/sigmoid/softmax 或 prelu 激活函数的顺序模型。如果您希望支持其他类型的层,请创建一个 GitHub 问题或发送电子邮件至 avanti [dot] shrikumar@gmail.com 阅读自述文件。
使用函数式模型的语法类似;您可以使用 deeplift_model.get_name_to_layer().keys() 来获取层名称列表,从而确定如何指定 find_scores_layer_name 和 pre_activation_target_layer_name:
deeplift_model =\
kc.convert_model_from_saved_files(
saved_hdf5_file_path,
nonlinear_mxts_mode=deeplift.layers.NonlinearMxtsMode.DeepLIFT_GenomicsDefault)
# 下面获取得分的语法与转换后的图模型类似。
# 请查看 deeplift_model.get_name_to_layer().keys() 以了解所有层名。
# 同样,您可以为 find_scores_layer_name 提供一个名称数组,
# 以同时获取多个层的得分。
deeplift_contribs_func = deeplift_model.get_target_contribs_func(
find_scores_layer_name="name_of_input_layer",
pre_activation_target_layer_name="name_goes_here")
示例
复现论文中 MNIST 结果的笔记本位于 examples/mnist/MNIST_replicate_figures.ipynb,而演示如何在具有 1D 卷积的基因组学模型上使用的笔记本位于 examples/genomics/genomics_simulation.ipynb。
常见问题解答
您能否简要介绍一下 DeepLIFT 的工作原理?
ICML 上的 15 分钟演讲提供了该方法的直观理解。以下是幻灯片和视频的链接(视频截取了部分幻灯片,因此幻灯片单独列出)。如有疑问,请提交 GitHub 问题。
我的模型架构不受此 DeepLIFT 实现的支持。我该怎么办?
我的第一个建议是查看 DeepSHAP/DeepExplainer (Lundberg & Lee)、DeepExplain (Ancona 等人) 或 Captum(如果您使用 PyTorch),看看它们是否能满足您的需求。这些工具通过重写梯度运算符来实现,因此支持更广泛的架构。然而,这些实现都不支持 RevealCancel 规则(该规则处理诸如 min 函数之类的失败模式)。DeepSHAP 与 DeepExplain 的优缺点将在下文进一步讨论。如果您确实需要 RevealCancel 规则,请提交一个 GitHub 问题,尽管我目前的精力主要集中在其他项目上,可能暂时无法处理此事。
关于计划使用TF-MoDISco进行基因组学研究的人员请注意:对于DeepSHAP,我维护了一个自定义分支,其中包含了计算假设重要性得分的功能。演示该仓库使用的Colab笔记本位于这里,而我为基因组学编写的DeepSHAP教程则在此链接。
Ancona等人在ICLR 2018提出的DeepExplain与SHAP仓库中的DeepSHAP/DeepExplainer,在类似DeepLIFT的实现上有哪些异同?
DeepExplain(Ancona等)和DeepSHAP/DeepExplainer都通过重写梯度算子来工作,因此能够支持比DeepLIFT仓库涵盖的更广泛架构。事实上,DeepSHAP/DeepExplainer的实现正是受到Ancona等工作的启发,并基于DeepLIFT与SHAP之间的联系——这一联系在SHAP论文中有所描述。对于DeepLIFT论文中提到的一系列架构,即线性矩阵乘法、卷积以及单输入非线性操作(如ReLU),这两种实现与采用Rescale规则的DeepLIFT完全一致。然而,两者都不支持采用RevealCancel规则的DeepLIFT(该规则旨在处理诸如min函数之类的特殊情况,但不幸的是,很难通过重写梯度算子来实现)。其关键区别如下:
(1) DeepExplain对逐元素操作(例如LSTM/GRU/注意力机制中常见的操作)使用标准的梯度反向传播。这可能会破坏“求和等于输出变化量”的属性(即输入特征的重要性之和应等于模型输出相对于参考值的变化量)。如果你的数据包含逐元素操作,建议使用DeepSHAP/DeepExplainer,因为它采用了能保持这一属性的反向传播规则。同样地,当使用非均匀参考时,MaxPooling操作也会面临类似问题(尽管我们在实践中并未遇到显著问题)。DeepSHAP/DeepExplainer通过将信用或责任分配给实际输入中最大值所在的神经元,或者分配给参考值中最大值所在的神经元,从而确保MaxPooling操作满足“求和等于输出变化量”的要求。这与SHAP论文中提出的“Max”归因规则不同;后者在大规模应用时表现不佳。
(2) DeepExplain(Ancona等)不支持DeepLIFT仓库中展示的动态参考机制(即根据输入样本特性生成不同参考的情况,例如基因组学中常用的“二核苷酸随机化”参考)。我已经为DeepSHAP/DeepExplainer实现了动态参考功能(点击此处查看PR链接)。此外,如果你计划将DeepSHAP与TF-MoDISco结合用于基因组学研究,请参阅上述关于我自定义DeepSHAP实现的说明,该实现可用于计算假设重要性得分,并附有教程幻灯片的链接。
(3) DeepSHAP/DeepExplainer的设计允许为单个样本使用多个参考,并对每个参考的重要性得分取平均。然而,目前的实现方式是:每个GPU批次仅针对一个样本计算所有参考的重要性得分(见此处代码段)。这意味着,当样本数量较多而参考较少时,DeepSHAP/DeepExplainer的运行速度可能会较慢。相比之下,DeepExplain(Ancona等)的设计则是用户只需提供一个参考,该参考会被应用于所有样本。因此,DeepExplain允许在不同样本之间进行GPU批处理,但无法在不同参考之间进行GPU批处理。
综上所述,我的建议是:如果你的数据包含逐元素操作(如GRU/LSTM/注意力机制)、需要动态参考,或者参考数量远多于样本数量,则应选择DeepSHAP;而当样本数量远大于参考数量时,则可选用DeepExplain。
本仓库中的实现与Poerner等人在ACL 2018中提出的DeepLIFT实现相比如何?
Poerner等人进行了一系列基准测试,比较了DeepLIFT与其他解释方法在自然语言处理任务上的表现。他们的实现与经典的DeepLIFT实现主要有两点不同。首先,他们只考虑了DeepLIFT的Rescale规则(具体实现见此处)。其次,为了处理涉及门控单元的乘法运算(这是DeepLIFT原本未设计应对的情形),他们将门控神经元视为权重(类似于Arras等人的做法),并将全部重要性归于非门控神经元。需要注意的是,这与DeepSHAP/DeepExplainer的实现不同;后者采用基于SHAP的反向传播规则来处理逐元素乘法,并会将重要性分配给门控神经元。我们尚未深入研究Arras等人的方法是否合适,但作者们发现:“LIMSSE、LRP(Bach等人,2015年)和DeepLIFT(Shrikumar等人,2017年)是最有效的解释方法(第4节);其中LRP和DeepLIFT最为稳定,而LIMSSE则在混合文档实验中胜出。”(他们并未将DeepSHAP/DeepExplainer纳入比较)
DeepLIFT与积分梯度相比如何?
正如 DeepLIFT 论文中所展示的那样,DeepLIFT 的 RevealCancel 规则能够使 DeepLIFT 正确处理积分梯度可能给出误导性结果的情况。独立研究人员发现,仅使用 Rescale 规则的 DeepLIFT 表现与积分梯度相当(他们写道:“积分梯度和 DeepLIFT 之间具有非常高的相关性,这表明后者在实践中是前者的良好(且更快)近似”)。他们的发现与我们自身的经验一致。当使用一组参考输入时,DeepLIFT 相对于积分梯度的速度优势尤为明显,因为每个样本都有一组参考输入会显著增加运行时间。
您是否支持非 Keras 模型?
目前我们还不支持。不过,如果您能将模型转换为 Keras 2 API 使用的保存文件格式,那么您可以使用本分支将其加载到 DeepLIFT 格式中。有关如何实现这一点的灵感,可以查看 examples/convert_models/keras1.2to2 中的笔记本,它演示了如何将以 keras1.2 格式保存的模型转换为 Keras 2 格式。DeepLIFT 的转换可以直接从 Keras 保存的文件进行,而无需实际将模型加载到 Keras 中。如果您有一个 PyTorch 模型,您可能也会对 [Captum 实现](#我的模型架构不被此 DeepLIFT 实现支持,我该怎么做)感兴趣。
负分值意味着什么?
输入的负贡献分数表示该输入促使输出低于其参考值,这里的参考值是指在提供参考输入时输出所具有的值。负贡献并不意味着该输入“不重要”。如果您想找出 DeepLIFT 认为“不重要”的输入(即 DeepLIFT 认为它们对模型输出影响不大),那么这些输入的贡献分数应该接近于零。
如何提供参考参数?
就像您向评分函数提供 input_data_list 参数一样,您也可以提供 input_references_list。它的维度应与 input_data_list 相同,但其中包含每个输入对应的参考图像。
我应该使用什么作为参考?
参考的选择取决于您希望从数据中解答的问题。一般来说,参考应保留您不关心的属性,并打乱您关心的属性。在 DeepLIFT 论文的补充材料中,附录 L 探讨了使用两种不同参考对 CIFAR10 模型的结果。您会注意到,当使用模糊版本的输入作为参考时,物体的轮廓会更加突出;而当使用黑色参考时,结果则显得更加混乱,这可能是由于网络也在强调颜色信息所致。如果您心中已有特定的参考,最好检查一下模型在该参考上的输出是否符合您的预期。另一个可以考虑的做法是使用多个不同的参考来解释同一张图片,并对所有参考的结果取平均值。我们在基因组学研究中就采用了这种方法:我们通过随机打乱输入序列来为每个序列生成一组参考(这在基因组学示例笔记本中有所演示)。
我如何了解某个输入在所有样本中的总体贡献程度?
对各个样本的 DeepLIFT贡献分数求平均是可行的。需要注意的是,您的数据可能存在较大的异质性(即某些输入可能只对部分样本非常重要,而对其他样本则不然;有些输入可能在某些样本上产生正向贡献,而在另一些样本上则产生负向贡献),因此聚类分析可能会比简单求平均更有启发性。对于特征选择而言,一个合理的启发式方法是按照 DeepLIFT贡献分数的平均绝对值大小对输入进行降序排序。
我可以有多个输入模式吗?
是的。您可以不再向 input_data_list 提供单个 NumPy 数组,而是提供一个包含各模式输入的 NumPy 数组列表。您也可以向 input_data_list 提供一个字典,其中键为模式名称,值为相应的 NumPy 数组。每个 NumPy 数组的第一个轴应为样本轴。
我能否同时获取多个输入层的贡献分数?
也可以。只需向 find_scores_layer_name 提供一个列表,而不是单个参数。
该软件的许可证是什么?
MIT 许可证。尽管我们最初曾为我们的一些可解释性工作申请过专利,但我们后来已放弃该专利,因为该项目似乎已经引起了社区的足够兴趣,以开源形式发布更为合适。
我听说 DeepLIFT 可以进行模式发现——这是真的吗?
您可能指的是 TF-MoDISco。这里是该代码的链接。
联系方式
如有任何问题、想法、功能请求等,请发送邮件至 avanti [dot] shrikumar [at] gmail.com。如果我没有回复,请继续给我发邮件,直到我感到不好意思并作出回应为止。您也可以随时联系我的导师(anshul [at] kundaje [dot] net),他可以帮助督促我尽快回复。我保证我确实愿意回复,只是目前忙于其他事务,因为学术界的激励机制并不鼓励维护项目。
内部原理
本节将解释 DeepLift 实现中的一些更细致的方面。
层
层(deeplift.layers.core.Layer)是基本单元。deeplift.layers.core.Dense 和 deeplift.layers.convolution.Conv2D 都是层的实例。
层实现了以下关键方法:
get_activation_vars()
返回表示该层激活值的符号变量。关于符号变量的详细信息,请参阅 Theano 或 TensorFlow 等符号计算库的文档。
get_pos_mxts() 和 get_neg_mxts()
返回表示该层上正/负乘数的符号变量(针对选定的输出)。详情请参阅论文。
get_target_contrib_vars()
返回表示重要性分数的符号变量。这是一个便捷函数,其结果为 self.get_pos_mxts()*self._pos_contribs() + self.get_neg_mxts()*self._neg_contribs()。详情请参阅论文。
前向传播
以下是实现前向传播所需的步骤。如果操作正确,结果应与原始模型的前向传播结果在数值精度范围内完全一致,因此务必将其作为一项合理性检查来执行。请注意,如果自动转换(如快速入门中所述)可用,则可以跳过步骤 (1) 和 (2)。
- 为网络中的每一层创建一个层对象。
- 通过
set_inputs函数告知每层其输入。set_inputs的参数取决于该层的期望:- 如果该层只有一个输入层(例如全连接层),则参数就是该输入层。
- 如果该层有多个输入层,则参数取决于具体实现;例如,对于拼接层,参数是一个包含多个层的列表。
- 当所有层都与其输入连接后,即可使用
deeplift.backend.function([input_layer.get_activation_vars()...], output_layer.get_activation_vars())编译前向传播函数。- 如果您正在使用自动转换生成的模型,可以通过
model.get_layers()访问顺序模型中的各个层(该函数将返回一个层列表),或通过model.get_name_to_layer()访问图模型中的各个层(该函数将返回一个字典,将层名称映射到层对象)。 - 第一个参数是表示网络输入的符号张量列表。如果网络只有一个输入层,则此列表仅包含一个张量。
- 第二个参数是函数的输出。在上述示例中,它是一个张量,但如果需要获取多个层的输出,也可以是一个张量列表。
- 如果您正在使用自动转换生成的模型,可以通过
- 函数编译完成后,可以使用
deeplift.util.run_function_in_batches(func, input_data_list)以批处理方式运行该函数(如果您要对大量无法一次性加载到内存中的输入调用该函数,建议采用此方法)。func即由deeplift.backend.function返回的已编译函数。input_data_list是一个包含网络不同输入层数据的 NumPy 数组列表。对于只有一个输入的网络,此列表将只包含一个 NumPy 数组。run_function_in_batches的可选参数包括batch_size和progress_update。
反向传播
以下是实现反向传播所需的步骤,反向传播是计算重要性分数的地方。理想情况下,您应该通过快速入门中描述的自动转换创建模型,然后使用 model.get_target_contribs_func 或 model.get_target_multipliers_func。然而,如果这不可行,请继续阅读(也请考虑向我们发送消息告知我们,因为如果有足够的需求,我们会考虑添加此功能)。请注意,以下说明假定您已完成前向传播部分中的步骤 (1) 和 (2)。
对于您希望计算重要性分数的层,请调用
reset_mxts_updated()。这会重置用于计算乘数的符号变量。如果这是您首次编译反向传播函数,则此步骤并非严格必要。对于包含将用于计算重要性分数的神经元的输出层,请调用
set_scoring_mode(deeplift.layers.ScoringMode.OneAndZeros)。- 简而言之,此评分模式用于当我们希望针对单个目标神经元计算分数时。未来可能会添加其他类型的评分模式(例如神经元之间的差异)。
- 需要澄清的是:当我们最终编译函数时,每次调用该函数都将只为单个层中的单个输出神经元计算分数。具体的神经元和层可以在稍后运行时切换。目前,在此步骤中,您应对所有可能希望计算分数的目标层调用
set_scoring_mode,这样可以避免日后为了允许不同的目标层而重新编译函数。 - 对于 Sigmoid/Softmax 输出层,您应使用的输出层是位于最终非线性激活之前的线性层(通常是全连接层)。有关理由,请参阅论文中的“3.6 目标层的选择”。如果不存在最终非线性层(例如在许多回归任务中),则输出层应为最后一个线性层。
- 对于 Softmax 输出,您可能需要按照论文第 3.6 节“针对 Softmax 层的调整”中所述,减去对所有 Softmax 类别的平均贡献。如果您的 Softmax 类别数量非常大,并且您不想为每个示例单独计算每个类别的贡献,请联系我(avanti [dot] shrikumar@gmail.com),我可以实现一种更高效的计算方法(目前已有方案,但尚未编码)。
对于您希望计算重要性分数的层,请调用
update_mxts()。这将创建用于计算与步骤 2 中指定层相关乘数的符号变量。使用以下代码编译重要性分数计算函数:
deeplift.backend.function([input_layer.get_activation_vars()..., input_layer.get_reference_vars()...], layer_to_find_scores_for.get_target_contrib_vars())- 第一个参数代表函数的输入,应为每个输入层激活的单个符号张量列表(与前向传播相同),后接每个输入层参考值的单个符号张量列表。
- 第二个参数代表函数的输出。在上述示例中,它是一个包含单个层重要性分数的张量,但如果您希望一次计算多个层的分数,也可以使用张量列表。
- 除了返回重要性分数的
get_target_contrib_vars()(在NonlinearMxtsMode.DeepLIFT情况下称为“贡献分数”)之外,您还可以使用get_pos_mxts()或get_neg_mxts()来获取乘数。
现在您可以调用函数来计算重要性分数了。
- 通过调用层上的
set_active()来选择特定的输出层,以计算其重要性分数。 - 通过调用层上的
update_task_index(task_idx)来选择层内的特定目标神经元。其中task_idx是该神经元在层中的索引。 - 调用步骤 4 中编译的函数,以计算目标神经元的重要性分数。有关如何使用
deeplift.util.run_function_in_batches的提示,请参阅前向传播部分的步骤 4。 - 通过调用层上的
set_inactive()来取消选择该输出层。切勿忘记! - (是的,我将在某个时候将所有这些步骤整合到一个函数中)
- 通过调用层上的
版本历史
v0.6.13.0-alpha2020/11/11v0.6.12.0-alpha2020/08/18v0.6.10.0-alpha2020/01/26v0.6.9.3-alpha2020/01/14v0.6.9.2-alpha2020/01/07v0.6.9.1-alpha2019/10/18v0.6.9.02019/03/08v0.6.8.1-alpha2018/12/12v0.6.7.1-alpha2018/09/14v0.6.7.0-alpha2018/08/27v0.6.6.2-alpha2018/08/20v0.6.6.1-alpha2018/08/20v0.6.6-alpha2018/07/13v0.6.5-alpha2018/07/12v0.6.4-alpha2018/07/04v0.5.5-theano2018/07/04v0.6.2-alpha2018/06/05v0.5.1-theano2017/04/23v0.4.0-alpha2016/12/12v0.3-alpha2016/11/01常见问题
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。