神經網絡中的前向后向傳播算法


神經網絡中的代價函數與后向傳播算法

代價(損失)函數

​ 依照慣例,我們仍然首先定義一些我們需要的變量:

L:網絡中的總層數,\(s_l​\):在第l層所有單元(units)的數目(不包含偏置單元),k:輸出單元(類)的數目

​ 回想一下,在神經網絡中,我們可能有很多輸出節點。 我們將\(h_\Theta(x)_k\)表示為導致第k個輸出的假設。 我們的神經網絡的成本函數將是我們用於邏輯回歸的一般化。 回想一下,正則邏輯回歸的成本函數是:

![1.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgqeli4spdj20go012jra.jpg)
​ 對於神經網絡,看起來稍微更加復雜:
![2.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgqelidj2zj20ky01t749.jpg)
​ 我們添加了幾個嵌套求和來以計算多個輸出節點。 在方程的第一部分,在方括號之前,我們有一個額外的嵌套求和循環遍歷輸出節點的數量。在正則化部分中,在方括號之后必須考慮多個theta矩陣。 當前theta矩陣中的列數等於當前層中的節點數(包括偏置單元),當前θ矩陣中的行數等於下一層中的節點數(不包括偏置單位)。 如前所述,邏輯回歸時應對每個術語進行平方。

注意:

  • 兩級求和公式是對於輸出層的每個單元的邏輯回歸代價函數相加求和
  • 三級求和是將所有的\(\Theta\)平方后求和
  • 這里i在三級求和中不是代表第i個案例,而是第l層所有單元(units)的數目(不包含偏置單元)

后向傳播算法

​ “反向傳播”是用於最小化成本函數的神經網絡術語,就像之前在邏輯和線性回歸中的梯度下降一樣。 Goal--目標是計算:\(min_\Theta J(\Theta)\)

​ 也就是說,我們想使用θ中的最佳參數集來最小化我們的成本函數J。 用來計算J(Θ)的偏導數的方程:3.jpg

​ 由上,我們利用以下的算法:

![4.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fgqelj0e5yj20kn0b843x.jpg)
​ (1)對於給定的訓練集{($x^{(1)},y^{(1)}$)....($x^{(m)},y^{(m)}$)},對於訓練集t=1到m:設置$a^{(1)}:=x^{(t)}$,

​ (2)利用前向傳播算法來計算\(a^{(l)}\),其中l=2,3,...,L。具體的計算流程為:

![5.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgqelk07q7j20d8071jt7.jpg)
​ (3)根據$y^{(t)}$計算$\delta^{(L)}=a^{(L)}-y^{(t)}$,其中L是我們的層數,而$a^{(L)}$是輸出層的激勵單元的輸出向量。 所以最后一層的“誤差值”只是利用最后一層的實際結果和y中正確輸出的差異。 要獲得最后一層之前的層的增量值,按照從右到左的步驟。

​ (4)依次計算\(\delta^{(L-1)},\delta^{(L-2)},...,\delta^{(2)}\),主要利用\(\delta^{(l)}=((\Theta^{(l)})^T\delta^{(l+1)}).*a^{(l)}.*(1-a^{(l)})\)

​ 層L的δ是通過在與層L的θ矩陣下一層的δ相乘來計算。 接着以元素方式乘以一個稱為g'的函數,該值是使用\(z^{(l)}\)給出的輸入值進行評估的激勵函數g的導數,即\(g'(z^{(l)})=a^{(l)}.*(1-a^{(l)})\)

​ (5)\(Δ_{i,j}^{(l)}:=Δ_{i,j}^{(l)}+a_j^{(l)}\delta_i^{l+1}\)

​ 或者向量化為:\(\Delta^{(l)}:=\Delta^{(l)}+\delta^{(l+1)}(a^{(l)})^T\)

​ 因此,我們一下總結的公式進行更新:

![6.jpg](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fgqelk9qnqj207a02ta9x.jpg)
​ 大寫的Delta矩陣D是我們作為"accumulator"即加速器,作為加快求和我們一直以來的值,最終計算偏微分的,因此我們有:![7.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgqelkrzcgj203k019a9u.jpg)

直觀了解-后向傳播

​ 一直以來。神經網絡的代價函數為:

![2.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgqelidj2zj20ky01t749.jpg)
​ 當僅考慮一類(輸出單元k=1)的情形,且忽略掉正則化處理,代價函數可以表示為:

\(cost(t)=y^{(t)}log(h_\Theta(x^{(t)}))+(1-y^{(t)})log(1-h_\Theta(x^{(t)}))\)

​ 直觀感受下:\(\delta_j^{(l)}\)是第l層j單元\(a_j^{(l)}\)的誤差,為代價函數的偏微分:

![8.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fgqelkudynj205d021t8i.jpg)
​ 回想一下,導數是與代價函數相切的直線的斜率,所以斜率越陡越不正確(誤差越大)。 讓我們考慮下面的神經網絡,看看如何計算一些$\delta_i^{(l)}$:
![9.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgqellkoj0j20jx082tad.jpg)
​ 在上圖中,為了計算$\delta_2^{(2)}$,我們將權重$\Theta_{12}^{(2)}$和$\Theta_{22}^{(2)}$乘以每個邊緣右側的各自的δ值。 從而有:$\delta_2^{(2)}=\Theta_{12}^{(2)}*\delta_1^{(3)}+\Theta_{22}^{(2)}*\delta_2^{(3)}$。 為了計算每一個可能的$\delta_j^{(l)}$,我們可以從圖的右側開始計算。 我們可以將我們的邊緣看作是我們的$\Theta_{ij}$。 從右到左,計算$\delta_j^{(l)}$的值,可以將每個權重乘以δ的所有和。此外,$\delta_2^{(3)}=\Theta_{12}^{(3)}*\delta_1^{(4)}$。

后向傳播算法的實際應用

實現注意事項:展開參數

​ 對於神經網絡,我們有以下矩陣集:

\(\Theta^{(1)},\Theta^{(2)},\Theta^{(3)}...\)

\(D^{(1)},D^{(2)},D^{(3)}...\)

​ 為了使用諸如“fminunc()”的優化函數,首先要“展開”所有元素並將它們放入一個長向量中:

thetaVector = [ Theta1(:); Theta2(:); Theta3(:); ]
deltaVector = [ D1(:); D2(:); D3(:) ]

​ 如果參數Theta1的維度為10*11,Theta2的維度為10*11,Theta3的維度為1*11,我們可以按照以下的方式展開矩陣:

Theta1 = reshape(thetaVector(1:110),10,11)
Theta2 = reshape(thetaVector(111:220),10,11)
Theta3 = reshape(thetaVector(221:231),1,11)

​ 總結如下:

![1.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgqpxga98dj20eu061dhu.jpg)
### 梯度檢測

​ 梯度檢查將確保我們的反向傳播按預期工作。 我們可以用以下方法近似我們的成本函數的導數:

![2.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgqpxgqkm5j207101xq2q.jpg)
​ 對於多個theta矩陣,我們可以如下近似相對於$\Theta_j$的導數:
![3.jpg](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgqpxhapw3j20eb022jr8.jpg)
​ $\epsilon$的取值一般如:$\epsilon=10^{-4}$保證了數學運算正常。 但如果ε的值太小,我們可能會遇到數值問題。因此,我們只是將$\Theta_j$增加或減去ε矩陣。 具體如下:
epsilon = 1e-4;
for i = 1:n,
  thetaPlus = theta;
  thetaPlus(i) += epsilon;
  thetaMinus = theta;
  thetaMinus(i) -= epsilon;
  gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;

​ 我們以前看過如何計算deltaVector。 所以一旦我們計算了我們的gradApprox向量,我們可以檢查gradApprox≈deltaVector。一旦驗證了您的反向傳播算法是否正確,您就不需要再次計算gradApprox實際上計算gradApprox的代碼可能非常慢。

隨機初始化

​ 將所有theta權重初始化為零不適用於神經網絡(當權重初始化為零時,可以推出隨着梯度的不斷更新,參數會回到原始值,即神經網絡的性能下降)。 當我們反向傳播時,所有節點將重復更新為相同的值。 相反,我們可以使用以下方法隨機初始化我們的Θ矩陣的權重:

![4.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fgqpxhh90jj20ft07hjs4.jpg)
​ 因此,我們將每個$\Theta_{ij}^{(l)}$初始化為[-ε,ε]之間的隨機值。 使用上述公式保證我們得到所需的界限。 同樣的過程適用於所有的Θ。 以下是一些實際上的工作代碼。
If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.

Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;

​ rand(x,y)只是octave軟件中自帶的一個隨機函數,生成值在0-1之間。

(知識點匯集)Putting it together

​ 首先,挑選出一種NN架構:選擇你的NN的層數,包含在每一層中所出現的隱藏單元數量,與你一共想擁有多少層。

  • 輸入單元數=特征集\(x^{(i)}\)的維度

  • 輸出層單元數=欲分類的數目

  • 每層的隱藏單元數=一般越多越好-性能越佳(隨着隱藏單元數目的增加,相應地必須增加計算量)

  • 默認:包含一個隱藏層。如果,多余一個隱藏層,建議在每一個隱藏層擁有相同的單元數

訓練一個神經網絡

1.隨機初始化權重

2.利用前向傳播函數對每個\(x^{(i)}\)計算假設值\(h_\Theta(x^{(i)})\)

3.計算代價函數

4.通過后向傳播函數計算偏微分值

5.使用梯度檢查確認您的反向傳播是否有效。 然后禁用梯度檢查。

6.使用梯度下降或內置優化函數,以最小化theta中權重的成本函數。

​ 在前向和后向傳播的計算中,對每一個訓練樣本都做相同的循環計算:

for i = 1:m,
   Perform forward propagation and backpropagation using example (x(i),y(i))
   (Get activations a(l) and delta terms d(l) for l = 2,...,L

​ 下圖給出了實現神經網絡發生的具體過程:

![5.jpg](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fgqpxiazqcj20di07xwgy.jpg)
​ 理想情況下,希望$h_\Theta(x^{(i)})\approx y^{(i)}$。 這將使代價函數最小化。 然而,請記住$J(\Theta)$不是凸的,因此我們可以以局部最小值來結束。


免責聲明!

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



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