筆記(二)梯度下降與反向傳播算法

梯度下降算法

基于梯度的優(yōu)化是優(yōu)化一個函數(shù)的最終取值。輸入?yún)?shù)\omega,需要優(yōu)化的函數(shù)是J(\omega),基于梯度的優(yōu)化即通過改變\omega使得最大化或最小化J(\omega),稱J(\omega)為目標(biāo)函數(shù)。

對于一元函數(shù)l=J(\omega),它的導(dǎo)數(shù)記為J'(\omega),輸入w發(fā)生微小變化\sigma時,輸出也發(fā)生變化,可以近似為
J(w+\sigma)\approx J(w) + \sigma J'(w)
假設(shè)存在的\sigma足夠小,則有J(w-\sigma *sign(J'(w)))<J(w),其中sign是符號函數(shù)。當(dāng)J'(w)小于0時,隨著w增加,J(w)減小,而當(dāng)J'(w)大于0時,隨著w減小,J(w)才能減小。w的變化方向(+或者-)與導(dǎo)數(shù)J(w)的方向(正負(fù))相反。

多元函數(shù):方向?qū)?shù)與梯度的理解,參考博客https://www.cnblogs.com/wangguchangqing/p/10521330.html#autoid-0-0-0

方向?qū)?shù)

方向?qū)?shù)是指z=f(x,y)在某一點(diǎn)P沿著某個方向l的變化率,是一個==數(shù)值==。記為
\frac {\partial f}{\partial l}={lim}_{\rho \to 0} \frac{f(x+\Delta x,y+\Delta y)-f(x,y)} {\rho}
自點(diǎn)P引射線l,與X正軸方向的夾角為\theta,與函數(shù)z=f(x,y)的交點(diǎn)P'(x+\Delta x,y+\Delta y),函數(shù)在P、P'的增量為f(x+\Delta x,y+\Delta y)-f(x,y),兩點(diǎn)之間的距離\rho = \sqrt {(\Delta x) ^2+ (\Delta y)^2}。若P'沿著l趨近于P,如果增量與距離比值的極限存在,稱該值為函數(shù)在P處的方向?qū)?shù),即公式(2)。

同時,若函數(shù)在P處可微,則有f(x+\Delta x,y+\Delta y)-f(x,y)= \frac {\partial f} {\partial x}\cdot \Delta x +\frac {\partial f} {\partial y} \cdot \Delta y+o(\rho),

兩邊同除以\rho,可以得到
\frac{f(x+\Delta x,y+\Delta y)-f(x,y)} {\rho}= \frac {\partial f} {\partial x}\cdot\cos \theta +\frac {\partial f} {\partial y}\cdot \sin \theta + \frac {o(\rho)} {\rho}
取極限得到
\frac {\partial f}{\partial l}={lim}_{\rho \to 0} \frac{f(x+\Delta x,y+\Delta y)-f(x,y)} {\rho} =f_x \cdot \cos \theta +f_y \cdot \sin \theta

梯度

梯度是指是這樣一個向量:每個元素為函數(shù)對一元變量的偏導(dǎo)數(shù),它的大小即為最大方向?qū)?shù)。梯度記為
\nabla f = gradf(x,y)= \frac {\partial f} {\partial x}\cdot i + \frac {\partial f} {\partial y}\cdot j
梯度與方向?qū)?shù)的聯(lián)系:

設(shè)向量e=\cos \theta *i +\sin \theta*jl同方向,根據(jù)方向?qū)?shù)的計算公式,有
\frac {\partial f}{\partial l} =\frac {\partial f} {\partial x}\cos \theta +\frac {\partial f} {\partial y}\sin \theta = \begin{bmatrix} \frac {\partial f} {\partial x} & \frac {\partial f} {\partial y}\end{bmatrix} \begin{bmatrix} \cos \theta \\ \sin \theta \end{bmatrix} = \nabla f \cdot e =||\nabla f|| \cos<\nabla f,e>
其中\cos<\nabla f,e>表示梯度\nabla f與向量的夾角,||\nabla f||表示梯度的大小。可以看到,當(dāng)方向向量與梯度同方向時,方向?qū)?shù)達(dá)到最大值,且最大值等于梯度的大小。

