深度学习可解释性研究(二): Understanding Black-box Predictions via Influence Functions(详细公式推导)

该文章从鲁棒性的角度出发,对深度学习模型的可解释性进行分析,这应该是我目前为止读过最难的一篇文章,有很多公式需要推导理解,有很多细节需要慢慢品味,但文章确实是难得一见的好文章,我会尽可能把我自己的理解写清楚,把公式写明白,但有些地方确实超出我目前的能力范围,可能理解有误,欢迎指出。

假如说,现在我们做了一个图像分类模型,我们在训练集中挑选一个训练样本,添加一些扰动(在这里就是对图像增加噪声,如果是NLP可以是position encoding那样对词向量加一个向量),重新训练模型,观察模型的预测结果(测试集预测准确率)会否出现较大变化,以此分析我们选中的原始样本对于模型的训练学习是否有重要影响,这就是本文的原始想法。

想法很有趣,但真的这样去实现不容易,因为我们每选择删除一个样本,就需要重新训练一次模型,那么有没有办法不搞得那么复杂呢,本文就从影响函数的角度入手,辅助分析。

接下来我主要基于我自己的理解,一步步推导整个文章的分析思路。

对于模型的影响,文章从两个角度进行分析,一个是模型参数的变化,另一个是测试集损失函数的变化,我们先看看如何衡量训练样本扰动对模型参数的变化的影响。

训练样本的扰动对模型参数的影响

第一步,文章定义了模型参数关于某一特定样本的影响函数(influence function),这样,通过影响函数,输入一个样本,函数就会输出一个影响值,然后我们对样本引入扰动,重新计算影响值,两者的差就可认为是样本扰动对模型参数带来的影响。

定义训练样本

z = ( x , y ) z = (x, y) z=(x,y)

其中x是输入,y是真实输出

z δ = ( x + δ , y ) z_{\delta} = (x+\delta , y) zδ=(x+δ,y)

F p a r a m s ( z δ ) − F p a r a m s ( z ) F_{params}(z_{\delta}) - F_{params}(z) Fparams(zδ)Fparams(z)

其中z_delta为扰动后的样本,F_params为关于参数的影响函数。

接下来我们看看文章是如何定义关于参数的影响函数。和Adaboost一样,文章对数据赋予了权重,但默认所有样本的初始权重都为1,此时模型的经验风险为

1 n ∑ i = 1 n L ( z i , θ ) \frac{1}{n} \sum^n_{i=1} L(z_i, \theta) n1i=1nL(zi,θ)

其中n是样本数量,L是损失函数,zi是样本,Theta是模型参数(注意大小写,和后面的theta区分开)。

经验风险是什么不重要,你完全可以把它看成模型的最终损失函数,因而此时模型所求的最优参数就是

θ ^ = a r g m i n θ [ 1 n ∑ i = 1 n L ( z i , θ ) ] \hat \theta = argmin_{\theta} [\frac{1}{n} \sum^n_{i=1} L(z_i, \theta)] θ^=argminθ[n1i=1nL(zi,θ)]

假如改变该样本的权重,然后重新算得的新参数就是

θ ^ ϵ , z = a r g m i n θ [ 1 n ∑ i = 1 n L ( z i , θ ) + ϵ L ( z , θ ) ] \hat \theta_{\epsilon, z} = argmin_{\theta} [\frac{1}{n} \sum^n_{i=1} L(z_i, \theta) + \epsilon L(z, \theta) ] θ^ϵ,z=argminθ[n1i=1nL(zi,θ)+ϵL(z,θ)]

其中theta为权重的改变值。

所谓的影响,文章认为是,权重的改变能给参数带来多大的变化,也就是微分,求参数关于theta的偏导

d θ ^ ϵ , z d ϵ \frac{d \hat \theta_{\epsilon, z}}{d\epsilon} dϵdθ^ϵ,z

最终定义影响函数为

F p a r a m s ( z ) = d θ ^ ϵ , z d ϵ ∣ ϵ = 0 F_{params}(z) = \frac{d \hat \theta_{\epsilon, z}}{d\epsilon} | _{\epsilon=0} Fparams(z)=dϵdθ^ϵ,zϵ=0

影响函数设置theta=0,有几个原因,第一,如果theta不设定一个具体值,那么我们就无法求出某个样本的具体influence value,也就无法进一步分析;第二,theta=0,其实也就是初始状态下的数据分布状况;第三,theta=0,其实就是意味着权重的无穷小变化

