深度神经网络中的敏感性分析

机器算法验证 神经网络 Python 特征选择 敏感性分析
2022-03-04 21:12:11

根据已经回答的问题(从一层前馈网络中提取权重重要性),我正在寻找关于神经网络中输入相关性的推断。

考虑到深度网络,通过从感兴趣的输出节点向后遍历层来重建输入重要性可能很困难或很耗时,我想知道是否有一些理论框架可以对神经网络进行敏感性分析,基本上稍微改变一下输入并考虑感兴趣的输出节点如何变化。

是否有在神经网络中执行某种敏感性分析的规范方法?

我真的很欢迎一些 Python 代码这样做,如果有的话

1个回答

您建议的敏感性分析对应于检查输出相对于输入的偏导数。假设输出向量给出,其中是输入向量,是网络实现的函数。输出 wrt 输入的雅可比行列式是:yRmy=f(x)xRdf

Jij(x)=xjfi(x)

Jacobian 给出了每个输出对每个输入的局部变化率,因此它告诉我们将如何响应无穷小的扰动。如果我们从输入开始并向第个输入添加一个无穷小值,我们期望第个输出增加fxΔjiΔJij(x)

如果的幅度很大,则意味着输出附近的输入敏感。因为通常是非线性的,所以这种灵敏度的概念取决于输入;在某些地区它可能很大,而在其他地区则接近于零。如果您想要某种关于输出对输入的依赖程度的汇总度量,则必须汇总多个输入值。例如,您可以取雅可比行列式的绝对值,对训练集中的所有输入进行平均(作为输入的基础分布的期望值的替代值)。当然,这种总结最终会丢弃信息,因此在某些情况下可能会产生误导。Jij(x)ijxf

您可以使用链式法则推导出雅可比行列式的表达式,类似于您如何使用反向传播的参数推导损失函数的梯度。您还可以使用自动微分计算它,使用 Theano、TensorFlow 等库。没有太多理由执行有限差分(即实际模拟扰动并测量输出变化),除非您的网络实现的功能是不可微分的(在这种情况下,雅可比不存在)。

几个警告:如果输入的单位/比例不同,灵敏度也会有不同的单位/比例,不能直接比较。标准化/缩放输入是一种可能的解决方案。同样重要的是要记住,这种类型的分析告诉我们模型本身,但不一定是生成数据的基础分布。例如,如果两个输入相关,模型可能最终使用第一个而不是第二个。在这种情况下,我们会发现第一个输入的灵敏度高而第二个输入的灵敏度低,但不应断定第一个输入本质上对于预测输出更重要。

这篇文章应该很有趣。