最大方向?qū)?shù)的等于梯度的模,||\nabla f||=\sqrt{f_x^2+f_y^2},而梯度的方向由梯度向量與X軸的角度給出,\alpha(x,y)=\arctan \frac {f_y}{f_x}

由上述可得,函數(shù)在某點(diǎn)沿著梯度的方向增長最快,逆梯度方向減小最快。因此,要想求得函數(shù)的極小值(或最小值),可以通過沿逆梯度方向變化,不斷下降找到極小值。

eg:

函數(shù)J(\theta) = 2-3\theta_1+4\theta_2 -5\theta_3,則梯度為
\nabla J(\theta)=\begin{bmatrix} \frac {\partial J} {\partial \theta_1} & \frac {\partial J} {\partial \theta_2} & \frac {\partial J} {\partial \theta_3}\end{bmatrix} =\begin{bmatrix}-3 &4 & -5 \end{bmatrix}

梯度下降算法步驟

算法步驟:

給定目標(biāo)函數(shù)f(x)和初始點(diǎn)位置x_0

  1. 計算梯度,取反表示沿逆梯度方向。 \Delta x_t=-\nabla f(x_t)
  2. 計算下一處的值:每次參數(shù)移動的幅度是\sigma,稱為學(xué)習(xí)率。更新后的參數(shù)x_{t+1}=x_t+\sigma \cdot\Delta x_t
  3. 重復(fù)1、2,直至|\Delta x_t| <\epsilon ,其中\epsilon是預(yù)先設(shè)置一個很小的值,滿足條件時結(jié)束。

eg:

函數(shù)J(w)=w^2,它的梯度計算公式為\nabla = 2\cdot w初始位置w=10,使用梯度下降計算極小值。其中學(xué)習(xí)率0.2。

計算過程如下

輪數(shù) 當(dāng)前參數(shù)值w 梯度取反\Delta w_t=-2w 更新后的參數(shù)值w_t+\sigma \cdot \Delta w_t
1 10 -20 6.0
2 6.0 -12.0 3.6
3 3.6 -7.2 2.16
4 2.16 -4.32 1.296
5 1.296 -2.592 0.7776
6 0.7776 -1.5552 0.466560
7 0.466560 -0.933120 0.279936
8 0.279936 -0.559872 0.167962
9 0.167962 -0.335923 0.100777
10 0.100777 -0.201554 0.060466

幾種梯度下降算法

批梯度下降 batch gradient descent (BGD)

在每次參數(shù)更新時使用全部的樣本數(shù)據(jù),\theta_i = \theta_i - \alpha\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)},優(yōu)點(diǎn)是充分利用了全部數(shù)據(jù),保證在足夠多的的迭代后可以達(dá)到最優(yōu),缺點(diǎn)是數(shù)據(jù)量過大時迭代十分緩慢,收斂速度很慢。

隨機(jī)梯度下降 stochastic gradient descent (SGD)

與BGD不同在于,每次使用一個樣本用于更新參數(shù)。\theta_i = \theta_i - \alpha (h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}。優(yōu)點(diǎn)是一次訓(xùn)練一個樣本速度快,但一個樣本決定梯度方向, 可能導(dǎo)致解不是最優(yōu),而且每次樣本方向變化大,不容易很快收斂到最優(yōu)解或局部最優(yōu)解。

小批量梯度算法 Mini-batch gradient descent

每次使用一部分樣本用于更新參數(shù),即batch_size。對一個總樣本數(shù)據(jù)m的數(shù)據(jù)集,每次使用x個樣本,更新公式為\theta_i = \theta_i - \alpha \sum\limits_{j=t}^{t+x-1}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}

batch_size=1時,即為SGD的情況,batch_size=m時,即為BGD的情況。

梯度下降的缺陷

圖片出自《深度學(xué)習(xí)與計算機(jī)視覺、算法原理、框架與代碼實現(xiàn)》

1562770424938.png

函數(shù)的特殊點(diǎn)。從梯度下降的步驟來看,根據(jù)梯度的方向判斷參數(shù)移動的方向,但是當(dāng)J'(w)=0的時候,就無法判斷往哪邊移動。稱J'(w)=0的點(diǎn)為駐點(diǎn)或者臨界點(diǎn)。

函數(shù)會出現(xiàn)存在梯度為0的臨界點(diǎn),但該點(diǎn)不是最小點(diǎn)也不是最大點(diǎn),這種臨界點(diǎn)稱為鞍點(diǎn)(Saddle Point)。

函數(shù)在某一段區(qū)域,梯度很小,且范圍很大,梯度值小于更新條件,此時算法可能會停止迭代,這種區(qū)域稱為停滯區(qū)。

極小值的存在,也會使算法停止迭代,從而得到不準(zhǔn)確的結(jié)果,陷入局部最優(yōu)解的情況。

因此,梯度下降算法的缺陷在于鞍點(diǎn)、停滯區(qū)、極小值的存在。

梯度下降算法通常適用于凸函數(shù)的情況。

梯度下降算法的改進(jìn)

沖量momentum

算法步驟:

給定目標(biāo)函數(shù)f(x)和初始點(diǎn)位置x_0

  1. 計算梯度,取反表示沿逆梯度方向。 \Delta x_t=-\nabla f(x_t)
  2. 計算下一處的值:設(shè)置一個沖量項,V_{t+1}=\gamma v_t + \eta \Delta x_t,更新后的參數(shù)為x_{t+1}=x_t+v_{t+1}
  3. 重復(fù)1、2。

與原始梯度下降算法不一樣的是,更新參數(shù)時,考慮到一個沖量,且沖量每次迭代時要乘以衰減數(shù)。在沖量項的影響下,算法迭代就相當(dāng)于帶上了“慣性”,前次迭代位置前進(jìn)的方向可以影響到下一次迭代。這樣當(dāng)算法經(jīng)過鞍點(diǎn)或是停滯區(qū)時,就不至于停下來做過于緩慢的迭代,而經(jīng)過并不是很“深”的極值時,就可以借助沖量項帶來的“慣性”沖出極值所的“坑”

算法停止的的標(biāo)準(zhǔn)也不再是梯度小于一個閾值。停止算法的標(biāo)準(zhǔn)可以是沖量小于某個值,梯度小于某個值,或是用戶給定一個次數(shù)就停止。

Nesterov Accelerated Gradient Descent (NAG方法)

與加入沖量的改進(jìn)唯一不同是,計算梯度的位置,不是當(dāng)前位置x_t,而是沿當(dāng)前沖量前進(jìn)一步的位置。

給定目標(biāo)函數(shù)f(x)和初始點(diǎn)位置x_0,以及初始動量v_0

  1. 計算梯度,取反表示沿逆梯度方向。 \Delta x_t=-\nabla f(x_t+\gamma v_t)
  2. 計算下一處的值:設(shè)置一個沖量項,V_{t+1}=\gamma v_t + \eta \Delta x_t,更新后的參數(shù)為x_{t+1}=x_t+v_{t+1}
  3. 重復(fù)1、2。
1562773584951.png

反向傳播算法( BackPropagation算法 BP)

此部分參考了一篇博客,https://www.cnblogs.com/charlotte77/p/5629865.html,寫的超級詳細(xì),跟著走了一遍過程,很容易理解反向傳播的計算過程。

此外,參考《機(jī)器學(xué)習(xí)》的BP算法步驟,總結(jié)很簡練,但沒有具體數(shù)據(jù)去實現(xiàn),看著很抽象。

算法的主要思想:

  1. 數(shù)據(jù)集輸入神經(jīng)網(wǎng)絡(luò),經(jīng)過隱藏層,最終達(dá)到輸出層。該過程是前向傳播過程。
  2. 計算輸出結(jié)果與真實結(jié)果存在誤差,因此計算出誤差,并將該誤差從輸出層向隱藏層反向傳播,直至傳播到輸入層。
  3. 在反向傳播的過程中,根據(jù)誤差調(diào)整各種參數(shù)的值;不斷迭代上述過程,直至收斂

eg: 以下圖為例,使用BP算法更新各層參數(shù)。

1562835182331.png
  1. 輸入(0.05,0.1) 計算各級的輸出:

    隱藏層輸入h1_{in}=w_{11}^1*x_1 +w_{21}^1*x_2+b_{11}^1=0.15*0.05+0.2*0.1+0.35=0.3775

    ? 輸入h2_{in}=w_{12}^1*x_1 +w_{22}^1*x_2+b_{12}^1=0.25*0.05+0.3*0.1+0.35=0.3925

    隱藏層輸出:h1_{out}=sigmoid(h1_{in})=0.59326999211 h2_{out}=sigmoid(h2_{in})=0.596884378259767

隱藏層到輸出層:

神經(jīng)元y_1的輸入輸出是[1.10590596705977 0.7513650695523157]

神經(jīng)元y_2的輸入輸出是[1.2249214040964653 0.7729284653214625]

因此,前向傳播的輸出結(jié)果是\begin{bmatrix} 0.7513650695523157 & 0.7729284653214625 \end{bmatrix} 而真實值是\begin{bmatrix} 0.01 & 0.99 \end{bmatrix}

  1. 計算前向傳播的結(jié)果與真實值的誤差 ,使用均方誤差

E_k = \frac 1 2 \sum_i (y_{predict}-y_{truth}) ^2

根據(jù)公式,可以算出總誤差值E_k = \frac 1 2 ((0.7513650695523157-0.01)^2+(0.7729284653214625-0.99)^2)=0.2983711087600027

  1. 反向傳播,更新參數(shù)。
1562838188147.png

誤差的公式
MSE = \frac 1 2 [(y1_{out}-y1_{truth})^2+(y2_{out}-y2_{truth})^2] 其中y1_{truth}、y2_{truth}都是常量

誤差公式中只有輸出值是變量,每個輸出值又是通過各個路徑的參數(shù)“復(fù)合”而來,看成一個復(fù)合函數(shù)。以輸出y1為例:y1_{out} = sigmoid(y1_{in})=sigmoid(h1_{out}*w_5+h2_{out}*w_6+b21),而h1_{out}、h2_{out}等又可以推向輸出層。h1_{out}=sigmoid(h1_{in})=sigmoid(x_1*w1+x2*w2+b_{11})


y1_{out} = sigmoid(y1_{in})=sigmoid(h1_{out}*w_5+h2_{out}*w_6+b_{21})\\=sigmoid(sigmoid(h1_{in})*w5+sigmoid(h2_{in})*w_6+b_{21})\\ =sigmoid(sigmoid(x_1*w1+x2*w2+b_{11})*w_5+sigmoid(x_1*w_3+x_2*w_4+b_{12})+b_{21})

計算誤差與某個參數(shù)w的偏導(dǎo),使用鏈?zhǔn)椒▌t求偏導(dǎo)。

從輸出層到隱藏層的參數(shù)

例如計算w_5對最終損失的影響,偏導(dǎo)公式如下。沒有考慮y2_{out},因為y2的傳播路徑與w5無關(guān)。
\frac {\partial} {\partial w_5}MSE=\frac {\partial MSE} {\partial y1_{out}}*\frac {\partial y1_{out}} {\partial y1_{in}}*\frac {\partial y1_{in}} {\partial w_5}

依次計算該公式的各個部分的值。

MSEy1_{out}的偏導(dǎo),
\frac {\partial MSE} {\partial y1_{out}}=\frac {\partial\frac 1 2 [(y1_{out}-y1_{truth})^2+(y2_{out}-y2_{truth})^2] } {\partial y1_{out}}=y1_{out}-y1_{truth}=0.74136507

y1_{out}y1_{in}的偏導(dǎo),sigmoid函數(shù)的導(dǎo)數(shù)公式是f'(x)=f(x)*(1-f(x))。

根據(jù)計算式y1_{out}=sigmoid(y1_{in})可以算出
\frac {\partial y1_{out}} {\partial y1_{in}}=y1_{out}*(1-y1_{out})=0.75136507*(1-0.75136507)=0.1868156016
y1_{in}w_5的偏導(dǎo),計算式y1_{in}=h1_{out}*w_5+h2_{out}*w_6+b_{21},可以算出
\frac {\partial y1_{in}} {\partial w_5}=h1_{out}=0.59326999211
最后將三者乘起來,得到
\frac {\partial} {\partial w_5}MSE =0.74136507*0.1868156016*0.59326999211=0.08216704052233154
更新w_5的值,w_5=w_5 - \sigma * \frac {\partial} {\partial w_5}MSE=0.4-0.5*0.08216704052233154=0.3589164797388342

其中\sigma是學(xué)習(xí)率,更新公式和梯度下降算法一樣。

總誤差對w_5的偏導(dǎo):(y1_{out}-y1_{truth})*[y1_{out}*(1-y1_{out})]*h1_{out}

同理可得對w_6、w_7、w_8的偏導(dǎo)。
\frac {\partial} {\partial w_6}MSE =(y1_{out}-y1_{truth})*[y1_{out}*(1-y1_{out})]*h2_{out}=0.0826676278049868\\ \frac {\partial} {\partial w_7}MSE =(y2_{out}-y2_{truth})*[y2_{out}*(1-y2_{out})]*h1_{out}=-0.02260254047747507\\ \frac {\partial} {\partial w_8}MSE =(y2_{out}-y2_{truth})*[y2_{out}*(1-y2_{out})]*h2_{out}=-0.022740242215978222
更新后的參數(shù)
w_6 = w_6 - \sigma * \frac {\partial} {\partial w_6}MSE=0.4086661860975066\\ w_7 = w_7 - \sigma * \frac {\partial} {\partial w_7}MSE=0.5113012702387375

偏置更新:y1_{out}=sigmoid(y1_{in}),y1_{in}中的偏置項只有一項,偏導(dǎo)是1。因此復(fù)合后的結(jié)果是\frac {\partial} {\partial b_{21}}MSE =y1_{out}*(y1_{out}-y1_{out})
b_{21}=b_{21}- \sigma * [y1_{out}*(1-y1_{out})] = 0.6-0.5*0.1868156016=0.5065921992\\ b_{22}=b_{22}- \sigma * [y2_{out}*(1-y2_{out})] = 0.6-0.5*0.1755100528=0.5122449736

從隱藏層到輸入層的參數(shù)更新

w_1為例,但是與上面不同的是,w_1會影響到全部的輸出,因為它通過h_1、w_5、w_7傳播到兩個輸出y,因此會有兩個誤差。(這段公式老是報錯。。。只好貼圖了)

image.png

1562858618013.png

如上圖綠色箭頭,每個神經(jīng)元被分為兩塊,左邊表示輸入in,右邊表示輸出out,綠色表示反向傳播的路徑,截止到w1,可以看到,損失對w1的偏導(dǎo),分為兩條路徑,但兩條路徑有部分是共用,即h1_{out}反向傳播到輸入層的部分。

公式(19)的計算過程如下,可以發(fā)現(xiàn)部分運(yùn)算值已經(jīng)在上面的w5到w8部分更新過一次。
\frac {\partial MSE} {\partial y1_{out}}*\frac {\partial y1_{out}} {\partial y1_{in}}= [\frac {\partial\frac 1 2 [(y1_{out}-y1_{truth})^2+(y2_{out}-y2_{truth})^2] } {\partial y1_{out}}] [y1_{out}*(1-y1_{out})]\\=0.74136507*[0.75136507*(1-0.75136507)] =0.13849856154533652

