Deep Learning 學習筆記(7):神經網絡的求解 與 反向傳播算法(Back Propagation)


 

反向傳播算法(Back Propagation):

 

引言:

在邏輯回歸中,我們使用梯度下降法求參數方程的最優解。

這種方法在神經網絡中並不能直接使用,

因為神經網絡有多層參數(最少兩層),(?為何不能)

這就要求對梯度下降法做少許改進。

 


 

實現過程:

 一、正向傳播

首先,同邏輯回歸,我們求出神經網絡輸出與實際值的“誤差”——COST:

 

 這里先使用歐式距離而不是索夫曼函數作為輸出的cost:


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

 

展開之后:

 
\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 n_l 層(輸出層)的每個輸出單元 \textstyle i,我們根據以下公式計算殘差


\begin{align}
\delta^{(n_l)}_i
= \frac{\partial}{\partial z^{(n_l)}_i} \;\;
        \frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 = - (y_i - a^{(n_l)}_i) \cdot f'(z^{(n_l)}_i)
\end{align}

對 \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2 的各個層,第 \textstyle l 層的第 \textstyle i 個節點的殘差計算方法如下

 
\delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)

這里:

\textstyle f'(z^{(l)}_i) = a^{(l)}_i (1- a^{(l)}_i)

這里相當於把本層節點的殘差按照權重“投影”到上一層殘差的節點上(“反向傳播”就是這個意思)

 

在計算出各節點的殘差之后,參數的偏導如下計算:

 
\begin{align}
\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) &= a^{(l)}_j \delta_i^{(l+1)} \\
\frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) &= \delta_i^{(l+1)}.
\end{align}

 

然后就可以梯度下降去了!

 

梯度下降過程:

1、進行前饋計算,求的所有節點的輸出,求得cost;

2、進行反向傳播計算,求的所有節點殘差(第nl ~ 第2層)

3、利用公式求得cost對參數的偏導

4、更新偏導。

5、重復1~4知道cost差距小於預設值或重復次數大於預設值

(這里以上只講實現方法,省略所有證明。相關證明貼於最后。)


 

隨機初始化( Random Initialization):

在進行第一次前饋算法之前,神經網絡參數的值是多少呢?

全零初始化?這是不可以的!

如果選擇相同的參數進行初始化,

隱藏節點的出入必定相同(自己推推,更不用說輸出了)。

為了使得對稱失效,我們對神經網絡的參數進行隨機初始化,

既采用接近零的初始值進行初始化

這個過程可以用matlab產生隨機矩陣的功能來實現。

初始化之后,讓我們一起下降吧!


 

用到的證明(殘差的計算):

1、

 
\begin{align}
\delta^{(n_l)}_i &= \frac{\partial}{\partial z^{n_l}_i}J(W,b;x,y)
 = \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 \\
 &= \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \sum_{j=1}^{S_{n_l}} (y_j-a_j^{(n_l)})^2
 = \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \sum_{j=1}^{S_{n_l}} (y_j-f(z_j^{(n_l)}))^2 \\
 &= - (y_i - f(z_i^{(n_l)})) \cdot f'(z^{(n_l)}_i)
 = - (y_i - a^{(n_l)}_i) \cdot f'(z^{(n_l)}_i)
\end{align}

2、

 
\begin{align}
\delta^{(n_l-1)}_i &=\frac{\partial}{\partial z^{n_l-1}_i}J(W,b;x,y)
 = \frac{\partial}{\partial z^{n_l-1}_i}\frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 
 = \frac{\partial}{\partial z^{n_l-1}_i}\frac{1}{2} \sum_{j=1}^{S_{n_l}}(y_j-a_j^{(n_l)})^2 \\
&= \frac{1}{2} \sum_{j=1}^{S_{n_l}}\frac{\partial}{\partial z^{n_l-1}_i}(y_j-a_j^{(n_l)})^2
 = \frac{1}{2} \sum_{j=1}^{S_{n_l}}\frac{\partial}{\partial z^{n_l-1}_i}(y_j-f(z_j^{(n_l)}))^2 \\
&= \sum_{j=1}^{S_{n_l}}-(y_j-f(z_j^{(n_l)})) \cdot \frac{\partial}{\partial z_i^{(n_l-1)}}f(z_j^{(n_l)})
 = \sum_{j=1}^{S_{n_l}}-(y_j-f(z_j^{(n_l)})) \cdot  f'(z_j^{(n_l)}) \cdot \frac{\partial z_j^{(n_l)}}{\partial z_i^{(n_l-1)}} \\
&= \sum_{j=1}^{S_{n_l}} \delta_j^{(n_l)} \cdot \frac{\partial z_j^{(n_l)}}{\partial z_i^{n_l-1}}
 = \sum_{j=1}^{S_{n_l}} \left(\delta_j^{(n_l)} \cdot \frac{\partial}{\partial z_i^{n_l-1}}\sum_{k=1}^{S_{n_l-1}}f(z_k^{n_l-1}) \cdot W_{jk}^{n_l-1}\right) \\
&= \sum_{j=1}^{S_{n_l}} \delta_j^{(n_l)} \cdot  W_{ji}^{n_l-1} \cdot f'(z_i^{n_l-1})
 = \left(\sum_{j=1}^{S_{n_l}}W_{ji}^{n_l-1}\delta_j^{(n_l)}\right)f'(z_i^{n_l-1})
\end{align}

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM