1. 程式人生 > >深度學習基礎2(反向傳播演算法)

深度學習基礎2(反向傳播演算法)


我們先是用鏈式法則解釋。比如如下的神經網路
  • 前向傳播
對於節點h_1來說,h_1的淨輸入net_{h_1}如下:
net_{h_1}=w_1\times i_1+w_2\times i_2+b_1\times 1
接著對net_{h_1}做一個sigmoid函式得到節點h_1的輸出:
out_{h_1}=\frac{1}{1+e^{-net_{h_1}}}
類似的,我們能得到節點h_2o_1o_2的輸出out_{h_2}out_{o_1}out_{o_2}

  • 誤差
得到結果後,整個神經網路的輸出誤差可以表示為:
E_{total}=\sum\frac{1}{2}(target-output)^2
其中output就是剛剛通過前向傳播算出來的out_{o_1}out_{o_2}target是節點o_1o_2的目標值。E_{total}用來衡量二者的誤差。
這個E_{total}也可以認為是cost function,不過這裡省略了防止overfit的regularization term(\sum{w_i^2}
展開得到
E_{total}=E{o_1}+E{o_2}=\frac{1}{2}(target_{o_1}-out_{o_1})^2+\frac{1}{2}(target_{o_2}-out_{o_2})^2

  • 後向傳播
對輸出層的w_5
通過梯度下降調整w_5,需要求\frac{\partial {E_{total}}}{\partial {w_5}},由鏈式法則:
\frac{\partial {E_{total}}}{\partial {w_5}}=\frac{\partial {E_{total}}}{\partial {out_{o_1}}}\frac{\partial {out_{o_1}}}{\partial {net_{o_1}}}\frac{\partial {net_{o_1}}}{\partial {w_5}}
如下圖所示:
<img src="https://pic4.zhimg.com/50/f2d8768af0d9264687905a0134dae927_hd.png" data-rawwidth="525" data-rawheight="257" class="origin_image zh-lightbox-thumb" width="525" data-original="https://pic4.zhimg.com/f2d8768af0d9264687905a0134dae927_r.png">
\frac{\partial {E_{total}}}{\partial {out_{o_1}}}=\frac{\partial}{\partial {out_{o_1}}}(\frac{1}{2}(target_{o_1}-out_{o_1})^2+\frac{1}{2}(target_{o_2}-out_{o_2})^2)=-(target_{o_1}-out_{o_1})
\frac{\partial {out_{o_1}}}{\partial {net_{o_1}}}=\frac{\partial }{\partial {net_{o_1}}}\frac{1}{1+e^{-net_{o_1}}}=out_{o_1}(1-out_{o_1})
\frac{\partial {net_{o_1}}}{\partial {w_5}}=\frac{\partial}{\partial {w_5}}(w_5\times out_{h_1}+w_6\times out_{h_2}+b_2\times 1)=out_{h_1}
以上3個相乘得到梯度\frac{\partial {E_{total}}}{\partial {w_5}},之後就可以用這個梯度訓練了:
w_5^+=w_5-\eta \frac{\partial {E_{total}}}{\partial {w_5}}
很多教材比如Stanford的課程,會把中間結果\frac{\partial {E_{total}}}{\partial {net_{o_1}}}=\frac{\partial {E_{total}}}{\partial {out_{o_1}}}\frac{\partial {out_{o_1}}}{\partial {net_{o_1}}}記做\delta_{o_1},表示這個節點對最終的誤差需要負多少責任。。所以有\frac{\partial {E_{total}}}{\partial {w_5}}=\delta_{o_1}out_{h_1}



對隱藏層的  w_1
通過梯度下降調整w_1,需要求\frac{\partial {E_{total}}}{\partial {w_1}},由鏈式法則:
\frac{\partial {E_{total}}}{\partial {w_1}}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}\frac{\partial {net_{h_1}}}{\partial {w_1}}
如下圖所示:
<img src="https://pic3.zhimg.com/50/d50d1d812f0f036b8c5cb389e463b01a_hd.png" data-rawwidth="612" data-rawheight="494" class="origin_image zh-lightbox-thumb" width="612" data-original="https://pic3.zhimg.com/d50d1d812f0f036b8c5cb389e463b01a_r.png">引數
引數w_1影響了net_{h_1},進而影響了out_{h_1},之後又影響到E_{o_1}E_{o_2}
求解每個部分:
\frac{\partial {E_{total}}}{\partial {out_{h_1}}}=\frac{\partial {E_{o_1}}}{\partial {out_{h_1}}}+\frac{\partial {E_{o_2}}}{\partial {out_{h_1}}}
其中\frac{\partial {E_{o_1}}}{\partial {out_{h_1}}}=\frac{\partial {E_{o_1}}}{\partial {net_{o_1}}}\times \frac{\partial {net_{o_1}}}{\partial {out_{h_1}}}=\delta_{o_1}\times \frac{\partial {net_{o_1}}}{\partial {out_{h_1}}}=\delta_{o_1}\times \frac{\partial}{\partial {out_{h_1}}}(w_5\times out_{h_1}+w_6\times out_{h_2}+b_2\times 1)=\delta_{o_1}w_5,這裡\delta_{o_1}之前計算過。
\frac{\partial {E_{o_2}}}{\partial {out_{h_1}}}的計算也類似,所以得到
\frac{\partial {E_{total}}}{\partial {out_{h_1}}}=\delta_{o_1}w_5+\delta_{o_2}w_7
\frac{\partial {E_{total}}}{\partial {w_1}}的鏈式中其他兩項如下:
\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}=out_{h_1}(1-out_{h_1})
\frac{\partial {net_{h_1}}}{\partial {w_1}}=\frac{\partial }{\partial {w_1}}(w_1\times i_1+w_2\times i_2+b_1\times 1)=i_1
相乘得到
\frac{\partial {E_{total}}}{\partial {w_1}}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}\frac{\partial {net_{h_1}}}{\partial {w_1}}=(\delta_{o_1}w_5+\delta_{o_2}w_7)\times out_{h_1}(1-out_{h_1}) \times i_1
得到梯度後,就可以對w_1迭代了:
w_1^+=w_1-\eta \frac{\partial{E_{total}}}{\partial{w_1}}
在前一個式子裡同樣可以對\delta_{h_1}進行定義,\delta_{h_1}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}=(\delta_{o_1}w_5+\delta_{o_2}w_7)\times out_{h_1}(1-out_{h_1}) =(\sum_o \delta_ow_{ho})\times out_{h_1}(1-out_{h_1}),所以整個梯度可以寫成\frac{\partial {E_{total}}}{\partial {w_1}}=\delta_{h_1}\times i_1

