DeepLIFT(Rescale 规则)对 P-NET 做逐层归因
DeepLIFT
00 Remarks
论文在"模型 → 生物学发现"这一环节使用 DeepLIFT(Shrikumar et al.)的 Rescale 规则, 而不是普通的梯度显著性方法。原因在于:当激活函数进入饱和区(例如 tanh 的平坦段)时 梯度趋近于 0,会把重要特征错误地判定为"无贡献";而 DeepLIFT 使用差分乘数
m_(Δy/Δx) = (y - y0) / (x - x0)
代替梯度,即使在饱和区也非零。
具体到 P-NET 的掩码层,记 Δz_i = z_i - z0_i、Δa_j = a_j - a0_j, 则由链式法则 m_(Δt/Δa_i) · m_(Δa_i/Δz_i) = C_i / Δz_i 可以把 Rescale 规则化简为
C_j^(l-1) = Δa_j^(l-1) · Σ_i [ C_i^(l) · W_eff[j, i] / Δz_i^(l) ]
也就是"以线性贡献 W_eff[j,i] · Δa_j 占 Δz_i 的比例来分摊 C_i"。 该形式天然满足守恒性:
Σ_j C_j^(l-1) = Σ_i (C_i / Δz_i) · Σ_j W_eff[j,i] · Δa_j = Σ_i C_i
由于 P-NET 在每一个隐藏层都挂了一个预测头,且最终输出为各头概率的平均值 p = (1/L) Σ_l σ(z_l),所以 Δp = (1/L) Σ_l Δp_l 精确成立。 因此第 l 条链路所承担的份额为 (1/L) · Δp_l, 自顶向下反传时每一层都要把来自更深层链路的贡献累加进来, 最终在输入层上恰好满足 Σ C = Δp —— 这就是 DeepLIFT 的可加性守恒性质。
参考态 x0 默认取全零向量,即"该患者身上没有任何基因组改变"这一生物学基线。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| Attribute | 1 | 对给定样本做 DeepLIFT 归因 |
| HeadContribution | 1 | 把某一个预测头所承担的份额按照线性贡献的比例分摊到它所挂载的隐藏层节点上 |
| PropagateDown | 1 | 把某一层的贡献分数继续向下反传到更精细的一层 |
| Diff | 1 | 计算两个形状相同的矩阵之差,结果为锯齿数组 [行][列] |
| DiffVector | 1 | 把单列矩阵转换为锯齿数组 |
| ToJagged | 1 | 把矩阵复制为锯齿数组 [行][列] |
| AddInto | 1 | 把增量数组原地累加到目标数组之上 |
03 Fields
| Name | Overloads | Summary |
|---|---|---|
| ZeroTolerance | 2 | 判断差值是否可以视作零的阈值(1e-12),用于规避除零 |
04 Members
对给定样本做 DeepLIFT 归因
| Name | Type | Description |
|---|---|---|
model | PNETModel | 训练完成的 P-NET 模型 |
x | Tensor | 样本特征矩阵,形状为 [N, inputSize] |
reference | Tensor | 参考态输入矩阵;取 Nothing 时使用全零矩阵, 即"没有任何基因组改变"的基线状态 |
labels | Double() | 样本标签数组,仅用于后续的分组激活分析,可以为 Nothing |
归因结果对象
把某一个预测头所承担的份额按照线性贡献的比例分摊到它所挂载的隐藏层节点上
把某一层的贡献分数继续向下反传到更精细的一层
| Name | Type | Description |
|---|---|---|
layer | MaskedDenseLayer | 当前层(贡献分数所在的层) |
deltaChild | Double()() | 更精细一层的激活值差分,索引为 [样本][子节点] |
contribution | Double()() | 当前层节点的贡献分数,索引为 [样本][父节点] |
deltaZ | Double()() | 当前层的线性变换差分,索引为 [样本][父节点] |
更精细一层的贡献分数,索引为 [样本][子节点]
Tensor, Tensor)计算两个形状相同的矩阵之差,结果为锯齿数组 [行][列]
Tensor, Tensor)把单列矩阵转换为锯齿数组
Tensor)把矩阵复制为锯齿数组 [行][列]
Double()(), Double()())把增量数组原地累加到目标数组之上
判断差值是否可以视作零的阈值(1e-12),用于规避除零