參數(shù)展開
在神經(jīng)網(wǎng)絡(luò)中,我們有一些參數(shù)矩陣,例如:
有時為了使用方便,需要將這些矩陣統(tǒng)一到一個向量中去
thetaVector = [ Theta1(:); Theta2(:); Theta3(:); ]
deltaVector = [ D1(:); D2(:); D3(:) ]
這樣就合并了三個矩陣,
假如 是一個
的矩陣,
是一個
的矩陣,
是一個
的矩陣
則 thetaVector 是一個的矩陣
當要使用時,同樣要將這一個向量,拆分成三個矩陣:
Theta1 = reshape(thetaVector(1:30),5,6)
Theta2 = reshape(thetaVector(31:60),5,6)
Theta3 = reshape(thetaVector(61:66),1,6)
隨機初始化
在邏輯回歸里,使用梯度下降算法時,需要初始化,這里可以設(shè)置成零向量
,元素全為0的向量。
但是在神經(jīng)網(wǎng)絡(luò)里,這樣做不行。
舉例說明,假設(shè)
...
這樣
當反向傳播時會發(fā)現(xiàn)每層的每個節(jié)點都是一樣的,這樣算法就會出現(xiàn)對稱問題。
因此初始化的時候要隨機一些初始值。初始化不同的隨機址會打破對稱問題。
將內(nèi)每個值都隨機在
之間。(
)
例如:
Theta1 = rand(10,11) * (2init_epsilon) - init_epsilon;
Theta2 = rand(1,11) * (2init_epsilon) - init_epsilon;
rand(x,y)是一個初始化一個 維的,其內(nèi)之在0, 1之間的隨機值。
梯度檢驗(Gradient Checking)
在使用反向傳播算法時,因為反向傳播有很多復(fù)雜的細節(jié),這些細節(jié)會導(dǎo)致一些bug,雖然代價函數(shù)的值在減小,但是可能的結(jié)果和實際的還是有很大誤差。
梯度檢驗可以減少這種錯誤的概率。
在數(shù)學上
PS:這個和初始化隨機的參數(shù)不一樣
是一個很小的值,例如
對于多個
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;
將反向傳播計算的DVec和梯度校驗計算的gradApprox比較一下,兩者一致則說明算法沒有問題。但是在最終使用反向傳播取訓(xùn)練樣本集時,關(guān)掉梯度校驗,因為這個非常耗時。
隱藏層
每個隱藏層的單元數(shù)理論上越多準確度越好,但是實際上為了和計算成本平衡,需要選擇何時的隱藏層單元數(shù)量。一般隱藏層單元數(shù)目稍大于輸入層的特征值數(shù)。
隱藏層的數(shù)量越多,算法準確度越高,相應(yīng)的計算成本也會增高,一般來說1個隱藏層。如果有多個隱藏層,建議在每個隱藏層中使用相同數(shù)量的單元。
轉(zhuǎn)載自:
https://codeeper.com/2020/01/20/tech/machine_learning/neural_network_backpropagation.html