=======================
上述\delta就是教程Unsupervised Feature Learning and Deep Learning Tutorial 中第三步計算的由來。。
<img src="https://pic3.zhimg.com/50/2d29c11b1c9da7652c63f01d5e31284e_hd.jpg" data-rawwidth="822" data-rawheight="428" class="origin_image zh-lightbox-thumb" width="822" data-original="https://pic3.zhimg.com/2d29c11b1c9da7652c63f01d5e31284e_r.jpg">


所謂的後向傳播,其實就是『將來在宣傳傳播上出了偏差,你們要負責的!』,每一個節點負責的量用\delta表示,那麼,隱藏節點需要負責的量,就由輸出節點負責的量一層層往前傳導。

參考:
【1】A Step by Step Backpropagation Example
【2】Unsupervised Feature Learning and Deep Learning Tutorial

假設我們有一個固定樣本集 \textstyle \{ (x^{(1)}, y^{(1)}), \ldots, (x^{(m)}, y^{(m)}) \},它包含 \textstyle m 個樣例。我們可以用批量梯度下降法來求解神經網路。具體來講,對於單個樣例 \textstyle (x,y),其代價函式為:

\begin{align}J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.\end{align}

這是一個(二分之一的)方差代價函式。給定一個包含 \textstyle m 個樣例的資料集,我們可以定義整體代價函式為:

\begin{align}J(W,b)&= \left[ \frac{1}{m} \sum_{i=1}^m J(W,b;x^{(i)},y^{(i)}) \right]                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2 \\&= \left[ \frac{1}{m} \sum_{i=1}^m \left( \frac{1}{2} \left\| h_{W,b}(x^{(i)}) - y^{(i)} \right\|^2 \right) \right]                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2\end{align}

