文章目錄
神經網絡:學習(Netural NetWorks:Learning)
1.代價函數(Cost Function)
神經網絡的多元分類:
神經網絡的代價函數公式
:神經網絡的總層數
:輸出層的分類數
:K維向量
:第i個訓練樣本的第k個分量值
:分爲第k個分類的概率
:第層激活單元的數量
說明:
神經網絡代價函數的前一部分與邏輯迴歸中的代價函數類似,區別是,神經網絡這裏討論的時候K分類問題,即公式會對每個樣本特徵都運行K次,並依次給出分爲第k類的概率,
後一部分是正則化項,對每一層的多維權重矩陣平方後,去除偏置權重的部分,然後進行循環累加。
神經網絡求代價函數的方法和邏輯迴歸是一樣的,但是計算複雜,神經網絡的代價函數其實是非凸函數,有局部最小值。不能用梯度下降算法求解代價函數的最小值。
- 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)
爲求解神經網絡最優化的問題,需要計算,求最優解。
在神經網絡中是前向傳播算法得到的,需要從輸入層開始,根據每層的權重矩陣 義詞計算激活單元的值a,然後用a與權重矩陣再去計算下一層的激活單元的值。
在優化代價函數的時候,我們其實是在優化每一層的權重矩陣,算法優化的是權重。
反向傳播算法的具體過程如下
反向傳播算法其實是計算每一層權重矩陣的偏導,算法實際上是對代價函數求導的拆解。
-
對於給定訓練集 ,初始化每層間的誤差和矩陣 ,即令所有的 ,使得每個 爲一個全零矩陣。
-
接下來遍歷所有的樣本實例,對於每一個樣本實例有:
1.運行前向傳播算法,得到初始預測
2.運行反向傳播算法,從輸出層從後往前計算每一層的計算誤差,以此來求取偏導。
輸出層的誤差即爲預測與訓練集結果之間的差值:,
對於隱藏層中的每一層的誤差,都由上一層的誤差與對應的參數矩陣來計算:
隱藏層中, 即爲增加偏置單元后的 , 與 維度匹配,得以完成矩陣運算。
對於隱藏層,有添加偏置單元
解得:,
則有
根據上面的公式可以計算
3.依次求解並累加誤差 ,
向量化實現即:
3.遍歷全部樣本實例,求解完後,最後求得偏導:
: 第 層的誤差向量
: 第 層的第 個激活單元的誤差
: 從第 層的第 個單元映射到第 層的第 個單元的權重代價的偏導(所有樣本實例之和)
:的樣本均值與正則化項之和
這就是反向傳播算法,即從輸出層開始不斷向前迭代,根據上一層的誤差依次計算當前層的誤差,以求得代價函數的偏導。
應用反向傳播(BP)算法的神經網絡被稱爲 BP 網絡,也稱前饋網絡(向前反饋)。
神經網絡中代價函數求導的推導過程,見參考1。
3.實現注意點: 參數展開(Implementation Note: Unrolling Parameters)
在 Octave/Matlab 中,如果要使用類似於 等高級最優化函數,其函數參數、函數返回值等都爲且只爲向量,而由於神經網絡中的權重是多維矩陣,所以需要用到參數展開這個技巧。
這個技巧就是把多個矩陣轉換爲一個長長的向量,便於傳入函數,之後再根據矩陣維度,轉回矩陣即可。
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)梯度的方法,被用於驗證反向傳播算法的正確性。
視爲一個實數,數值估算梯度的原理如上圖所示,即有
其中, 爲極小值,由於太小時容易出現數值運算問題,一般取 。
對於矩陣,有
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 梯度向量後,將其同之前計算的偏導 比較,如果相等或很接近,即說明算法沒有問題。
在確認算法沒有問題後(一般只需運行一次),由於數值估計的梯度檢驗效率很低,所以一定要禁用它。
5.隨機初始化(Random Initialization)
邏輯迴歸中,初始參數向量全爲 0 沒什麼問題,在神經網絡中,情況就不一樣了。
初始權重如果全爲 0,憶及 ,則隱藏層除了偏置單元,都爲 0,而每個單元求導的值也都一樣,這就相當於是在不斷重複計算同一結果,也就是算着算着,一堆特徵在每一層都變成只有一個特徵(雖然有很多單元,但值都相等),這樣,神經網絡的性能和效果都會大打折扣,故需要隨機初始化初始權重。
隨機初始化權重矩陣也爲實現細節之一,用於打破對稱性(Symmetry Breaking),使得 。當然,初始權重的波動也不能太大,一般限定在極小值 範圍內。
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) 內均勻分佈的隨機矩陣。
和梯度下降中的沒有聯繫,這裏只是一個任意實數,給定了權重矩陣初始化值的範圍。
6.綜合起來(Putting It Together)
一般來說,應用神經網絡有如下步驟:
- 神經網絡的建模(後續補充)
.選取特徵,確定特徵向量的維度,輸入單元的數量
.鑑別分類,確定預測向量的維度,輸出單元的數量
.確定隱藏層的數量,以及每層有多少個激活單元
默認情況下,隱藏層至少要有一層,也可以有多層,層數越多一般意味着效果越好,計算量越大。
- 訓練神經網絡
- 隨機初始化初始權重矩陣
- 應用前向傳播算法計算初始預測
- 計算代價函數的值
- 使用後向傳播算法計算的偏導數
- 使用梯度檢測算法檢查算法的正確性,用完禁用
- 讓最優化函數最小化代價函數
由於神經網絡的代價函數非凸,最優化時不一定會收斂在全局最小值處,高級最優化函數能確保收斂在某個局部最小值處。