week5_神經網絡

神經網絡:學習(Netural NetWorks:Learning)

1.代價函數(Cost Function)


神經網絡的多元分類:
神經網絡的代價函數公式J(Θ)=1mi=1mk=1K[yk(i)log(hθ(x(i))k)+(1yk(i))log(1hθ(x(i))k)]+λ2ml=1L1i=1slj=1sl+1(Θj,i(l))2J{(\Theta)}=- \frac{1}{m}\displaystyle\sum_{i=1}^m\sum_{k=1}^K[y^{(i)}_klog(h_{\theta}(x^{(i)})_k)+(1-y^{(i)}_k)log(1-h_{\theta}(x^{(i)})_k)]+\frac{\lambda}{2m}\displaystyle\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_l+1}(\Theta_{j,i}^{(l)})^2

LL:神經網絡的總層數
KK:輸出層的分類數
yy:K維向量
yk(i)y_k^{(i)}:第i個訓練樣本的第k個分量值
hΘ(x)kh_\Theta(x)_k:分爲第k個分類的概率P(y=kx;Θ)P(y=k|x;\Theta)
sls_l:第ll層激活單元的數量

說明:
神經網絡代價函數的前一部分與邏輯迴歸中的代價函數類似,區別是,神經網絡這裏討論的時候K分類問題,即公式會對每個樣本特徵都運行K次,並依次給出分爲第k類的概率,hθ(x)R,yRh_\theta(x)\in\Reals,y\in\Reals
後一部分是正則化項,對每一層的多維權重矩陣Θ(l)R(sl+1)sl+1\Theta^{(l)}\in\Reals^{(s_l+1)*s_{l+1}}平方後,去除偏置權重的部分,然後進行循環累加。

神經網絡求代價函數的方法和邏輯迴歸是一樣的,但是計算複雜,神經網絡的代價函數其實是非凸函數,有局部最小值。不能用梯度下降算法求解代價函數的最小值。

  • the double sum simply adds up the logistic regression costs calculated for each cell in the output layer
  • the triple sum simply adds up the squares of all the individual Θs in the entire network.
  • the i in the triple sum does not refer to training example i

2.反向傳播算法(Backpropagation Algorithm)


爲求解神經網絡最優化的問題,需要計算θJ(Θ)\frac{\partial}{\partial\theta}J(\Theta),求最優解。
在神經網絡中hθ(x)h_\theta(x)是前向傳播算法得到的,需要從輸入層開始,根據每層的權重矩陣 Θ\Theta義詞計算激活單元的值a,然後用a與權重矩陣Θ\Theta再去計算下一層的激活單元的值。

在優化代價函數的時候,我們其實是在優化每一層的權重矩陣,算法優化的是權重。

反向傳播算法的具體過程如下
在這裏插入圖片描述
反向傳播算法其實是計算每一層權重矩陣的偏導θJ(Θ)\frac{\partial}{\partial\theta}J(\Theta),算法實際上是對代價函數求導的拆解。

  1. 對於給定訓練集(x(1),y(1))...(x(m),y(m)){(x^{(1)},y^{(1)})...(x^{(m)},y^{(m)})} ,初始化每層間的誤差和矩陣 Δ\Delta,即令所有的Δi,j(l)=0\Delta_{i,j}^{(l)}=0 ,使得每個 Δ(l)\Delta^{(l)}爲一個全零矩陣。

  2. 接下來遍歷所有的樣本實例,對於每一個樣本實例有:
    1.運行前向傳播算法,得到初始預測a(L)=hθ(x)a^{(L)}=h_\theta(x)
    2.運行反向傳播算法,從輸出層從後往前計算每一層的計算誤差δ(l)\delta^{(l)},以此來求取偏導。

在這裏插入圖片描述
輸出層的誤差即爲預測與訓練集結果之間的差值:δ(l)=a(l)y\delta^{(l)}=a^{(l)}-y,
對於隱藏層中的每一層的誤差,都由上一層的誤差與對應的參數矩陣來計算:δ(l)=(Θ(l))Tδ(l+1).a(l)z(l)forl:=L1,L2,...2\delta^{(l)}= (\Theta^{(l)})^T\delta^{(l+1)}.*\frac{\partial a^{(l)}}{\partial z^{(l)}}\quad for \quad l:=L-1,L-2,...2