以上公式中的第一項 \textstyle J(W,b) 是一個均方差項。第二項是一個規則化項(也叫權重衰減項,其目的是減小權重的幅度,防止過度擬合。


[注:通常權重衰減的計算並不使用偏置項 \textstyle b^{(l)}_i,比如我們在 \textstyle J(W, b) 的定義中就沒有使用。一般來說,將偏置項包含在權重衰減項中只會對最終的神經網路產生很小的影響。如果你在斯坦福選修過CS229(機器學習)課程,或者在YouTube上看過課程視訊,你會發現這個權重衰減實際上是課上提到的貝葉斯規則化方法的變種。在貝葉斯規則化方法中,我們將高斯先驗概率引入到引數中計算MAP(極大後驗)估計(而不是極大似然估計)。]


權重衰減引數 \textstyle \lambda 用於控制公式中兩項的相對重要性。在此重申一下這兩個複雜函式的含義:\textstyle J(W,b;x,y) 是針對單個樣例計算得到的方差代價函式;\textstyle J(W,b) 是整體樣本代價函式,它包含權重衰減項。


以上的代價函式經常被用於分類和迴歸問題。在分類問題中,我們用 \textstyle y = 0 或 \textstyle 1,來代表兩種型別的標籤(回想一下,這是因為 sigmoid啟用函式的值域為 \textstyle [0,1];如果我們使用雙曲正切型啟用函式,那麼應該選用 \textstyle -1 和 \textstyle +1 作為標籤)。對於迴歸問題,我們首先要變換輸出值域(譯者注:也就是 \textstyle y),以保證其範圍為 \textstyle [0,1] (同樣地,如果我們使用雙曲正切型啟用函式,要使輸出值域為 \textstyle [-1,1])。


我們的目標是針對引數 \textstyle W 和 \textstyle b 來求其函式 \textstyle J(W,b) 的最小值。為了求解神經網路,我們需要將每一個引數 \textstyle W^{(l)}_{ij} 和 \textstyle b^{(l)}_i 初始化為一個很小的、接近零的隨機值(比如說,使用正態分佈 \textstyle {Normal}(0,\epsilon^2) 生成的隨機值,其中 \textstyle \epsilon 設定為 \textstyle 0.01,之後對目標函式使用諸如批量梯度下降法的最優化演算法。因為 \textstyle J(W, b) 是一個非凸函式,梯度下降法很可能會收斂到區域性最優解;但是在實際應用中,梯度下降法通常能得到令人滿意的結果。最後,需要再次強調的是,要將引數進行隨機初始化,而不是全部置為 \textstyle 0。如果所有引數都用相同的值作為初始值,那麼所有隱藏層單元最終會得到與輸入值有關的、相同的函式(也就是說,對於所有 \textstyle i\textstyle W^{(1)}_{ij}都會取相同的值,那麼對於任何輸入 \textstyle x 都會有:\textstyle a^{(2)}_1 = a^{(2)}_2 = a^{(2)}_3 = \ldots )。隨機初始化的目的是使對稱失效


梯度下降法中每一次迭代都按照如下公式對引數 \textstyle W 和\textstyle b 進行更新:

\begin{align}W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) \\b_{i}^{(l)} &= b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(W,b)\end{align}

其中 \textstyle \alpha 是學習速率。其中關鍵步驟是計算偏導數。我們現在來講一下反向傳播演算法,它是計算偏導數的一種有效方法


我們首先來講一下如何使用反向傳播演算法來計算 \textstyle \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) 和 \textstyle \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y),這兩項是單個樣例 \textstyle (x,y) 的代價函式 \textstyle J(W,b;x,y) 的偏導數。一旦我們求出該偏導數,就可以推匯出整體代價函式 \textstyle J(W,b) 的偏導數:

\begin{align}\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) &=\left[ \frac{1}{m} \sum_{i=1}^m \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x^{(i)}, y^{(i)}) \right] + \lambda W_{ij}^{(l)} \\\frac{\partial}{\partial b_{i}^{(l)}} J(W,b) &=\frac{1}{m}\sum_{i=1}^m \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x^{(i)}, y^{(i)})\end{align}

以上兩行公式稍有不同,第一行比第二行多出一項,是因為權重衰減是作用於 \textstyle W 而不是 \textstyle b


反向傳播演算法的思路如下:給定一個樣例 \textstyle (x,y),我們首先進行“前向傳導”運算,計算出網路中所有的啟用值,包括 \textstyle h_{W,b}(x) 的輸出值。之後,針對第 \textstyle l層的每一個節點 \textstyle i,我們計算出其“殘差” \textstyle \delta^{(l)}_i,該殘差表明了該節點對最終輸出值的殘差產生了多少影響。對於最終的輸出節點,我們可以直接算出網路產生的啟用值與實際值之間的差距,我們將這個差距定義為 \textstyle \delta^{(n_l)}_i (第 \textstyle n_l 層表示輸出層)。對於隱藏單元我們如何處理呢?我們將基於節點(譯者注:第 \textstyle l+1層節點)殘差的加權平均值計算 \textstyle \delta^{(l)}_i,這些節點以 \textstyle a^{(l)}_i 作為輸入。

具體BP演算法的數學推導請參照機器學習《BP演算法詳談》。

中英文對照

反向傳播演算法 Backpropagation Algorithm
(批量)梯度下降法 (batch) gradient descent
(整體)代價函式 (overall) cost function
方差 squared-error
均方差 average sum-of-squares error
規則化項 regularization term
權重衰減 weight decay
偏置項 bias terms
貝葉斯規則化方法 Bayesian regularization method
高斯先驗概率 Gaussian prior
極大後驗估計 MAP
極大似然估計 maximum likelihood estimation
啟用函式 activation function
雙曲正切函式 tanh function
非凸函式 non-convex function
隱藏層單元 hidden (layer) units
對稱失效 symmetry breaking
學習速率 learning rate
前向傳導 forward pass
假設值 hypothesis
殘差 error term
加權平均值 weighted average
前饋傳導 feedforward pass
阿達馬乘積 Hadamard product
前向傳播 forward propagation