使用DNN训练神经网路模型时,如何知道每个特征的重要性(像xgboost模型能计算出特征重要性一样)?
在非图像类的需要用到机器学习演算法的业务背景中,例如电商,需要训练点击率预估(ctr)模型,如果使用xgboost框架来训练ctr模型的话,可以使用model.get_fscore等很容易计算得到每个特征的重要性权重,权重越大,那么该特征对于模型来说越重要。但是随著deep learning火起来之后,在解决同样的ctr问题时,越来越多的从lr,svm,xgboost等机器学习模型转向深度神经网路模型,例如DNN模型,那么问题来了,在dnn模型中,如何知道每个特征有多重要。当特征少时,可能可以通过逐个增加或者减少特征,根据模型的auc或者其他评估指标来判断某个特征到底有多重要,但是当特征很多达到上千维上万维时,这时候通过逐个增加或者减少特征来评估特征重要性的方式显然是不合理的,时间以及计算成本相当高,那么有其他更简单可行的方式吗?
谢不邀,这题我会
Shapley值
定义「重要性」
现在可解释性领域定义「重要性」很多其实用的是Cooperative Game Theory里面的Shapley值[1],具体定义是:
其中
- 是所有feature的set
- 是game的value function,也可以理解为我们这里要解释的模型,如果是多分类模型的话,可以只关注自己想看类别,这样就能变成scalar输出
- 即为 中第 个特征的"重要性「
- 在原Shapley值定义中指 中只有在 中的feature存在,在实际解释机器学习模型中有许多不同的处理方法(因为除了以set作为输入的模型外,很多模型的输入feature的数目是固定的)
几个注意点
- 这里的Shapley值有一些assumption,一般是说输入的feature的independence,有的工作也用conditional distribution,但是这样会有很多问题,具体见The many Shapley values for model explanation[2] 以及Problems with Shapley-value-based explanations as feature importance measures[3](悄悄说一句不是很赞同第二篇)。
- 其他「重要性」的定义
- Core[4]:也是Cooperative Game Theory里面的result,和Shapley在博弈论中几乎同等重要
- Contextual Decomposition[5][6][7]:Bin Yu的学生的一系列成果,著力于把feature之间的interaction和feature本身的两个contribution分开,效果感觉不错
- Integrated Gradient[8]:实际上是基于Aumann-Shapley值[9]的,AS其实是Shapley值在连续设定下的一个延展。
为什么Shapley?
大家主要是看上了它的几个比较好的property,有好几个版本的property的叙述,我就随便挑个version[10]。以下三个性质使得Shapley值有唯一性
- Local accuracy:即所有特征的重要值加上模型本身的bias要等于模型输出
- Missingness:对于任意一个输入 ,如果存在一个特征 , 本身「不存在」(在Baseline Shapley中指 ),那么
- Consistency:如果存在两个模型 和 ,如果对于所有 ,都有 ,对应的重要值也要有
Baseline Shapley
Shapley值在这方面用的比较多,实现的方法也有很多种,这就导致了唯一性在事实上没有了
不用conditional distribution,而用一个reference value, ,来对应每一个feature的absence:
如果 则 ,反之 ,具体优劣在[2]
计算
显然Shapley值(以及Core)的计算复杂度是指数的,需要用DNN解决的问题,特征数目肯定高,目前解决方法(都是近似)有这些:
支持黑箱模型的:
- Shapley Sampling[11]:
- 用定义式来做sampling
- 「除去「feature的办法是从数据集中sample一个instance 然后 中被除去的特征 的值 变成
- Kernel SHAP[10]:
- 用weighted linear regression做sampling,每一个instance 所产生的 , 的权重是: ,linear regression的输入是binary vector,对于每一个 来说,它所对应的binary vector是 其中如果 则 ,反之 。这样linear regression得到的每个对应 的权重即为对应Shapley值
- 上面这个权重公示的证明在[10]链接里的supplemental里面
- Kernel SHAP比Shapley sampling的sampling efficiency高:每一个Shapley sampling的sample按照定义式仅计算一个feature的对应Shapley值,而Kernel SHAP中一个sample计算的是所有feature的Shapley值。
当然还有对应DNN的:
- Deep SHAP[10]:
- 在每一层计算层内的Shapley值,线性层的Shapley值就是输入乘上对应权重。
- 之后用DeepLIFT[12]类似的反向传播演算法(并非微分求导的链式法则),将[12]中multiplier用Shapley值重新定义(见[10]),将reference value定义为
- 这个演算法速度相对快,但是近似效果其实不是很好,日常被吊著打[13]
- Deep Approximated Shapley Propagation[13]:这个演算法还是很厉害的,复杂度应该是多项式级别,近似效果也不错,如果要用Shapley建议用这个
- 仔细观察定义式,我们可以发现,其实对于任意 , 中所有 们的权重是一样的,那我们即可以近似一下特征 对于所有 的影响,即 。
- DASP的想法即是从input开始算distribution,然后通过Assumed Density Filtering (adf)[14]一直传到output,用到的是Lightweight Probabilistic Deep Networks[15]
- 具体操作:
- 如同[15],把原网路的部件全部换成adf版本的
- 第一层有一个骚操作,具体见论文,或者下面repo
- 算出每个 对应的期望,之后接上定义式。(实际操作中对 的取值也可以采样2333)
- DASP的开源repo:
- Keras(官方):https://github.com/marcoancona/DASP
- PyTorch(我前几天写的,很不要脸的放在这儿了):https://github.com/RuiWang1998/Deep-Approximate-Shapley-Propagation,暂时还没有readme,明天加一下
- 这儿:
王睿:ICLR 2021|自解释神经网路—Shapley Explanation Networks?zhuanlan.zhihu.com
对数据有assumption的:
- L-Shapley C-Shapley:对graphical数据做了Markov assumption,具体见[16],做到了线性复杂度。之后有时间会补以下。
在训练中计算重要性
显然上面绝大多数演算法的复杂度都不允许训练中每个pass算一次重要性(有钱人除外),但是如果能算了(比如我们的sub),我们可以在损失函数中加一个regularizer,用来测量特征的重要性和我们人类prior之间的差距(比如图片分类中我们不想要某一个像素变得非常重要,这样的话模型不会很robust),类似的工作有[17][18][7],但是能用到Shapley值的只有我们的工作(Shameless plug)。
参考
- ^a value for n-person games https://books.google.com/books?hl=enlr=id=Pd3TCwAAQBAJoi=fndpg=PA307dq=a+value+for+n-person+gamesots=gswUDc7kw_sig=X_0ZV18OsZxrFpojtTpXlIuJJ7Q#v=onepageq=a
- ^abThe many Shapley values for model explanation https://arxiv.org/abs/1908.08474
- ^Problems with Shapley-value-based explanations as feature importance measures https://arxiv.org/abs/2002.11097
- ^If You Like Shapley Then You』ll Love the Core https://www.semanticscholar.org/paper/If-You-Like-Shapley-Then-You%E2%80%99ll-Love-the-Core-Yan-Procaccia/02e32987366c1ebfcc56d7c2ab822473e4c9032e
- ^Beyond Word Importance: Contextual Decomposition to Extract Interactions from LSTMs https://arxiv.org/abs/1801.05453
- ^Hierarchical interpretations for neural network predictions https://arxiv.org/abs/1806.05337#:~:text=Deep
- ^abInterpretations are useful: penalizing explanations to align neural networks with prior knowledge https://arxiv.org/abs/1909.13584
- ^axiomatic attribution for deep networks. https://arxiv.org/abs/1703.01365
- ^Values of Non-Atomic Games. https://press.princeton.edu/books/hardcover/9780691645469/values-of-non-atomic-games
- ^abcdeA unified approach to interpreting model predictions http://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions
- ^Explaining prediction models and individual predictions with feature contributions https://link.springer.com/article/10.1007/s10115-013-0679-x
- ^abLearning Important Features Through Propagating Activation Differences https://arxiv.org/abs/1704.02685
- ^abExplaining Deep Neural Networks with a Polynomial Time Algorithm for Shapley Values Approximation https://arxiv.org/abs/1903.10992
- ^Tractable inference for com- plex stochastic processes https://arxiv.org/abs/1301.7362
- ^abLightweight Probabilistic Deep Networks https://arxiv.org/abs/1805.11327
- ^L-Shapley and C-Shapley: Efficient Model Interpretation for Structured Data https://openreview.net/forum?id=S1E3Ko09F7
- ^Incorporating priors with feature attribution on text classification http://www.aclweb.org/anthology/P19-1631
- ^Learning explainable models using attribution priors https://arxiv.org/abs/1906.10670
定性的理解一下,如果采用的是CNN结构的网路,如果假定网路结构均匀,那么可以这么说,大致上是网路前端的特征的敏感度更高,后端的敏感度更低。简单说,前端的误差导致更大的误差扩散。
关于特征重要性的分析,可以参考Liang 2017的论文,这个分析其实还是不错的,其实际考察的是网路复杂度以及网路构建的几何空间的结构问题,和Fisher information有紧密联系,对于理解DN的构造很有启发性。
另外,这里说的特征的重要性肯定是要在训练完成的模型上分析,那么针对的就是特定的信息处理流程来进行的。我个人始终认为,DN的核心不在于其局部特征,我们完全可以设计两个结构不同的网路来完成同一个任务,而这两个网路提取的特征可以完全不同,这时候分析某一个网路的某个特征是否重要,我觉得其实是问题的细枝末节了,因为我们还有另外一个系统完全不使用这个特征而同样可以完成任务,那么这时候我们可以说这个特征重要与否么?
现在对于DN的可解释性的工作似乎走入一个误区,大家似乎特别在意某个特定的处理流程是否可解释,是否和我们已有的先验信息相匹配,以及是否我们可以对这个特定流程的处理过程性可靠性稳健性和定量分析,特别是我们关心的医疗领域尤其如此,要求对某个AI处理流程进行有说服力的说明。其实个人认为,这些都有点偏,我们要解释的不是某个特定的处理流程的可解释性,而是DN本身的可解释性,是理解DN自身的结构和动态过程,这要这个过程有可解释性,其训练得到的任何结构就自然具备了可解释性,而没有必要针对每个训练获得的结果进行可解释性的研究。
个人理解,可解释性应该有不同层次,一个是DN动态规律(网路结构和数据结构互动)的可解释性,一个是完成同一个任务的不同解(网路结构和参数)的空间结构的可解释性,一个是某个特定解自身的可解释性。现在的可解释性似乎更多著力在最后一个可解释性上,前面两个更大的课题被忽略了。对我而言,前二者才是可解释性的真正问题所在,最后一个其实是前两个的自然推论。
比如对于过参数化网路结构的解空间的分析就不够充分,我们其实对于这个空间的结构并不清楚,在过参数化过程中解空间的几何结构如何随著参数增加变化并不清楚,解决这个问题其实更重要,现有的分析个人觉得不可靠。
目前我所了解的特征重要性计算方法主要有两个方面:
1.训练过程中计算
训练过程中通过记录特征的分裂总次数、总/平均信息增益来对特征重要性进行量化。例如实际工程中我们会用特征在整个GBDT、XgBoost里面被使用的次数或者带来的总/平均信息增益来给特征重要度打分,最后进行排序。由于本身Ensemble模型在选择特征分裂时带有一定随机性,一般会跑多个模型然后把特征重要性求平均后排序。
2.训练后使用OOB(Out of Bag)数据计算
第二种方式是训练好模型之后,用Out of Bag(或称Test)数据进行特征重要性的量化计算。具体来说,先用训练好的模型对OOB数据进行打分,计算出AUC或其他业务定义的评估指标;接著对OOB数据中的每个特征:
(1)随机shuffle当前特征的取值;
(2)重新对当前数据进行打分,计算评估指标;
(3)计算指标变化率
按照上面方式,对每个特征都会得到一个变化率,最后按照变化率排序来量化特征重要性。
再结合题主说的问题,DNN不像Boosting这类模型那样存在所谓的分裂次数与信息增益,就需要使用第二种方式,对每个特征进行随机shuffle,观察模型指标的变化,最后按照变化率进行排序。比如AUC下滑率,下滑的越多说明当前这个指标越重要。当然,实际操作中需要结合业务经验先指定一个候选变数池,对这部分变数计算重要度,不然计算开销太大。
《可解释机器学习》,中文版已经开源好久了,你值得拥有
first,树模型那个fscore,不一定就真的准,只能部分说明问题;
second,如果你的激活函数全用relu类的,那其实是可以得到每个特征的『权重』的;
last but not the least,非线性模型,非凸优化,特征的重要性是不能用一个简单的『权重』来衡量的。归根结底这是个模型选择问题,只能在这个框架下进行。
推荐阅读: