神經網絡中的代價函數與后向傳播算法
代價(損失)函數
依照慣例,我們仍然首先定義一些我們需要的變量:
L:網絡中的總層數,\(s_l\):在第l層所有單元(units)的數目(不包含偏置單元),k:輸出單元(類)的數目
回想一下,在神經網絡中,我們可能有很多輸出節點。 我們將\(h_\Theta(x)_k\)表示為導致第k個輸出的假設。 我們的神經網絡的成本函數將是我們用於邏輯回歸的一般化。 回想一下,正則邏輯回歸的成本函數是:
注意:
- 兩級求和公式是對於輸出層的每個單元的邏輯回歸代價函數相加求和
- 三級求和是將所有的\(\Theta\)平方后求和
- 這里i在三級求和中不是代表第i個案例,而是第l層所有單元(units)的數目(不包含偏置單元)
后向傳播算法
“反向傳播”是用於最小化成本函數的神經網絡術語,就像之前在邏輯和線性回歸中的梯度下降一樣。 Goal--目標是計算:\(min_\Theta J(\Theta)\)
也就是說,我們想使用θ中的最佳參數集來最小化我們的成本函數J。 用來計算J(Θ)的偏導數的方程:
由上,我們利用以下的算法:
(2)利用前向傳播算法來計算\(a^{(l)}\),其中l=2,3,...,L。具體的計算流程為:
(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\)
因此,我們一下總結的公式進行更新:
直觀了解-后向傳播
一直以來。神經網絡的代價函數為:
\(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)}\)的誤差,為代價函數的偏微分:
后向傳播算法的實際應用
實現注意事項:展開參數
對於神經網絡,我們有以下矩陣集:
\(\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)
總結如下:
梯度檢查將確保我們的反向傳播按預期工作。 我們可以用以下方法近似我們的成本函數的導數:
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權重初始化為零不適用於神經網絡(當權重初始化為零時,可以推出隨着梯度的不斷更新,參數會回到原始值,即神經網絡的性能下降)。 當我們反向傳播時,所有節點將重復更新為相同的值。 相反,我們可以使用以下方法隨機初始化我們的Θ矩陣的權重:
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
下圖給出了實現神經網絡發生的具體過程:
