使用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,非線性模型,非凸優化,特徵的重要性是不能用一個簡單的『權重』來衡量的。歸根結底這是個模型選擇問題,只能在這個框架下進行。
推薦閱讀: