1. 程式人生 > >神經網路視覺化(Visualization of Neural Network )

神經網路視覺化(Visualization of Neural Network )

神經網路視覺化和可解釋性(Visualization and Explanation of Neural Network )

相對於傳統的ML模型,Deep NN由於其自身所特有的多層非線性的結構而導致難以對其工作原理進行透徹的理解。比如,我們很難理解網路將一個輸入x判斷為某一類別c時,其輸入向量x中的每一個特徵分別對這個結果貢獻了多大,找出哪些輸入特徵起到了關鍵作用,這對判斷網路是否正常工作是很重要的。尤其在NLP領域,由於現在大多數模型的輸入都是稠密的Embedding向量,而每一個維度上的值並沒有一個顯式的含義,這就使得我們很難像影象領域那樣,直接視覺化CNN中的filters,分析網路所學習到的特徵。

1.現有的方法

現有的網路解釋思路大致可以分為兩大類:模型解釋(Interpreting Models)和決策解釋(Explaining Decision)

1.1 Interpreting Models

這類方法的主要解釋手段是: a. find prototypical example of a category 找到一個類別的典型樣本,比如1-10的手寫字型圖片分類,對於類別1, 我們的目的就是找到最能代表數字1的樣本,即找到使分類函式f(x)輸出值最大的x。 b. find pattern maximizing activity of a neuron 找到能夠最大化啟用神經元的pattern,以上邊的例子來說,即找到能夠最大化啟用網路的pixel空間組合方式(比如在手寫數字識別任務中,CNN模型的高層filter裡邊,通常每個pattern對應於一個模糊的數字,如:“1”) 這一類的方法傾向於得到一個整體上的(ensemble)的結論,即找出某個數字(比如“1”)最常見的圖片模式應該是怎樣

1.2 Explaining decisions

a.“why” does the model arrive at this particular prediction 試圖解釋為什麼模型能夠做出這樣的預測,比如,為啥將一張圖片分類為數字“1”而不是其它 b.verify that model behaves as expected 驗證模型是否按期望執行,以上邊的例子來說,當模型將一個輸入x預測為“1”時,起主要作用的特徵(pixels)應該是組成數字“1”的附近的pixels 在這一思路下,大致有兩類方法:Sensitivity Analysis(SA)和Decomposition。

2. SA & Decomposition

為了說明方便,我們先定義幾個符號: 神經網路分類函式:f(x)f(x) 輸入向量:xx 對於最終生成的heatmapping R(x)={Rp(x)}\boldsymbol{R(x)}=\{R_p(x)\}, 接下來,再定義如下性質:

  • 1. Conservative, 即x:f(x)=pRp(x)\forall x: f(x)=\sum_p R_p(x)

這裡粗體的R(x)\boldsymbol{R(x)}表示整個heatmapping的元素集合(可以看做一個向量, 其對應的輸入x\boldsymbol{x}也是一個向量), Rp(x)R_p(x)表示heatmapping上的第pp個元素, 也稱為Relevance, 對應輸入向量中的一個分量xpx_p. Conservative 確保在向後傳播時, 每層所有神經元對應的Relevance之和能夠始終等於最終分類的預測值. 最終 R(x)\boldsymbol{R(x)}將以圖片的形式展示出來,這就是所謂的Visualization了。

  • 2. Positive, 即x,p:Rp(x)0\forall x, p: R_p(x)≥0

這個性質確保heatmapping中的元素不存在相互矛盾的物件, 即某些元素是與最終結果正相關, 某些元素是負相關.這樣做的好處是可以簡化最終的relevance分佈.

最後,同時具備1和2的, 我們就稱之為"一致的"(consistentconsistent), 需要注意的是,consistentconsistent對於heatmapping雖然不是一個硬性的要求, 但滿足一致性條件的heatmapping將具備一系列優良的性質,因此我們的方法要儘可能的符合consistentconsistent約束。

2.1 SA

