深度學(xué)習(xí)-前向傳播與反向傳播

概述

對(duì)于全連接的神經(jīng)網(wǎng)絡(luò)(MLP),其結(jié)構(gòu)看似復(fù)雜, 其實(shí)只是簡(jiǎn)單結(jié)構(gòu)的不斷重復(fù)。
這里的簡(jiǎn)單結(jié)構(gòu)就是sigmoid函數(shù)即LR:
對(duì)于x=(x_0,x_1,...,x_n)w=(w_0,w_1,...,w_n) 和 標(biāo)量b 使y=\sigma(wx+b)=\frac{1}{1+exp(\sum_{i=0}^{n}w_ix_i+b)}
z=wx+b
當(dāng)然隨著激活函數(shù)的發(fā)展,\sigma函數(shù)也在變化。這里先從一般情況介紹。
\sigma(x)'=\sigma(x)(1-\sigma(x))
這就是神經(jīng)網(wǎng)絡(luò)的一個(gè)神經(jīng)元,它把上一層所有輸出作為自己的輸入,同時(shí)有自己的一套w

前向神經(jīng)網(wǎng)絡(luò)

圖1:簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)

如上圖,
x_0=a^0表示第一層即輸入層,接收一個(gè)樣本的特征,他有n_0個(gè)神經(jīng)元。
a^1,a^2,...,a^{l-1}表示隱層每一層的結(jié)果是上一層的輸出也是下一層的輸入,分別有n_1,n_2,...,n_{l-1}個(gè)神經(jīng)元
a^l=y'表示輸出層,當(dāng)然,對(duì)于二分類(lèi),輸出層是一個(gè)神經(jīng)元,如果是多分類(lèi),就可以是多個(gè)神經(jīng)元。有n_l個(gè)神經(jīng)元
W^l表示第l-1層與l層之間的權(quán)重矩陣。shape(W^l)=(n_l,n_{l-1})
b^l表示第l層的偏至值。shape(b^l)=shape(a^l)=(n_l,1)
除第一層外其他層中每個(gè)圓即神經(jīng)元,都是一個(gè)LR模型。
\begin{alignedat}{2} a^0 &= x_0 \\ z^1&=W^1a^0+b^1 \\ a^1&=\sigma(z^1) \\ ... \\ z^l&=W^la^{l-1}+b^l \\ a^l&=\sigma(z^l)=(\sigma(z^l_0),\sigma(z^l_1),...,\sigma(z^l_{n_l}))^T \\ y' &= a^L \end{alignedat}
(這里的輸出是通用輸出,沒(méi)按圖1來(lái)。輸出層神經(jīng)元有n_L個(gè),模型共L層)
上述的計(jì)算值,從輸入層開(kāi)始,逐層向前傳播,經(jīng)過(guò)隱層到達(dá)輸出層。所以叫做前向傳播

反向傳播

反向傳播用于計(jì)算每一層W^l,b^l的梯度,用于更新
現(xiàn)在模型建立好了,對(duì)于一個(gè)樣本的輸入,可以得到一個(gè)預(yù)測(cè)值y'。
現(xiàn)在需要設(shè)計(jì)一個(gè)損失函數(shù)來(lái)指導(dǎo)模型學(xué)習(xí)
C=f(y',y)
那有了損失函數(shù)后,就要求損失函數(shù)關(guān)于參數(shù)的梯度了,即需要求解
\frac{\partial C}{\partial W^l},\frac{\partial C}{\partial b^l},l=1,2,...L

\begin{alignedat}{2} \frac{\partial C}{\partial W^L}&=\frac{\partial C}{\partial z^L}\frac{\partial z^L}{\partial W^L} \\ &=(\frac{\partial C}{\partial a^L}\odot\frac{\partial a^L}{\partial z^L})\frac{\partial z^L}{\partial W^L} \\ &=(C'(a^L)\odot \sigma'(z^L))(a^{L-1})^T \\\\ \frac{\partial C}{\partial b^L}&=\frac{\partial C}{\partial z^L}\frac{\partial z^L}{\partial b^L} \\ &=C'(a^L)\odot \sigma'(z^L) \end{alignedat}
其中
C'(a^l)=(C'(a^l_1),C'(a^l_2),...,C'(a^l_{nl}))^T
\frac{\partial a^l}{\partial z^l}=\sigma'(z^l) =(\sigma'(z^l_1),\sigma'(z^l_2),...,\sigma'(z^l_{n_l}) )^T
C'(a^l)\odot \sigma'(z^l)=(C'(a^l_1)\sigma'(z^l_1),C'(a^l_2)\sigma'(z^l_2),...,C'(a^l_{nl})\sigma'(z^l_{n_l}) )^T

我們發(fā)現(xiàn),其實(shí)\frac{\partial z^l}{\partial W^l}是很容易求解的,而且求導(dǎo)過(guò)程與其他層沒(méi)有關(guān)系。那么關(guān)鍵就是求\frac{\partial C}{\partial z^l}
我們令\delta^l=\frac{\partial C}{\partial z^l}
\delta^L=C'(a^L)\odot \sigma'(z^L)=(C'(a^l_L)\sigma'(z^l_L),C'(a^l_L)\sigma'(z^l_L),...,C'(a^l_{nL})\sigma'(z^l_{n_L}) )^T, shape=(n_L,1)
如果已知\delta^l 根據(jù)鏈?zhǔn)角髮?dǎo)法則尤其是鏈?zhǔn)较蛄壳髮?dǎo)這個(gè) (其實(shí)這里最重要的就是要確保鏈?zhǔn)角髮?dǎo)的維度最終組合和初始的維度相同,那么對(duì)于向量求導(dǎo)就會(huì)涉及到轉(zhuǎn)置和位置的交換。如果不覺(jué)得有問(wèn)題,完全可以先對(duì)幾個(gè)元素求導(dǎo),然后總結(jié)出規(guī)律后來(lái)指導(dǎo)向量求導(dǎo)的組合)
我們首先約定一些東西。

  • 每次的損失是一個(gè)標(biāo)量,而W則是矩陣。當(dāng)我們求\frac{\partial C}{\partial W^l}時(shí),要保證結(jié)果和W的shape時(shí)一樣的,即shape(\frac{\partial C}{\partial W^l})=shape(W^l)=(n_l,n_{l-1})
  • z^l,a^l,b^l 都是列向量
    \begin{alignedat}{2} shape(\delta^l)&=(n_l,1)\\\\ \delta^{l-1}&=\frac{\partial C}{\partial z^{l-1}}=\frac{\partial C}{\partial z^l}\frac{\partial z^l}{\partial z^{l-1}}=\delta^l\frac{\partial z^l}{\partial z^{l-1}},shape=(n_{l-1},1)\\\\ \frac{\partial z^l}{\partial z^{l-1}}&=\frac{\partial z^l}{\partial a^{l-1}}\odot\frac{\partial a^{l-1}}{\partial z^{l-1}}=(W^{l})^T\odot\sigma'(z^{l-1}),shape=(n_{l-1},n_l) \\\\ so\\\\ \delta^{l-1}&=\delta^l((W^{l})^T\odot\sigma'(z^{l-1})) \end{alignedat}
    但是發(fā)現(xiàn)如上式那么組合的話(huà),維度上是不相容的,所以應(yīng)該調(diào)整成如下式:
    \delta^{l-1}=((W^{l})^T\odot\sigma'(z^{l-1}))\delta^l=(W^{l})^T\delta^l\odot\sigma'(z^{l-1})
    所以反向傳播算法,關(guān)鍵記住如下幾點(diǎn):
    • \delta^L=C'(a^L)\odot\sigma'(z^L)

    • \delta^l=(W^{l+1})^T\delta^{l+1}\odot\sigma'(z^l)

    • \frac{\partial C}{\partial W^l}=\delta^l (a^{l-1})^T

    • \frac{\partial C}{\partial b^l}=\delta^l

MLP 一般訓(xùn)練過(guò)程

隨機(jī)梯度下降:

對(duì)于一個(gè)樣本(x,y)輸入模型
首先,前向傳播記錄下每一層激活值a^l以及權(quán)重W^l
然后,計(jì)算\delta^L以及逐層\delta^l
然后,計(jì)算每層權(quán)重的梯度\frac{\partial C}{\partial W^l},\frac{\partial C}{\partial b^l}
最后,更新每層的權(quán)重
W^l=W^l-\eta\frac{\partial C}{\partial W^l}
b^l=W^l-\eta\frac{\partial C}{\partial b^l}

批量梯度下降

對(duì)于m個(gè)樣本(x,y),依次輸入模型
首先,前向傳播記錄下每一層激活值a^l以及權(quán)重W^l
然后,計(jì)算\delta^L以及逐層\delta^l
然后,計(jì)算每層權(quán)重的梯度\frac{\partial C}{\partial W^l},\frac{\partial C}{\partial b^l}
最后,更新每層的權(quán)重
W^l=W^l-\eta\sum\frac{\partial C}{\partial W^l}
b^l=W^l-\eta\sum\frac{\partial C}{\partial b^l}

不同損失函數(shù)與激活函數(shù)所帶來(lái)的訓(xùn)練的不同

看不清楚請(qǐng)看:http://www.itdecent.cn/p/1d6d7b4857d6

C=\frac{1}{2}(y'-y)^2,\sigma=sigmoid() C=-ylogy'-(1-y)log(1-y'),\sigma=sigmoid() C=-\sum y_ilogy_i',\sigma^l=sigmoid(),\sigma^L=softmax()
導(dǎo)數(shù) C'=y'-y,\sigma'=\sigma(1-\sigma) C'=\frac{1-y}{1-y'}-\frac{y}{y'},\sigma'=\sigma(1-\sigma) C'(a^L_i)=-\frac{1}{a^L_i} , softmax'(z^L_i)=a^L_i(1-a^L_i)
\delta^L=C'\odot\sigma' (a^L-y)\odot\sigma(1-\sigma) a^L-y (0,0,...,a^L_i-1,..,0)^T
\frac{\partial C}{\partial W^L} \delta^L(a^{L-1})^T \delta^L(a^{L-1})^T \delta^L(a^{L-1})^T
\delta^l (W^{l+1})^T\delta^{l+1}\odot\sigma'(z^l) (W^{l+1})^T\delta^{l+1}\odot\sigma'(z^l) (W^{l+1})^T\delta^{l+1}\odot\sigma'(z^l)
\frac{\partial C}{\partial W^l} \delta^l(a^{l-1})^T \delta^l(a^{l-1})^T \delta^l(a^{l-1})^T
\frac{\partial C}{\partial b^l} \delta^l \delta^l \delta^l

對(duì)比前兩列,最大的不同在\delta^L,使用交叉熵的模型少乘了一個(gè)\sigma',而\sigma'往往是很小的(只在0附近比較大),所以第二列會(huì)比第一列收斂快。

但關(guān)鍵是在\delta^l,大家都一樣,但是隨著l的不斷減小,累乘的\sigma'越來(lái)越多,最后導(dǎo)致有的\delta^l越來(lái)越小趨近于0造成梯度消失(因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=0%3Csigmoid'%5Cle0.25" alt="0<sigmoid'\le0.25" mathimg="1">)。這樣導(dǎo)致底層網(wǎng)絡(luò)權(quán)重得不到有效訓(xùn)練。同樣,有的激活函數(shù)導(dǎo)數(shù)可能會(huì)很容易>1,這樣就會(huì)造成梯度爆炸??偨Y(jié)起來(lái)就是,由于反向傳播算法的固有缺陷,在網(wǎng)絡(luò)層數(shù)過(guò)多時(shí),會(huì)出現(xiàn)梯度學(xué)習(xí)問(wèn)題,為了解決有如下常用方法,具體見(jiàn)上鏈接。

  • 針對(duì)梯度爆炸,可以人為設(shè)定最大的梯度值,超過(guò)了就等于最大梯度值。這種做法叫梯度剪切。另外也可以對(duì)權(quán)重做正則化,來(lái)確保每次權(quán)重都不會(huì)太大。
  • 針對(duì)梯度消失,如果激活函數(shù)的導(dǎo)數(shù)=1,那么就不會(huì)出現(xiàn)消失或爆炸,于是提出了ReLu激活函數(shù)
    另外還有殘差網(wǎng)絡(luò),batchnorm等技術(shù)

根本上就是針對(duì)BP的\delta^l的組成,要么從激活函數(shù)導(dǎo)數(shù)入手,要么從權(quán)重W入手,要么從連乘的傳遞結(jié)構(gòu)入手等等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容