反向傳播演算法的理解
鬱悶!由於專欄不支持Latex,只能把latex的原始式子碼上了。
原文在我的博客上:原文,可以跳轉到上面觀看,Latex式子都顯示正常。
關於BP的講解,網上文章漫天遍野,我也不想貼那麼多圖,一步步說了,就說一下我的一些細節困惑和理解,詳細的感興趣的可以去讀那些文章。
先說說我看到的幾篇講BP的不錯的帖子:
<神經網路——BP演算法>
<如何理解神經網路裡面的反向傳播演算法?>
還有就是周志華老師的西瓜書$P_{101}$頁的關於BP的講解。
對,還推薦下《Make Your Own Neural Network》這本電子書,e文的,但是可以看懂,作者就跟你肚子的蛔蟲一樣,你一不明白,丫立刻就感知到,跳出來給你講。
最最開始之前,有必要先回憶一下梯度下降:
<機器學習入門:線性回歸及梯度下降 - CSDN博客>
這篇講的不錯,為什麼要梯度下降,因為,可以通過一種迭代的方式去「探測」極小值點,怎麼探測呢?就是沿著負梯度方向,往前拱一小點(就是說的步長),只要是負梯度方向,就一定是Y值下降最快的方向。至於為什麼梯度方向是下降最快的方向,參考這篇(<為什麼梯度反方向是函數值下降最快的方向?>), 這裡用二維的來想像,一維的導數體會不出來,容易被蠱惑暈掉,提醒一下。
那麼,對於多維,就變成了,每個維度都通過「此維度的偏導」乘以一個「步長值」,得到這個維度的分量,這些分量組合起來,就是梯度方向,那麼朝著這個方向走一步,就是下降最快的。也就說,別的文章里提到的$W_{i,j}=W_{i,j}+Deltafrac{partial f(W_{i,j})}{partial W_{i,j}}$,
這樣來更新了$W_i,_j^*$,也就是這個維度上的新值。
對了,時刻牢記,我們是在梯度下降損失函數$E_k=frac{1}{2}*sum_{j=1}^l(hat(y_j^k)-y_j^k)$,那些文章反覆提到了,這個函數的變數是誰呢?是那些漫天遍野的權重$W_i,_j$,每個$W_i,_j$都要對丫進行梯度下降的更新,然後再往裡頭灌打標籤的數據,再得到一輪的$W_i,_j$更新,周而復始,直到梯度下降的**收斂條件**成立(參考這篇:<梯度下降法迭代結束的條件 - CSDN博客> ):也就是到達一定迭代次數,或者,梯度的模達到一個值以下,
>計算梯度$g_k=g(x^{(k)})$當$|g_k|<varepsilon$時,停止迭代"
----- 引自李航教授的《統計學習方法》附錄A 梯度下降法"。
再次友情提醒,這是一次的訓練,是一次的數據灌入得到誤差,然後反向梯度下降更新各個$W_i,_j$,這個過程一圈又一圈,一圈又一圈,直到達到剛剛說的收斂條件。
這裡多說一句,如果是每個樣本數據灌一次就做參數更新,這種是隨機梯度下降,但是要湊一波樣本數據都灌入後,把誤差加一起用做反向傳播更新的依據,這種叫批量梯度下降,現在往往用後者,收斂快,據說(我也沒經驗)。
好啦,終於前戲夠了,進入正題,看看到底怎麼反向傳播法。
先說隱層到輸出層之間的參數,我只是大自然的搬運工,只碼公式不說話,參考西瓜書P$_{103}$頁:
- $E_k=frac{1}{2}sum_{j=1}^l(hat{y_j^k}-y_j^k)^2$
- $W_{hj}= W_{hj} + Delta{W_{hj}}$
- $Delta W_{hj}= - eta frac{partial E_k}{partial W_{hj}}$
- $frac{partial E_k}{partial W_{hj}}=frac{partial E_k}{partial hat{y^k_j}}* frac{partial {hat{y^k_j}}}{partial eta_j}*frac{partial eta_j}{partial W_{hj}}$
- $frac{partial eta_j} {partial W_{hj}}=b_h$
- $frac{partial E_k}{partial hat{y^k_j}}=hat{y^k_j}-y^k_j$
Sigmod函數有個性質:$f(x)=f(x)(1-f(x))$,所以
- $frac{partial hat{y^k_j}}{partial eta_j}=hat{y^k_j}(1- hat{y^k_j})$
最後,都組合到一起,得到:
> ${Delta}W_{hj}=-eta* (hat{y^k_j}-y^k_j)* hat{y^k_j}* (1- hat{y^k_j})* b_h$
-------------------------------------------------------------------------------
..............................分割線...........................
好,輸出層和隱層之間的權重$W_{hj}$我們得到了,下面該去算隱層和輸入層之間的權重$v_{ih}$了,咋算呢,還是從根出發,根?就是最外頭的損失函數,也就是$E_k$。
這個可就複雜多嘍,慢慢來,還是老規矩,一步步推:
$v_{ih}= v_{ih} + Delta{v_{ih}}$
$Delta{v_{ih}}=-eta frac{partial E_k}{v_{ih}}$
看,這個是用最最後的損失$E_k$,來反向對隔著一層的$v_{ih}$,中間相隔了一堆東西呢:
$E_k->hat{y}^k_j->eta_j->b_h->alpha_h->v_{ih}$,這麼一條鏈,鏈式求導法則吧!
$frac{partial E_k}{partial v_{ih}}=frac{partial E_k}{partial hat{y^k_j}}* frac{partial {hat{y^k_j}}}{partial eta_j}* frac{partial eta_j}{partial b_h}* frac{partial b_h}{partial alpha_h}*frac{partial alpha_h}{partial v_{ih}}$,真長啊,我勒個去,挨個求出來。
我們知道$E_k$是很多個$E_j$組成的,要對每個都要求偏導,然後加到一起,所以對
$frac{partial E_k}{partial hat{y^k_j}}實際上就是sum^l_{j=1}frac{partial E_j}{partial hat{y^k_j}}$
- $frac{partial E_k}{partial hat{y^k_j}}=sum^l_{j=1}frac{partial E_j}{partial hat{y^k_j}}=sum^l_{j=1}(hat{y^k_j}- y^k_j)$
- $frac{partial hat{y^k_j}}{partial eta_j}=hat{y^k_j}(1- hat{y^k_j})$
- $frac{partial eta_j}{partial b_h}=W_{hj}$
(*註:這裡有個trick,既然$eta$是$b_n$的函數,$b_n$又有多個,為何$frac{partial eta_j}{partial b_h}$變成了只有一個$W_{hj}$了,其他的$b_n$呢?那是因為其他的$b_n$和要求的$v_{ih}$沒啥關係,鏈式求導的時候,其他的$b_n$和它沒關係,都被求導成0了*)
- $frac{partial b_h}{partial alpha_h}=b_h * (1-b_h)$
(*註:這是個sigmod函數,所以才得這個*)
- $frac{partial alpha_h}{partial v_{ih}}=x_i$
好吧,我們最後放到一起:
>$Delta{v_{ih}}=-eta frac{partial E_k}{v_{ih}}=-eta * frac{partial E_k}{partial hat{y^k_j}} * frac{partial {hat{y^k_j}}}{partial eta_j}* frac{partial eta_j}{partial b_h} * frac{partial b_h}{partial alpha_h} * frac{partial alpha_h}{partial v_{ih}} $
>$=-eta * b_h * (1-b_h) * x_i * sum^l_{j=1}[(hat{y^k_j}- y^k_j) * hat{y^k_j} * (1- hat{y^k_j}) * (W_{hj}) ]$
我靠,太複雜了!你暈了么?我自己推的,所以我還沒有。
這個時候,需要靜下來,思考思考了搞定了${Delta}W_{hj}$,也搞定了$Delta{v_{ih}}$,西瓜書里就一個隱層,那如果不是1個隱層,2個隱層,3個呢,....,N個呢?所以,我們在回過頭來看$Delta{v_{ih}}$,這個最重要。除了最後一層的權值${Delta}W_{hj}$是特殊處理,其他的隱層應該是和$Delta{v_{ih}}$類似的。
我們再來觀察一下$Delta{v_{ih}}$的核心部分,
>$b_h * (1-b_h) * x_i * sum^l_{j=1}[(hat{y^k_j}- y^k_j) * hat{y^k_j} * (1- hat{y^k_j}) * (W_{hj}) ]$
- $(hat{y^k_j}- y^k_j) * hat{y^k_j} * (1- hat{y^k_j})$ 是固定的,每次灌完數據就定下來了,每個隱層都可以用。西瓜書里把這玩意叫做$g_i$(還得加了個負號),其實他就是$frac{partial E_k}{partial hat{y^k_j}} * frac{partial {hat{y^k_j}}}{partial eta_j}$部分,沒轉過來腦子吧,沒事,多想一會兒。
- 那$b_n$是啥,$x_i$是啥,不就是這個隱層的節點的輸入和輸出么?啊!「我靠,還真是!」你感嘆道。
- 得,就剩下$W_{hj}$了,這是啥?就是這個隱層和下一個隱層(也可以是輸出層,反正一樣)的那些權值啊。
好!你再細想想,明白了吧,這個式子是通用的,通用的,通用的,有了這個式子,任何一個隱層和隱層之間、隱層和輸入層之間的每個權值,通過求丫的偏導,然後進行梯度下降,這樣一來,每個權值都按照步長減少一下,形成一個梯度,往最低點又進一步。
上面是之前寫的,其實,再看一遍,自己心虛的狠,怎麼就說「其他隱層是類似的、通用的...」,看這篇,<記一下機器學習筆記 多層感知機的反向傳播演算法> ,裡面提到:
>隱藏層神經元的反向傳播公式:$Delta w^l_{ji} = eta delta_k cdot x_i qquad delta_j = phi(v^l_j)sum ^m _{k=1}(delta_k) w_kj$
>
>其中δk為後一層的第k個神經元的局域梯度。
>從而可以推導出,每一層隱藏層神經元的局域梯度,等於其後一層所有神經元的局域梯度與其對本層神經元連接邊的權值的乘積之和,乘上本層神經元激活函數對局部誘導域的導數。
>xi表示本層神經元的第i個輸入值,η為學習率參數。
>
>如此一來,無論隱藏層有多深,每層隱藏層的權值修改都可以通過前一層的信息推導而得,而這一信息最終來源於輸出層,輸出層的信息又來源於誤差信號。這就好像誤差信號在從輸出層開始,沿著各層間的連接邊往後傳播一樣。
>反向傳播(Back Propagation)的說法就是這麼來的。
其他,他也是很含糊地提了一句`從而可以推導出`這種敷衍的話,來搪塞這個推導,如果你仔細想想,這個推論不是那麼好推出的,反正我沒想明白???先放著,死記結論吧,未來,可以找個明白人問問。
我再廢話幾句,每個權值都會被 $w_h = w_h - eta * frac{partial E_k}{partial w_h}$,更新一下,都更新完了,形成梯度向量,就往$E_k$最小值方向邁進一步,然後,這個「然後」很重要,然後還是用這個樣本數據,再來一次這個更新過程,注意!這時候還不用在灌新的標籤數據進來,還是現在正在用的老的一批數據呢,這個細節要注意噢。直到!直到....梯度下降探測停止(停止條件什麼來著,回憶一下,文章開頭的地方有,
>計算梯度$g_k=g(x^{(k)})$當$|g_k|<varepsilon$時,停止迭代"
對,就是梯度的模小於某個$varepsilon$ ,停止)。
這個時候貌似只是這批數據的最小值探測到了,那再來一批呢?那就用新的數據,再繼續優化這些權值吧。其實,這裡我有些迷惑,一批數據後,如果已經找到一組權值,可以讓當前這批數據的損失函數最小化了,那再來一批數據,會不會讓本來挺優化的權值,反倒沒原來效果那麼好了,也就是說,不斷地訓練是否可以不斷地改進權值,這點我是有些疑惑的?
推薦閱讀:
※CS231n Assignment3
※Paper Reading | 讓機器像人類一樣學畫畫?GANs 「全家福」一覽
※機器學習(吳恩達)之學習筆記2--淺層神經網路
※獨家 | 一文讀懂人工神經網路
※圖像識別鑒黃之二「阿里綠網VS網易易盾VS圖普科技」
TAG:神經網路 |