SA方法,主要原理是通過輸入x對輸出y的影響程度來對x的每一個特徵(分量)進行打分, 通過對打分進行視覺化,最終將形成一張heatmapping.而打分的方法, 使用非常符合直覺的梯度, 即: Rp(x)=(f/xp)2 R_p(x)= (\partial f / \partial x_p )^2 R(x)=​xf(x)2 ∴\boldsymbol{R(x)}=\|\nabla_{\!\boldsymbol{x}} f (\boldsymbol{x})\|^2 有時,為了區分出positive和negative的影響,可以去掉平方運算: Rp(x)=(f/xp) R_p(x)= (\partial f / \partial x_p ) SA方法的優點是實現容易, 很符合直觀感受,但缺點也很明顯:輸出的heatmap只是反映了增加(或減小)對應輸入位置的值對預測結果的影響,並未直接反映出該點輸入值本身對結果的影響。e.g. 當前位置梯度Rp>0R_p>0,而對應的輸入xp<0x_p<0

2.2 Decomposition

2.2.1 LRP Framework

從字面上看,Decomposition就是分解,這種方法的本質也是將最終輸出的Relevance進行分解再向上傳遞。該怎麼分解呢?我們先看下圖的DNN網路結構: 在這裡插入圖片描述 在上圖所示的網路中,最終輸出出值為f(x)f(x), 顯然,對於輸出層而言,其Relevance就為:Rf=f(x)R_f=f(x) 那麼第ll層的第ii個節點的Relevance Ri(l)R_i^{(l)}應該為什麼呢?首先根據性質2, 每層所有節點的Relevance之和應該相等: dRd(1)=kRk(2)=...=iRi(l)=jRj(l+1)=...=Rf \sum_d R_d^{(1)} = \sum_k R_k^{(2)} =...=\sum_i R_i^{(l)}=\sum_j R_j^{(l+1)}=...=R_f 我們可以把Relevance看做一種沿著網路連線流動的資訊,其流動方向為輸出節點到輸入節點,其值總和為RfR_f. 那麼我們可以參考反向傳播的思想,將網路結構倒過來(上圖右), 沿著節點間的子路徑將Relevance逐層分解, 比如從層656 \rightarrow 5 , 這裡我們始終假設ii代表低層神經元的序號,jj代表高層神經元的序號: Rij(5,6)=factorij(5,6)Rj(6) R^{(5, 6)}_{i \leftarrow j} = factor_{ij}^{(5,6)} \cdot R^{(6)}_j 其中factorijfactor_{ij}表示分配因子,是一個介於[0,1]之間的數, 並滿足: ifactorij(5,6)=1 \sum_i factor_{ij}^{(5,6)} = 1 對於任意一個上層神經元, 其輸入zj(l)=Wj(l)a(l1)z^{(l)}_j = W^{(l)}_j a^{(l-1)}, 其中a(l1)a^{(l-1)}為低層神經元的啟用輸出向量. 上層單元j的最終輸出為σ(zj(l))\sigma(z^{(l)}_j). 由於神經元的啟用函式通常為單調遞增函式,所以, 輸入值越大,那麼對應的啟用值也就越大。因此zj(l)z^{(l)}_j的每個分量zij(l)z^{(l)}_{ij}可以看做是每個下層單元ii與上層單元jj之間的Relevance分配因子, 由於還需要滿足歸一化的約束, 我們可以對其除以一個歸一化引數zj(l)z^{(l)}_j: factorij=zij(l)zj(l)=wij(l)ai(l1)iwij(l)ai(l1) factor_{ij} = \frac {z^{(l)}_{ij}} {z^{(l)}_j} = \frac {w^{(l)}_{ij} a_i^{(l-1)}} {\sum_i w^{(l)}_{ij} a_i^{(l-1)}} 回到上邊的例子: Rij(5,6)=factorij(5,6)Rj(6)=wij(6)ai(5)iwij(6)ai(5)Rj(6) R^{(5, 6)}_{i \leftarrow j} = factor_{ij}^{(5,6)} \cdot R^{(6)}_j =\frac {w^{(6)}_{ij} a_i^{(5)}} {\sum_i w^{(6)}_{ij} a_i^{(5)}} \cdot R^{(6)}_j