\frac {\partial y1_{in}} {\partial h1_{out}}=w_5=0.4,因為y1_{in}是線性疊加而來,與h1有關(guān)的邊只有w_5
同理可以算出
\frac {\partial MSE} {\partial y2_{out}}*\frac {\partial y2_{out}} {\partial y2_{in}}= (y2_{out}-y2_{truth})*(y2_{out}*(1-y2_{out}))=-0.038098236516556236

\frac {\partial y2_{in}} {\partial h1_{out}}=w_7=0.5,因為y2_{in}是線性疊加而來,與h1有關(guān)的邊只有w_7
從而,公式(19)的括號里的值,計算結(jié)果是
0.13849856154533652*0.4-0.038098236516556236*0.5=0.03635030635985649
計算h1_{out}w_1的偏導(dǎo)。從h1_{out}h1_{in},是一個sigmoid函數(shù),而h1_{in}到輸入是線性疊加,與w_1有關(guān)的項是w1*x1,因此h1_{in}對于w_1的偏導(dǎo)是x_1
\frac {\partial h1_{out}} {\partial h1_{in}}*\frac {\partial h1_{in}} {\partial w_{1}}=h1_{out}*(1-h1_{out})*x_1=0.012065035428616262
綜上,\frac {\partial} {\partial w_1}MSE=0.012065035428616262*0.03635030635985649=0.0004385677340727236

更新w_1的值,w_1=w_1 - \sigma*\frac {\partial} {\partial w_1}MSE=0.14978071613296362

同理,計算對w_2的偏導(dǎo)??梢钥吹脚c計算w_1不同的傳播路徑在于隱藏層到輸入層是連接到x_2這個神經(jīng)元,因此

\frac {\partial} {\partial w_2}MSE=h1_{out}*(1-h1_{out})*x_2*0.03635030635985649=0.0008771354681454472

更新后w2的值是w_2=0.1995614322659273

同理計算w3和w4
\frac {\partial} {\partial w_3}MSE=(\frac {\partial MSE} {\partial y1_{out}}*\frac {\partial y1_{out}} {\partial y1_{in}}*\frac {\partial y1_{in}} {\partial h2_{out}}+ \frac {\partial MSE} {\partial y2_{out}}*\frac {\partial y2_{out}} {\partial y2_{in}}*\frac {\partial y2_{in}} {\partial h2_{out}})*\frac {\partial h2_{out}} {\partial h2_{in}}*\frac {\partial h2_{in}} {\partial w_3}\\ =[(y1_{out}-y1_{truth})*(y1_{out}*(1-y1_{out}))*w_6+(y2_{out}-y2_{truth})*(y2_{out}*(1-y2_{out}))*w8]*\\(h2_{out}*(1-h_2{out}))*x1=0.0004977127352608601

更新后w_3=0.24975114363236958

w4與w3也只有隱藏層反向到輸出的位置不同,對w_4的偏導(dǎo)為0.0009954254705217202,更新后w_4=0.29950228726473915

b_{11}= 0.34998903580664814\\ b_{12}=0.3450228726473914

全部更新一輪后的輸出結(jié)果為\begin{bmatrix} 0.7237123710461725 & 0.7595051820170899 \end{bmatrix},損失由0.29837110876000270變降低到0.2812566048506621

總結(jié):

這部分內(nèi)容,在書上都放在了神經(jīng)網(wǎng)絡(luò)的優(yōu)化方法部分。神經(jīng)網(wǎng)絡(luò)的訓(xùn)練實際上就是通過不斷的訓(xùn)練,通過某種算法更新網(wǎng)絡(luò)各個層級的權(quán)重參數(shù),從而使損失函數(shù)降低。
梯度下降是通過函數(shù)的梯度性質(zhì)來求解函數(shù)最小值,當(dāng)然優(yōu)缺點(diǎn)也很明顯。除了梯度下降,還有牛頓-拉普森法、Adam法等很多其他優(yōu)化算法。
而反向傳播算法,是針對神經(jīng)網(wǎng)絡(luò)逆向優(yōu)化所有參數(shù),達(dá)到一個全局最優(yōu)的解。

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

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