不同loss函數在不同網絡結構下的誤差後傳

前言

  推導下最小均方差(MSE)和交叉熵(CE)兩種loss函數的導數,看看還是否滿足誤差後傳的原則?有什麼區別?
  在一般地網絡結構下是怎麼樣的?在CNN下又是怎麼推導的?在RNN結構下(LSTM)又是怎麼推導的?直接討論多元判別的情況,二元讀者自行推導。

MSE & CE

  上個小圖,說明下最後輸出結構及兩種loss的形式。

  MSE的思路:是不管哪個輸出維度,都想盡量靠近。
  CE的思路:只將樣本集出現的概率最大化。交叉熵與最大似然是一致的,在前面講過,這裏不多說了。
  Loss(data|z)=12mms=1kj=1[yjf(zj)]2
  Loss(data|z)=1mms=1kj=1True[yj=1]lnf(zj)
  樣本標籤表示爲one-hot類型。j 表示第j 個輸出單元序號。z 表示前層傳遞到最後輸出層的節點的輸入。zj 表示前層傳遞到最後輸出層的j 節點的輸入。  
  True[] 表示判斷條件是否爲真,其中True[yj=1] 表示對應輸出節點爲1的判斷。若爲真,則表示樣本是該類別j ,這裏不要暈了。

輸出層的判別函數

  二元判別時,更習慣用sigmoid 函數:f(z)=11+ez
  其導數:f(z)z=1(1+ez)2ez(1)=f(z)[1f(z)]
  多元判別時,更習慣用softmax 函數:f(zi)=ezikj=1ezj
  其中zi 表示第i 個輸出節點的輸入。
  其導數:f(zi)zi=ezikj=1ezjeziezi(kj=1ezj)2
         =ezikj=1ezj[kj=1ezj]ezikj=1ezj=f(zi)[1f(zi)]
  上述兩個函數,softmax退化爲二元時,就是sigmoid函數關係詳見。兩個函數的導數形式也很相近,就是一樣的,不過一個兼顧了多維判斷。notice:退化也是有條件的退化,去掉了一組判斷0的參數;二元的sigmoid判斷輸出是單節點的。
  有人在博客裏亂寫,將二元判斷的情況胡亂推廣到多元判斷,要注意二元的單節點輸出是化簡的結構。
  比如,二元下,MSE和CE做loss對w 的求導分別如下:
  Emsew=w[(yσ(wx))2]=(yσ(z))σx
  Ecew=w[ylnσ(wx)+(1y)ln(1σ(wx))]=(yσ(z))x
  在二元且單節點輸出時,兩個導數間的差距是σ
  但是在多元判斷時,用softmax做判斷函數的情況下:
  Emsewk=w[k(ykS(wkx))2]=(ykS(zk))Sx
  Ecewk=wk[kTrue(yk=1)lnS(zk)]=True(yk=1)[1S(zk)]
  在多元節點輸出時,兩個導數間的差距就不是簡單的S 的差距了。