到目前为止,我们已经定义了训练样本关于模型参数的影响函数,通过影响函数,我们就能直接算出样本的影响值,进一步分析样本发生扰动时带来的影响值的变化量。

然而有一个问题,上述的求导计算较为复杂,因而文章重点介绍了如何对上述的公式进行近似计算

F p a r a m s ( z ) = d θ ^ ϵ , z d ϵ ∣ ϵ = 0 = − H θ ^ − 1 ▽ θ L ( z , θ ^ ) F_{params}(z) = \frac{d \hat \theta_{\epsilon, z}}{d\epsilon} | _{\epsilon=0}=-H_{\hat \theta} ^{-1} \triangledown _{\theta} L(z, \hat \theta) Fparams(z)=dϵdθ^ϵ,zϵ=0=Hθ^1θL(z,θ^)

其中H是Hessian。

最终,我们就能算出样本扰动带来的影响值的变化。

F p a r a m s ( z δ ) − F p a r a m s ( z ) = − H θ ^ − 1 ( ▽ θ L ( z δ , θ ^ ) − ▽ θ L ( z , θ ^ ) ) F_{params}(z_{\delta} ) -F_{params}(z) = - H_{\hat \theta} ^{-1} ( \triangledown _{\theta} L(z_\delta , \hat\theta ) - \triangledown _{\theta} L(z, \hat\theta)) Fparams(zδ)Fparams(z)=Hθ^1(θL(zδ,θ^)θL(z,θ^))

而通过影响值的变化量,我们就能判断出对模型的参数来说,哪一个训练样本的扰动能带来较大的影响。

训练样本的扰动对测试集损失函数的影响

上面分析了训练样本扰动对模型参数的影响,接下来继续看看对测试集损失函数的影响,其实推导的过程和之前差不多,之前我们已经推导出改变某个训练样本的权重之后的参数Theta,基于新的参数,测试集的loss为

L ( z t e s t , θ ^ ϵ , z ) L(z_{test} , \hat \theta_{\epsilon, z}) L(ztest,θ^ϵ,z)

类似于参数关于权重的影响函数,同样定义测试集损失关于权重的影响函数

F l o s s ( z , z t e s t ) = d L ( z t e s t , θ ^ ϵ , z ) d ϵ ∣ ϵ = 0 F_{loss} (z, z_{test}) = \frac{d L (z_{test}, \hat \theta_{\epsilon, z} )}{d\epsilon} | _{\epsilon=0} Floss(z,ztest)=dϵdL(ztest,θ^ϵ,z)ϵ=0

同样有估计

F l o s s ( z , z t e s t ) = d L ( z t e s t , θ ^ ϵ , z ) d ϵ ∣ ϵ = 0 = − ▽ θ L ( z t e s t , θ ^ ) T H θ ^ − 1 ▽ θ L ( z , θ ^ ) F_{loss} (z, z_{test}) = \frac{d L (z_{test}, \hat \theta_{\epsilon, z} )}{d\epsilon} | _{\epsilon=0} = -\triangledown _{\theta} L(z_{test}, \hat \theta )^T H_{\hat \theta } ^ {-1} \triangledown _{\theta} L(z, \hat \theta ) Floss(z,ztest)=dϵdL(ztest,θ^ϵ,z)ϵ=0=θL(ztest,θ^)THθ^1θL(z,θ^)

最后计算出影响函数之差

F l o s s ( z δ , z t e s t ) − F l o s s ( , z t e s t ) F_{loss} (z_{\delta}, z_{test}) - F_{loss} (, z_{test}) Floss(zδ,ztest)Floss(,ztest)

d L ( z t e s t , θ ^ ϵ , z δ ) d ϵ ∣ ϵ = 0 − d L ( z t e s t , θ ^ ϵ , z ) d ϵ ∣ ϵ = 0 \frac{d L (z_{test}, \hat \theta_{\epsilon, z_{\delta}} )}{d\epsilon} | _{\epsilon=0} - \frac{d L (z_{test}, \hat \theta_{\epsilon, z} )}{d\epsilon} | _{\epsilon=0} dϵdL(ztest,θ^ϵ,zδ)ϵ=0dϵdL(ztest,θ^ϵ,z)ϵ=0

[ − ▽ θ L ( z t e s t , θ ^ ) T H θ ^ − 1 ▽ θ L ( z δ , θ ^ ) ] − [ − ▽ θ L ( z t e s t , θ ^ ) T H θ ^ − 1 ▽ θ L ( z , θ ^ ) ] [-\triangledown _{\theta} L(z_{test}, \hat \theta )^T H_{\hat \theta } ^ {-1} \triangledown _{\theta} L(z_{\delta}, \hat \theta ) ] - [-\triangledown _{\theta} L(z_{test}, \hat \theta )^T H_{\hat \theta } ^ {-1} \triangledown _{\theta} L(z, \hat \theta )] [θL(ztest,θ^)THθ^1θL(zδ,θ^)][θL(ztest,θ^)THθ^1θL(z,θ^)]

