Coursea-吳恩達-machine learning學習筆記(九)【week 5之Neural Networks: Learning】

神經網絡模型存在訓練集:
{(x(1),y(1)),(x(2),y(2)),,(x(m),y(m))}
這裏寫圖片描述
常用的符號表示:

  • L :神經網絡的層數;
  • Sl :第l 層的單元數(不包含偏置單元);
  • K :輸出單元的數量。

神經網絡有兩種分類:

  1. 二元分類
    y=01 ,只有1個輸出單元,hΘ(x) 是一個實數,即SL=1
  2. 多類別分類(K 個不同類)
    K 個輸出單元,hΘ(x) 是一個K 維向量,即SL=K(K3)

神經網絡的代價函數:
hΘ(x)Rk(hΘ(x))i 爲第i 個輸出

J(Θ)=1m[i=1mk=1Kyk(i)log((hΘ(x(i)))k)+(1yk(i))log(1(hΘ(x(i)))k)]+λ2ml=1L1i=1Slj=1Sl+1(Θji(l))2

當前Θ 矩陣的列數等於當前層的單元數(包括偏置單元),當前Θ 矩陣的行數等於下一層的單元數(不包括偏置單元)。
上式中的雙重求和將輸出層的每個單元的邏輯迴歸代價相加,三重求和將整個網絡中的所有Θ 的平方相加

反向傳播算法:讓代價函數最小化的算法。
最小化J(Θ) ,我們需要計算J(Θ)Θij(l)J(Θ)

如上圖所示神經網絡,當只有1個訓練樣本(x,y) 時:
前向傳播算法
a(1)=x
Z(2)=Θ(1)a(1)
a(2)=g(Z(2))(add a0(2))
Z(3)=Θ(2)a(2)
a(3)=g(Z(3))(add a0(3))
Z(4)=Θ(3)a(3)
a(4)=hΘ(x)=g(Z(4))
反向傳播算法
δj(l)l 層第j 個單元的誤差
以上圖爲例:δj(4)=aj(4)yj
注:此處aj(4) 等同於(hΘ(x))jyj 即輸出向量的第j 個元素值
將上式向量化:δ(4)=a(4)y
δ(3)=(Θ(3))Tδ(4).g(Z(3))g(Z(3))g(Z(3)) 的導數且g(Z(3))=a(3).(1a(3))
δ(2)=(Θ(2))Tδ(3).g(Z(2))g(Z(2))g(Z(2)) 的導數且g(Z(2))=a(2).(1a(2))
Θij(l)J(Θ)=aj(l)δi(l+1) (忽略λ 正則化項)

當有m 個訓練樣本{(x(1),y(1)),(x(2),y(2)),,(x(m),y(m))} 時:
Δij(l)=0(for all l,i,j) (注:Δδ 的大寫)
fori=1tom:
a(1)=x(i)
利用前向傳播算法計算a(l)(for l=2,3L)
y(i) ,計算δ(L)=a(L)y(i)
計算δ(L1),δ(L2),,δ(2) (注:δ(l)=((Θ(l))Tδ(l+1)).a(l).(1a(l)) )
Δij(l):=Δij(l)+aj(l)δ(l+1) 向量化該式:Δ(l):=Δ(l)+δ(l+1)(a(l))T (注:此處應去掉δ0(l+1) )
  (跳出循環)
 Dij(l):=1m(Δij(l)+λΘij(l))if j0
 Dij(l):=1mΔij(l)if j=0
  (注:Θ(l) 的第1列不正則化,上式可以向量化去掉ij )
 Θij(l)J(Θ)=Dij(l)

對於只有一個輸出單元的神經網絡:δj(l)aj(l) (l 層第j 個單元)的代價誤差;
更正式的表達:δj(l)=Zj(l)cost(i)(j0) 其中,cost(i)=y(i)log(hΘ(x(i)))+(1y(i))log(1hΘ(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×11Theta2 的維度爲10×11Theta3 的維度爲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ϵ (ϵ104 即可)
所以:
θ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 gradApproxDvec

梯度檢測總結:

  1. 利用反向傳播算法計算Dvec (D(1),D(2),D(3) 的展開);
  2. 利用梯度檢測算法計算gradApprox
  3. 確保兩者相近;
  4. 關閉梯度檢測算法,用反向傳播算法學習。

確保在開始訓練模型之前關閉梯度檢測算法,否則運算會很慢。

隨機初始化
當使用梯度下降或高級優化算法時,需要設置初始值:

optTheta = fminunc(@costFunction,initialTheta,options);

對於神經網絡來說,若θ 全初始化爲0,當進行反向傳播算法時,所有的單元會更新成相同的值,故採用下列代碼進行隨機初始化:θij(l)[ϵ,ϵ]
如果Theta110×11 矩陣,Theta210×11 矩陣,Theta31×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

總體總結

訓練神經網絡的步驟

  1. 搭建網絡架構(即神經元連接方式);
    輸入層單元數:特徵集x(i) 的維度
    輸出層單元數:分類的類別數
    如果y{1,2,3,,10} ,要將其改寫成向量y=[1000]or[0100]or[0010][0001]
    默認規則:推薦設置一個隱藏層,如果隱藏層>1 ,則每個隱藏層包含相同數目的單元,對於單層的具體單元數,越多越好,但越多計算量越大,一般隱藏層單元數稍大於特徵數都可以接受;
  2. 隨機初始化權重,將權重初始化爲很小的值,接近於0;
  3. 執行前向傳播算法,獲取每個輸入x(i) 對應的hΘ(x(i))
  4. 利用代碼計算代價函數J(Θ)
  5. 執行反向傳播算法計算Θjk(l)J(Θ)
    for i=1:m,
    {
    執行前向傳播算法和反向傳播算法利用(x(i),y(i)) 獲取激勵a(l) 和誤差δ(l) (for l=2,,L)
    Δ(l):=Δ(l)+δ(l+1)(a(l))T
    }
    計算Θjk(l)J(Θ)
  6. 利用梯度檢測比較反向傳播算法計算得到的Θjk(l)J(Θ) 和通過J(Θ) 梯度下降數值計算得到的Θjk(l)J(Θ) ,然後註釋掉梯度檢測的代碼;
  7. 利用梯度下降或最優化算法最小化J(Θ) ,得到參數Θ
    注:對於神經網絡,J(Θ) 是一個非凸函數,通常得到局部最小值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章