單樣本下求導

  1)對MSE下的單樣本時輸入zi 求導:
   Emse(zi|θ)=kj=1[yjf(zj)]2
   其中θ=[θ0,θ1,...,θj] ,zi{z1,z2,...,zj}
   Ezi=zi[yif(zi)]2=[yif(zi)]f(zi)
  2)對CE下的單樣本時輸入zi 求導:
   Ece(zi|θ)=kj=1True[yj=1]lnf(zj)
   Ezi=zi{True[yi=1]lnf(zi)}=True[yi=1]1f(zi)f(zi)
  注意兩處導數的不同:
  1) Emse(zi|[θ0,θ1,θi,...,θk]) 對每組θi 都有偏導。
  2) Ece(zi|[θ0,θ1,θi,...,θk]) 則只在該樣本所表示類別節點的那組參數時有偏導(True[yi=1]=1 時),其餘的是0(True[yi=1]=0 )。注意一個樣本只有一個類別屬性,y=[0,0,0,1,0]。
  代入輸出節點的判別函數softmax的導數後:
  Emsezi=[yif(zi)]f(zi)
  Ecezi=True[yi=1]1f(zi)f(zi)={1f(zi)0other
  發現用softmax做CE的最後一層判斷函數是非常好的,可以只將誤差部分後傳;而MSE則多引入一個判別導數部分。另外,CE比MSE要好的地方,僅對目標標記位置用力氣(True),對其他非標記位置不管,反而更容易集中,不像MSE會有多個位置分散判斷的集中力。

在一般網絡結構下,不同Loss對誤差後傳有什麼影響麼?

  上個小圖表示倒數的後幾層。

  對誤差後傳是沒有影響的,只是最後一層往前傳遞的內容有點變化而已。
  1) CE損失函數下的倒數
  對CE表示損失函數的網絡倒數第一層參數wLj,i 求導:
  EcewLj,i=True[yj=1]1f(zj)f(zj)=True[yj=1][1f(zj)]hL1
  對倒數第二層的wL1i,m 求導:
  EcewL1i,m=kj=1True[yj=1][1f(zj)]zjhL1hL1ziziwL1i,m
  =kj=1True[yj=1][1f(zj)]wLjσ(zi)hL2
  2) MSE下的求導:
  EmsewLj,i=[yjf(zj)]f(zj)hL1
  EmsewL1i,m=j[yif(zj)]f(zj)wLjσ(zi)hL2
  比較發現:
  網絡結構不變,對h的偏導不變,鏈式結構仍存在,不影響誤差後傳的整體結構;且由於最後層的各個節點累加仍然存在,也不影響多點集中向後的原則。δ 都是傳遞到節點的輸出側,再乘以激活函數對該層某變量的導數。
  最後一層往前傳遞的內容在變化:
  CE是True[yj=1][1f(zj)] ;MSE是[yjf(zj)]f(zj)
  在網絡層間的傳遞,仍然遵循多路集中一點的原則。
  思考:誤差後傳的基本結構是由網絡的串聯形式決定的,如果改變網絡的組織結構,化積爲和,就會改變整個參數更新體系,同時也能徹底解決掉梯度消失問題,甚至直接開闢一個新的ML分支。

卷積層和池化層導數

  1)卷積層、卷積導數、誤差後傳
  卷積的操作zi,j=m1a=0n1b=03c=0xi+a,j+b,cwa,b,c+b
  注意每個filter共享一個bias。{i,j} 表示輸出節點位置。對某個filter的{m,n} 位置參數wm,n 求導得到:  

zi,jwm,n=c=03xi+m,j+n,c

  如何誤差後傳呢?由於卷積層的參數w 屬於共享參數,所以其在誤差後傳時稍有不同。先來看個共享參數的誤差後傳例子
  {θx+[θ0,θ1,...,θn]x=zf(z)=softmax(z)θx+θ0x=z0θx+θ1x=z1θx+θ2x=z2...
  其中θ 是共享參數,看其在誤差後傳中的樣子。
  單樣本MSEloss爲:E=12k[ykfk]2
  對θ 求導:Eθ=k(ykfk)fkx 因爲每個輸出節點都有θ 在貢獻力量,所以求導反向傳播時,也是所有的節點都累積起來
  誤差後傳計算小竅門:
  反向傳播的誤差在某層L 輸出側,累加得:ML=inodeδLi ,其中i 表示本層節點的編號,δLi 表示已經反向傳遞到第i 節點的誤差值。如何求解這層導數呢?
  本層每個節點的激活hL(w,x) ,都帶入進去求導。
  inodeδLihLi(w,x)w=inodeδLihLi(w,x)w
  這樣自然就會將各種情況的參數作用形式合併到一個式子裏。
  卷積層的誤差也是同樣如上所述規律。
  計算下卷積圖中的卷積參數wm,n 的導數。
  Ewm,n=wm,n[Pp=1Hmi=0Wnj=0δL,pi,jhL(zi,j)]
  =Hmi=0Wnj=0δLi,jhLi,jzLi,jzi,jwm,n ,因爲wm,n 只對輸出的某一feature-map起作用,所以p 被化簡掉了。
  =Hmi=0Wnj=0δLi,jhLi,j3c=0xi+m,j+n,c ,因爲只從一個圖像通道里抽取特徵,所以通道的變量也被簡化。
  =Hmi=0Wnj=0δLi,jhLi,jxi+m,j+n
  =rot180{δLi,j}xm,n
  δ 翻轉180度,然後再乘以xm,n 得到Ewm,n
  2)池化層導數及誤差後傳
  池化只是做採樣,只需要將依照選擇的動作,將誤差傳遞就好。
  在反向傳播時,我們首先會把δL 的所有子矩陣矩陣大小還原成池化之前的大小,然後如果是MAX,則把δL 的所有子矩陣的各個池化局域的值放在之前做前向傳播算法得到最大值的位置(這個時候在前向傳播時需要記錄最大值的位置)。如果是Average,則把δL 的所有子矩陣的各個池化局域的值取平均後放在還原後的子矩陣位置。這個過程一般叫做upsample。
  δL=(2486)maxδL1=2000004000060800
  δL=(2486)meanδL1=0.50.5110.50.511221.51.5221.51.5

在CNN網絡結構下,不同Loss對誤差後傳有什麼不同?

  上面的推導也已經看到了,卷積和池化層,仍然遵循誤差後傳的規律。不同loss對誤差後傳無影響,唯一的影響是最後層後傳的內容不同(由於softmax判別函數的特殊性剛好與loss互相抵消掉部分內容);更新最後層參數的稍微不同(由於loss函數本身的不同導致)。
  MSE後傳的是Effzi=(yifi)fi
  CE後傳的是Effzi=True[fi=1][1fifi]=True[fi=1](1fi)

RNN 結構下的BP

  未完待續….
  RNN的結構不同於傳統的網絡,也不同於CNN的網絡,而是以迭代的形式出現。傳統網絡,層內不共享參數,層間不共享參數;CNN是層內共享參數,層間不共享參數;RNN是層內不共享參數,層間共享參數。
  並且輸入數據樣本和輸出表示上也不同於一般的情況,是連續的時間序列數據。表示也不是one-hot形式,而是以對應位置概率預測形式出現。比如,輸入[我 很 開心]==> 輸出[(0.8, 0.1, 0.1), (0.1, 0.9, 0.0), (0.2, 0.2, 0.6)]。

梯度優化方法應用位置

  疑問:各種對參數更新的方法做的改進,比如,Adam怎麼應用過來呢?
  錯誤的回答:目測應該是最後一層的導數求解後的改進,如果對每個激活的導數都改動,那是不是有點過分了,不能表示真實輸出和預測輸出的區別。梯度的改進是爲了能夠更真實地描述與最優解的距離,且能夠在更新參數時更快更直接朝着最優解方向。
  正確的回答:梯度優化的方法,是對f(θ)θ:=θαΔθ 時的Δθ 做改進(依據θ 的導數和歷史導數信息進行相應調整)。每層參數wl 都有自己的導數,那就意味着每層的導數求解完畢後,都可以依照梯度優化方式做改進,然後再更新。

batch normalize 怎麼加進去

  1)batch normalize在一般網絡中,如何加入?
  這個前面博客“Batch Norm的幾點說明”都推導過,是對激活函數的修改,對整個誤差後傳結構無影響。
  2)batch normalize在CNN網絡中,如何加入?
  這個也提到過,在前面博客裏,至於怎麼推導。只需將上面的激活函數對應的替換下就OK。

卷積計算與cross-relation計算等價

  學過通信的童鞋,肯定都會對CNN裏面的卷積操作持懷疑態度,這分明不是卷積嘛,騙我沒學過信號與處理理論麼。裏面的計算轉換下,就會發現相通的地方。

總結

  1. 雖然是不同的loss函數下,只要網絡結構仍然是層間直連,對誤差傳遞的多點往前集中的形式是無影響的。
  2. 對某層參數求導時,敏感值的計算,每層的輸出側都是需要累加到一起的,再對該層的參數求導。
  3. 交叉熵和均方差的loss函數,在最後層參數更新上是不一樣的,前者只對樣本類別標記下對應的參數更新,後者則是所有參數本次迭代都有更新。
  4. 池化層由於無學習的動作,只是選擇,所以處理更爲簡單。

發佈了81 篇原創文章 · 獲贊 134 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章