1. 程式人生 > >深入淺出——搞懂卷積神經網路誤差分析(一)

深入淺出——搞懂卷積神經網路誤差分析(一)

第一部分 全連線網路的權值更新

  卷積神經網路使用基於梯度的學習方法進行監督訓練,實踐中,一般使用隨機梯度下降(機器學習中幾種常見的梯度下降方式)的版本,對於每個訓練樣本均更新一次權值,誤差函式使用誤差平方和函式,誤差方式採用平方誤差代價函式。
  注:本文主要按照參考文獻中內容來寫的,其中某些部分加入了自己解釋,此文內容不斷更新充實中,直到讓人可以看完之後完全瞭解卷積神經網路的計算過程。

1.1  前向傳播中樣本的誤差以及每層的輸出

  全連線區的第l層(l來表示當前層)的輸出函式為:
            這裡寫圖片描述
  全部訓練集上的誤差只是每個訓練樣本的誤差的總和,先考慮對於一個樣本的BP。則對於第n個樣本的誤差,表示為:
               這裡寫圖片描述


  其中tk表示第n個樣本對應的標籤的第k維,yk表示第n個樣本對應的網路輸出的第k個輸出。

1.2 反向傳播中樣本的權值更新

  權值更新具體來說就是,對一個給定的神經元,得到它的輸入,然後用這個神經元的delta(即δ)來進行縮放。用向量的形式表述就是,對於第l層,誤差對於該層每一個權值(組合為矩陣)的導數是該層的輸入(等於上一層的輸出)與該層的靈敏度(該層每個神經元的δ組合成一個向量的形式)的叉乘。然後得到的偏導數乘以一個負學習率就是該層的神經元的權值的更新了:
             這裡寫圖片描述
A)對於第L層的權值,我們有:
              這裡寫圖片描述
    這裡寫圖片描述
B)對於第l層的權值,求偏導數:
           這裡寫圖片描述

第二部分 當接在卷積層的下一層為pooling層時,卷積層的誤差敏感項

  在一個卷積層,上一層的特徵maps被一個可學習的卷積核進行卷積,然後通過一個啟用函式,就可以得到輸出特徵map,每一個輸出map可能是組合卷積多個輸入maps的值。首先卷積層的輸出為:
                這裡寫圖片描述
  上面的*號實質是讓卷積核k在第l-1層所有關聯的feature maps上做卷積運算。
  由於卷積層的下一層為抽樣層,那麼首先需要知道在下一層哪些神經元與該卷積層的節點i的聯絡,然後根據原來的取樣方式進行誤差分析。由於取樣層在從卷積層取樣時,同一個結點不會被重複取樣(注意這裡不會重複取樣,就是不會有重疊區域,這裡和卷積操作時的滑窗操作不相同),因而,卷積層的一個區域性感受野對應取樣層中的神經元的一個輸入。

  假設我們現在分析的卷積層是第l層,則其下一層為l+1層(為池化層)。採用的是一對一非重疊取樣。則第l層的節點j的誤差項為:
這裡寫圖片描述

  上式並未考慮到第l層到下一層的權值
             這裡寫圖片描述
  其中:Ups (x):對x進行上取樣,此處表示下一層的誤差項中x的貢獻值。
  接下來我們需要知道這個ups()是怎麼得到的。其具體操作要根據前面的pooling的方法,因為下一層的pooling層的每個節點由l層的多個節點共同計算得出,pooling層每個節點的誤差敏感值也是由卷積層中多個節點的誤差敏感值共同產生的,常見的取樣方式有最大池化與平均池化兩種。

  A)若前面使用mean-pooling方法,則將下一層的誤差項除以下一層所用的濾波器的大小。假如下一層的濾波器的大小為k*k,則:
              這裡寫圖片描述
  mean-pooling時的unsample操作可以使用matalb中的函式kron()來實現,因為是採用的矩陣Kronecker乘積。C=kron(A, B)表示的是矩陣B分別與矩陣A中每個元素相乘,然後將相乘的結果放在C中對應的位置。
  B)若前面使用max-pooling方法,則將需要記錄前向傳播過程中pooling區域中最大值的位置,然後判斷當前的結點是否在最大位置上,若在最大位置上則直接將當前的下一層的誤差值賦值過來即可,否則其值賦0。也就是說原convolution區塊中輸出最大值的那個neuron進行反向傳播,其他neuron對權值更新的貢獻算做0。
  有了上面了誤差損失項,現在我們開始計算損失函式對基的偏導數和對權向量的偏導數(也就是所謂的梯度計算):
  A)基的偏導數,損失函式對基的偏導數為:
                 這裡寫圖片描述

  B)權值的變化量,損失函式對權值的偏導數為:
               這裡寫圖片描述

第三部分 當接在pooling層的下一層為卷積層時,該pooling層的誤差敏感項

  對於取樣層,其輸出值計算公式為:

              這裡寫圖片描述

  其中down(xj)為神經元j的下采樣。

  在這裡我們向上面卷積層一樣,需要先計算出誤差項,然後通過誤差項就可以計算得到其他權值和偏置。

  由於取樣層的下一層為卷積層,取樣層的每個節點可能被卷積多次。假如當前的取樣層為第l層,我們需要計算第j個結點的神經元的誤差,則我們首先需要找到第l+1層中哪些神經元用到過結點j,這需要我們在將l層卷積到l+1層的時候儲存神經元的對映過程,因為在計算反向傳播誤差時需要用到。先假設第l+1層中用到結點j的神經元的集合個數為M,

  則第l層的誤差項為:

               這裡寫圖片描述

  現在我們可以很輕鬆的對訓練偏置和位移偏置的導數:
                  這裡寫圖片描述
              這裡寫圖片描述

  最核心的步驟就是求解誤差項(又稱靈敏度),其他的計算都是以此為基礎。誤差項的求解首先要分析需要計算的結點j與下一層的哪個或哪些節點節點有關聯,因為結點j是通過下一層與該節點相連的神經元來影響最終的輸出結果,這也就需要儲存每一層節點與上一層節點之間的聯絡,以便在反向計算誤差時方便使用。
  下篇博文對卷積神經網路中出現的一些問題進行一個詳細的闡述。部落格地址:http://blog.csdn.net/u010402786/article/details/51228405