合并一下,得到

− ▽ θ L ( z t e s t , θ ^ ) T H θ ^ − 1 [ ▽ θ L ( z δ , θ ^ ) − ▽ θ L ( z , θ ^ ) ] -\triangledown _{\theta} L(z_{test}, \hat \theta )^T H_{\hat \theta } ^ {-1} [\triangledown _{\theta} L(z_{\delta}, \hat \theta ) - \triangledown _{\theta} L(z, \hat \theta )] θL(ztest,θ^)THθ^1[θL(zδ,θ^)θL(z,θ^)]

重点来了,当delta趋于0时,有

▽ θ L ( z δ , θ ^ ) − ▽ θ L ( z , θ ^ ) ≈ [ ▽ x ▽ θ L ( z , θ ^ ) ] δ \triangledown _{\theta} L(z_{\delta}, \hat \theta ) - \triangledown _{\theta} L(z, \hat \theta ) \approx [ \triangledown _{x} \triangledown _{\theta} L(z, \hat \theta) ] \delta θL(zδ,θ^)θL(z,θ^)[xθL(z,θ^)]δ

代回去得到

− ▽ θ L ( z t e s t , θ ^ ) T H θ ^ − 1 [ ▽ x ▽ θ L ( z , θ ^ ) ] δ -\triangledown _{\theta} L(z_{test}, \hat \theta )^T H_{\hat \theta } ^ {-1} [ \triangledown _{x} \triangledown _{\theta} L(z, \hat \theta) ] \delta θL(ztest,θ^)THθ^1[xθL(z,θ^)]δ

注意!注意!注意!和原文式(5)相比,这里推导的结果多出了一个delta

L p e r t . l o s s ( z , z t e s t ) = ▽ δ L ( z t e s t , θ ^ z δ , − z ) ∣ δ = 0 = − ▽ θ L ( z t e s t , θ ^ ) T H θ ^ − 1 [ ▽ x ▽ θ L ( z , θ ^ ) ] L_{pert. loss}(z, z_{test}) = \triangledown _{\delta} L(z_{test}, \hat \theta_{z_{\delta}, -z})|_{\delta = 0} = -\triangledown _{\theta} L(z_{test}, \hat \theta )^T H_{\hat \theta } ^ {-1} [ \triangledown _{x} \triangledown _{\theta} L(z, \hat \theta) ] Lpert.loss(z,ztest)=δL(ztest,θ^zδ,z)δ=0=θL(ztest,θ^)THθ^1[xθL(z,θ^)]

而原文提到

L p e r t . l o s s ( z , z t e s t ) δ L_{pert. loss}(z, z_{test}) \delta Lpert.loss(z,ztest)δ tell us the approximate effect that z → z + δ z \rightarrow z + \delta zz+δ has on the loss at z_test

因此其实上述的推导结果没有任何问题,只是作者选择定义以下函数去衡量样本扰动对测试集损失函数带来的影响

( F l o s s ( z , z t e s t ) − F l o s s ( z δ , z t e s t ) ) δ − 1 ( F_{loss} (z, z_{test}) - F_{loss} (z_{\delta}, z_{test}) ) \delta ^{-1} (Floss(z,ztest)Floss(zδ,ztest))δ1

至于为什么选择上式,我认为主要目的在于

By setting delta in the direction of L p e r t , l o s s ( z , z t e s t ) T L_{pert, loss}(z, z_{test})^T Lpert,loss(z,ztest)T we can construct local perturbations of z that maximally increase the loss at z_test

也就是adversarial training examples方面的内容,当然这也只是我个人的理解,可能有偏差,如果有错误,或者有其他见解,欢迎指出。

上述的就是本文的主要思路,通过定义影响函数,计算出某个样本对于模型的参数或者测试集损失函数的影响,进而计算出样本发生扰动时参数与损失函数的变化,从而反推样本在模型学习中的影响,进一步推测模型的学习机制,非常巧妙,非常厉害。

文章后面还进一步分析了影响函数的应用,有兴趣的可以看看原文。

我整理了深度学习可解释性的一些论文,可在github下载:DeepLearningInterpretability

你可能感兴趣的:(可解释性)