隱藏層中, a(l)a^{(l)}即爲增加偏置單元后的g(z(l))g(z^{(l)})a(l)a^{(l)}Θ(l)\Theta^{(l)}維度匹配,得以完成矩陣運算。
對於隱藏層,有a(l)=g(z(l))a^{(l)}=g(z^{(l)})添加偏置單元a0(l)=1a_0^{(l)}=1
解得:z(l)g(z(l))=g(z(l))=g(z(l)).(1g(z(l)))\frac{\partial }{\partial z^{(l)}}g(z^{(l)})=g'(z^{(l)})=g(z^{(l)}).*(1-g(z^{(l)})),
則有δ(l)=(Θ(l))Tδ(l+1).a(l).(1a(l))\delta^{(l)}=(\Theta^{(l)})^T\delta^{(l+1)}.*a^{(l)}.*(1-a^{(l)})
根據上面的公式可以計算δ(L),δ(L1),...,δ(2)\delta^{(L)},\delta^{(L-1)},...,\delta^{(2)}
3.依次求解並累加誤差 Δi,j(l):=Δi,j(l)+aj(l)δi(l+1)\Delta_{i,j}^{(l)}:=\Delta_{i,j}^{(l)}+a_j^{(l)}\delta_i^{(l+1)}
向量化實現即:Δ(l):=Δ(l)+δ(l+1)(aj(l))T\Delta^{(l)}:=\Delta^{(l)}+\delta^{(l+1)}(a_j^{(l)})^T

3.遍歷全部樣本實例,求解完Δ\Delta後,最後求得偏導:θ(i,j)(l)J(Θ)=Di,j(l)\frac{\partial}{\partial \theta_{(i,j)}^{(l)}}J(\Theta)=D_{i,j}^{(l)}

  • Di,j(l)=1m(Δi,j(l)+λΘi,j(l)),ifj!=0D_{i,j}^{(l)}=\frac{1}{m}(\Delta_{i,j}^{(l)}+\lambda\Theta_{i,j}^{(l)}),\quad if j!= 0
  • Di,j(l)=1mΔi,j(l),ifj=0D_{i,j}^{(l)}=\frac{1}{m}\Delta_{i,j}^{(l)},\quad if j= 0

δ(l)\delta^{(l)} : 第 ll層的誤差向量
δi(l)\delta^{(l)}_i: 第 ll層的第 ii個激活單元的誤差
Δi,j(l)\Delta_{i,j}^{(l)}: 從第 ll層的第 jj個單元映射到第 l+1l+1層的第 ii個單元的權重代價的偏導(所有樣本實例之和)
Di,j(l)D_{i,j}^{(l)}:Δi,j(l)\Delta_{i,j}^{(l)}的樣本均值與正則化項之和

這就是反向傳播算法,即從輸出層開始不斷向前迭代,根據上一層的誤差依次計算當前層的誤差,以求得代價函數的偏導。

應用反向傳播(BP)算法的神經網絡被稱爲 BP 網絡,也稱前饋網絡(向前反饋)。
神經網絡中代價函數求導的推導過程,見參考1。

3.實現注意點: 參數展開(Implementation Note: Unrolling Parameters)


在 Octave/Matlab 中,如果要使用類似於 fminuncfminunc 等高級最優化函數,其函數參數、函數返回值等都爲且只爲向量,而由於神經網絡中的權重是多維矩陣,所以需要用到參數展開這個技巧。

這個技巧就是把多個矩陣轉換爲一個長長的向量,便於傳入函數,之後再根據矩陣維度,轉回矩陣即可。

Octave/Matlab 代碼:

% 多個矩陣展開爲一個向量
Theta1 = ones(11, 10);    % 創建維度爲 11 * 10 的矩陣
Theta2 = ones(2, 4) * 2;  % 創建維度爲 2 * 4 的矩陣
ThetaVec = [Theta1(:); Theta2(:)]; % 將上面兩個矩陣展開爲向量
​
% 從一個向量重構還原回多個矩陣
Theta1 = reshape(ThetaVec(1:110), 11, 10)
Theta2 = reshape(ThetaVec(111:118), 2, 4)
% Theta2 = reshape(ThetaVec(111:(111 + 2 * 4) - 1), 2, 4)

reshape(A,m,n): 將向量 A 重構爲 m * n 維矩陣。

4.梯度檢驗(Gradient Checking)


由於神經網絡模型中的反向傳播算法較爲複雜,在小細節非常容易出錯,從而無法得到最優解,故引入梯度檢驗。

梯度檢驗採用數值估算(Numerical estimation)梯度的方法,被用於驗證反向傳播算法的正確性。
在這裏插入圖片描述
Θ\Theta爲一個實數,數值估算梯度的原理如上圖所示,即有ΘJ(Θ)J(Θ+ϵ)J(Θϵ)2ϵ\frac{\partial}{\partial\Theta}J(\Theta)\approx\frac{J(\Theta+\epsilon)-J(\Theta-\epsilon)}{2\epsilon}
其中, ϵ\epsilon爲極小值,由於太小時容易出現數值運算問題,一般取10410^{-4}
對於矩陣Θ\Theta,有ΘjJ(Θ)J(Θ1+,...,Θj+ϵ+...Θn)J(Θ1+,...,Θjϵ+...Θn)2ϵ\frac{\partial}{\partial\Theta_j}J(\Theta)\approx\frac{J(\Theta_1+,...,\Theta_{ j + \epsilon}+...\Theta_n)-J(\Theta_1+,...,\Theta_{ j - \epsilon}+...\Theta_n)}{2\epsilon}

Octave/Matlab 代碼:

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

在得出 gradApprox 梯度向量後,將其同之前計算的偏導 DD比較,如果相等或很接近,即說明算法沒有問題。

確認算法沒有問題後(一般只需運行一次),由於數值估計的梯度檢驗效率很低,所以一定要禁用它。

5.隨機初始化(Random Initialization)

邏輯迴歸中,初始參數向量全爲 0 沒什麼問題,在神經網絡中,情況就不一樣了。

初始權重如果全爲 0,憶及z(l)=Θ(l1)a(l1)z^{(l)}=\Theta^{(l-1)}a^{(l-1)} ,則隱藏層除了偏置單元,都爲 0,而每個單元求導的值也都一樣,這就相當於是在不斷重複計算同一結果,也就是算着算着,一堆特徵在每一層都變成只有一個特徵(雖然有很多單元,但值都相等),這樣,神經網絡的性能和效果都會大打折扣,故需要隨機初始化初始權重。

隨機初始化權重矩陣也爲實現細節之一,用於打破對稱性(Symmetry Breaking),使得Θij(l)[ϵ,ϵ]\Theta^{(l)}_{ij}\in[-\epsilon,\epsilon] 。當然,初始權重的波動也不能太大,一般限定在極小值 ϵ\epsilon範圍內。

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(m,n): 返回一個在區間 (0,1) 內均勻分佈的隨機矩陣。
ϵ:\epsilon:和梯度下降中的ϵ\epsilon沒有聯繫,這裏只是一個任意實數,給定了權重矩陣初始化值的範圍。

6.綜合起來(Putting It Together)

一般來說,應用神經網絡有如下步驟:

  1. 神經網絡的建模(後續補充)
    .選取特徵,確定特徵向量xx的維度,輸入單元的數量
    .鑑別分類,確定預測向量的維度,輸出單元的數量
    .確定隱藏層的數量,以及每層有多少個激活單元

默認情況下,隱藏層至少要有一層,也可以有多層,層數越多一般意味着效果越好,計算量越大。

  1. 訓練神經網絡
    • 隨機初始化初始權重矩陣
    • 應用前向傳播算法計算初始預測
    • 計算代價函數J(Θ)J(\Theta)的值
    • 使用後向傳播算法計算J(Θ)J(\Theta)的偏導數
    • 使用梯度檢測算法檢查算法的正確性,用完禁用
    • 讓最優化函數最小化代價函數

    由於神經網絡的代價函數非凸,最優化時不一定會收斂在全局最小值處,高級最優化函數能確保收斂在某個局部最小值處。

參考

  1. https://scruel.gitee.io/ml-andrewng-notes/week5.html#header-n138
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章