神經網絡模型存在訓練集:
{(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))}
常用的符號表示:
- L :神經網絡的層數;
- Sl :第l 層的單元數(不包含偏置單元);
- K :輸出單元的數量。
神經網絡有兩種分類:
- 二元分類
y=0 或1 ,只有1個輸出單元,hΘ(x) 是一個實數,即SL=1
- 多類別分類(K 個不同類)
K 個輸出單元,hΘ(x) 是一個K 維向量,即SL=K(K⩾3)
神經網絡的代價函數:
hΘ(x)∈Rk ,(hΘ(x))i 爲第i 個輸出
J(Θ)=−1m[∑i=1m∑k=1Ky(i)klog((hΘ(x(i)))k)+(1−y(i)k)log(1−(hΘ(x(i)))k)]+λ2m∑l=1L−1∑i=1Sl∑j=1Sl+1(Θ(l)ji)2
當前Θ 矩陣的列數等於當前層的單元數(包括偏置單元),當前Θ 矩陣的行數等於下一層的單元數(不包括偏置單元)。
上式中的雙重求和將輸出層的每個單元的邏輯迴歸代價相加,三重求和將整個網絡中的所有Θ 的平方相加
反向傳播算法:讓代價函數最小化的算法。
最小化J(Θ) ,我們需要計算J(Θ) ,∂∂Θ(l)ijJ(Θ) 。
如上圖所示神經網絡,當只有1個訓練樣本(x,y) 時:
前向傳播算法:
⇒a(1)=x
⇒Z(2)=Θ(1)a(1)
⇒a(2)=g(Z(2))(add a(2)0)
⇒Z(3)=Θ(2)a(2)
⇒a(3)=g(Z(3))(add a(3)0)
⇒Z(4)=Θ(3)a(3)
⇒a(4)=hΘ(x)=g(Z(4))
反向傳播算法:
δ(l)j :l 層第j 個單元的誤差
以上圖爲例:⇒δ(4)j=a(4)j−yj
注:此處a(4)j 等同於(hΘ(x))j ,yj 即輸出向量的第j 個元素值
將上式向量化:⇒δ(4)=a(4)−y
⇒δ(3)=(Θ(3))Tδ(4).∗g′(Z(3))g′(Z(3)) 爲g(Z(3)) 的導數且g′(Z(3))=a(3).∗(1−a(3))
⇒δ(2)=(Θ(2))Tδ(3).∗g′(Z(2))g′(Z(2)) 爲g(Z(2)) 的導數且g′(Z(2))=a(2).∗(1−a(2))
⇒∂∂Θ(l)ijJ(Θ)=a(l)jδ(l+1)i (忽略λ 正則化項)
當有m 個訓練樣本{(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))} 時:
設Δ(l)ij=0(for all l,i,j) (注:Δ 是δ 的大寫)
⇒fori=1tom:
⇒ 設a(1)=x(i)
⇒ 利用前向傳播算法計算a(l)(for l=2,3⋯L)
⇒ 用y(i) ,計算δ(L)=a(L)−y(i)
⇒ 計算δ(L−1),δ(L−2),⋯,δ(2) (注:δ(l)=((Θ(l))Tδ(l+1)).∗a(l).∗(1−a(l)) )
⇒Δ(l)ij:=Δ(l)ij+a(l)jδ(l+1) 向量化該式:Δ(l):=Δ(l)+δ(l+1)(a(l))T (注:此處應去掉δ(l+1)0 )
⇒ (跳出循環)
⇒ D(l)ij:=1m(Δ(l)ij+λΘ(l)ij)if j≠0
⇒ D(l)ij:=1mΔ(l)ijif j=0
⇒ (注:Θ(l) 的第1列不正則化,上式可以向量化去掉ij )
⇒ ∂∂Θ(l)ijJ(Θ)=D(l)ij
對於只有一個輸出單元的神經網絡:δ(l)j 爲a(l)j (l 層第j 個單元)的代價誤差;
更正式的表達:δ(l)j=∂∂Z(l)jcost(i)(j⩾0) 其中,cost(i)=y(i)log(hΘ(x(i)))+(1−y(i))log(1−hΘ(x(i)))
利用高級最優化算法最小化J(Θ) :
function[jVal,gradient] = costFunction(theta)
...
optTheta = fminunc(@costFunction,initialTheta,options)
這種方法中,theta,gradient 值均爲向量。
對於神經網絡(4層爲例):
Θ(1),Θ(2),Θ(3) —-矩陣(Theta1,Theta2,Theta3 )
D(1),D(2),D(3) —-矩陣(D1,D2,D3 )
爲了使用優化算法,需要將矩陣展開成向量:
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),Θ(2),Θ(3) ,展開後獲得initialTheta ,傳值給:
fminunc(@costFunction,initialTheta,options)
function[jVal,gradientVec] = costFunction(thetaVec)
上面代價函數costFunction 內的具體步驟如下:
⇒ 從thetaVec 中得到Θ(1),Θ(2),Θ(3) ;
⇒ 使用前向傳播及反向傳播算法計算D(1),D(2),D(3) 及J(Θ) ;
⇒ 展開D(1),D(2),D(3) 獲得gradientVec 。
梯度檢測:可以減少梯度下降存在錯誤的風險。
θ∈Rn (θ 是Θ(1),Θ(2),Θ(3) 的展開向量)
θ=θ1,θ2,θ3,⋯,θn
由於∂∂ΘJ(Θ)≈J(Θ+ϵ)−J(Θ−ϵ)2ϵ (ϵ 取10−4 即可)
所以:
∂∂θ1J(Θ)≈J(θ1+ϵ,θ2,θ3,⋯,θn)−J(θ1−ϵ,θ2,θ3,⋯,θn)2ϵ
∂∂θ2J(Θ)≈J(θ1,θ2+ϵ,θ3,⋯,θn)−J(θ1,θ2−ϵ,θ3,⋯,θn)2ϵ
⋯
∂∂θnJ(Θ)≈J(θ1,θ2,θ3,⋯,θn+ϵ)−J(θ1,θ2,θ3,⋯,θn−ϵ)2ϵ
Octave 中的實現代碼如下:
EPSILON = 1e-4;
for i = 1:n,
thetaPlus = theta;
thetaPlus(i) = thetaPlus(i) + EPSILON;
thetaMinus = theta;
thetaMinus(i) = thetaMinus(i) + EPSILON;
gradApprox(i) = (J(thetaPlus)-J(thetaMinus))/(2*EPSILON);
end;
check gradApprox≈Dvec
梯度檢測總結:
- 利用反向傳播算法計算Dvec (D(1),D(2),D(3) 的展開);
- 利用梯度檢測算法計算gradApprox ;
- 確保兩者相近;
- 關閉梯度檢測算法,用反向傳播算法學習。
確保在開始訓練模型之前關閉梯度檢測算法,否則運算會很慢。
隨機初始化:
當使用梯度下降或高級優化算法時,需要設置初始值:
optTheta = fminunc(@costFunction,initialTheta,options);
對於神經網絡來說,若θ 全初始化爲0,當進行反向傳播算法時,所有的單元會更新成相同的值,故採用下列代碼進行隨機初始化:θ(l)ij∈[−ϵ,ϵ]
如果Theta1 爲10×11 矩陣,Theta2 爲10×11 矩陣,Theta3 爲1×11 矩陣:
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) 爲生成x×y 矩陣,元素值∈(0,1) ;
此處EPSILON 與梯度檢測時的不同,可以取0.12 。
總體總結:
訓練神經網絡的步驟:
- 搭建網絡架構(即神經元連接方式);
輸入層單元數:特徵集x(i) 的維度
輸出層單元數:分類的類別數
如果y∈{1,2,3,⋯,10} ,要將其改寫成向量y=⎡⎣⎢⎢⎢⎢⎢⎢⎢100⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥or⎡⎣⎢⎢⎢⎢⎢⎢⎢010⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥or⎡⎣⎢⎢⎢⎢⎢⎢⎢001⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥⋯⎡⎣⎢⎢⎢⎢⎢⎢⎢000⋮1⎤⎦⎥⎥⎥⎥⎥⎥⎥
默認規則:推薦設置一個隱藏層,如果隱藏層>1 ,則每個隱藏層包含相同數目的單元,對於單層的具體單元數,越多越好,但越多計算量越大,一般隱藏層單元數稍大於特徵數都可以接受;
- 隨機初始化權重,將權重初始化爲很小的值,接近於0;
- 執行前向傳播算法,獲取每個輸入x(i) 對應的hΘ(x(i)) ;
- 利用代碼計算代價函數J(Θ) ;
- 執行反向傳播算法計算∂∂Θ(l)jkJ(Θ) :
for i=1:m,
{
執行前向傳播算法和反向傳播算法利用(x(i),y(i)) 獲取激勵a(l) 和誤差δ(l) (for l=2,⋯,L)
Δ(l):=Δ(l)+δ(l+1)(a(l))T
}
計算∂∂Θ(l)jkJ(Θ) ;
- 利用梯度檢測比較反向傳播算法計算得到的∂∂Θ(l)jkJ(Θ) 和通過J(Θ) 梯度下降數值計算得到的∂∂Θ(l)jkJ(Θ) ,然後註釋掉梯度檢測的代碼;
- 利用梯度下降或最優化算法最小化J(Θ) ,得到參數Θ 。
注:對於神經網絡,J(Θ) 是一個非凸函數,通常得到局部最小值。