神經網絡的學習(Neural Networks: Learning)
9.1 代價函數 Cost Function
參考視頻: 9 - 1 - Cost Function (7 min).mkv
假設神經網絡的訓練樣本有𝑚個,每個包含一組輸入 𝑥 和一組輸出信號 𝑦,𝐿 表示神經網絡層數,𝑆𝐼表示每層神經元的個數( 𝑆𝑙 表示輸出層神經元個數),𝑆𝐿代表最后一層中處理單元的個數。
神經網絡分類分兩種:
(1)二類分類:𝑆𝐿 = 0, 𝑦 = 0 𝑜𝑟 1表示哪一類;
(2)𝐾類分類:𝑆𝐿 = 𝑘, 𝑦𝑖 = 1表示分到第 i 類;(𝑘 > 2)
之前定義邏輯回歸的Cost Function如下(前半部分表示hypothesis與真實值之間的距離,后半部分是對參數進行regularization的bias項):

神經網絡的 cost function 同理:
原理都是希望得到預測結果與真實情況的誤差。不同的是結果有k個。hypothesis與真實值之間的距離為 每個樣本—每個個類輸出的加和。
對參數進行regularization的bias項是排除了每一層𝜃0后,每一層的 𝜃 矩陣平方和。即所有參數的平方和。
9.2 反向傳播算法
參考視頻: 9 - 2 - Backpropagation Algorithm (12 min).mkv
為了最小化 J(Θ),需要求偏導。
采用一種反向傳播算法:首先計算最后一層(最右)的誤差,然后再反向(向左)求出各層的誤差,直到倒數第二層(第一層是輸入變量,不存在誤差)。

(1)最后一層誤差是激活單元的預測 aj(4) 與實際值 𝑦j之間的誤差( j = 1:𝑘),設其為 𝛿j(4)
𝛿(4) = 𝑎(4) - 𝑦
(2)計算第三層的誤差:
𝛿(3) = (𝛩(3))𝑇𝛿(4) ∗ 𝑔′(𝑧(3))
其中(𝜃(3))𝑇𝛿(4) 則是權重導致的誤差的和, 𝑔′(𝑧(3))是 sigmoid函數的導數,sigmoid函數導數有一個特點:
𝑔′(𝑧(3)) = 𝑎(3)∗(1−𝑎(3))。
(3)計算第二層的誤差:
𝛿(2)=(𝛩(2))𝑇𝛿(3)∗𝑔′(𝑧(2))
(4)有了誤差,開始計算代價函數的偏導。假設 𝜆=0(即不做任何正則化處理),有:

𝑙 :目前所計算的是第幾層。
𝑗 :目前層中的激活單元下標(下一層的第 j 個輸入變量的下標)
𝑖 :下一層中誤差單元的下標(受到權重矩陣中第 𝑖 行影響的下一層中誤差的下標)
上面得到了error變量δ的計算,下面來看backpropagation算法的偽代碼 :

然后計算代價函數的偏導數,公式如下:

9.3 反向傳播算法的直觀理解
參考視頻 : 9 - 3 - Backpropagation Intuition (13 min).mkv
現在說反向傳播模型的學習過程。
首先,前向傳播算法forward propagation 從前往后計算z(j),a(j) 的過程如下:

然后將原cost function 進行簡化,去掉regularization項,得到 cost(i):


即對於每一層來說,δ分量都等於后面一層所有的δ的加權和,其中權值就是參數θ:

9.4 實現注意:展開參數
參考視頻 : 9 - 4 - Implementation Note_ Unrolling Parameters (8 min).mkv
在Octave中,如果要使用fminc這樣的優化算法來求解權重矩陣,需要將矩陣展開成為向量,再利用算法求出最優解后再重新轉回矩陣。

假設有三個權重矩陣:Theta1,Theta2,Theta3 。下面是將其向量化 unroll into vector,再變回矩陣的方法。

實例代碼如下:
>> Theta1 = ones(10,11) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 >> Theta2 = 2*ones(10,11) 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 >> Theta3 = 3*ones(1,11) 3 3 3 3 3 3 3 3 3 3 3
轉成向量:
>> thetaVec = [Theta1(:);Theta2(:);Theta3(:)];
>> size(thetaVec) 231 1
轉回矩陣:
>> reshape(thetaVec(1:110),10,11) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 >> reshape(thetaVec(111:220),10,11) 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 >> reshape(thetaVec(221:231),1,11) 3 3 3 3 3 3 3 3 3 3 3
9.5 梯度檢驗
參考視頻 : 9 - 5 - Gradient Checking (12 min).mkv
為了驗證復雜模型內部是否呀運行正常,我們是用一種叫做 Numerical gradient checking的方法來驗證梯度是否在下降。
對於下面這個J(θ)圖,取θ點左右各一點(θ+ε),(θ-ε),則點θ的導數(梯度)近似等於(J(Θ+ε)-J(θ-ε))/(2ε)。

因此,針對每個θ,其導數都可以近似為:

將這個近似值,與back-propagation算法中每一步得到的J(θ)的導數D(derivative)進行比較。如果這兩個結果相近,則code正確,否則錯誤。上面描述的算法如下:

步驟:
- 在 back propagation 中計算出J(θ)對θ的導數D,並向量化成Dvec(unroll D(1),D(2),D(3))
- 用 numerical gradient check 方法計算梯度近似值 gradApprox
- 確保這兩個值很接近
-(這一點非常重要)只在測試的時候進行校驗。真正使用 back propagation 進行神經網絡學習的時候,要停止校驗,否則會非常慢
9.6 隨機初始化
參考視頻 : 9 - 6 - Random Initialization (7 min).mkv
之前對於邏輯回歸,我們將參數θ全部初始化為0。 然而對於神經網絡,此方法不可行: 如果第一層參數θ都相同(不管是不是0),意味着第二層的所有激活單元的值會完全相同。
注:這里考了幾道選擇題。

通常初始參數為正負 ε 之間的隨機值,代碼如下:

9.7 綜合起來
參考視頻 : 9 - 7 - Putting It Together (14 min).mkv
選擇神經網絡。通常情況下隱藏層神經單元的個數越多越好。

訓練神經網絡:
1. 參數的隨機初始化
2. 利用正向傳播方法計算所有的 ℎ𝜃(𝑥)
3. 編寫計算代價函數 𝐽 的代碼
4. 利用反向傳播方法計算所有偏導數
5. 利用數值檢驗方法這些偏導
6. 使用優化算法來最小代價函數


神經網絡的直觀表示如下。因為J(𝜃)不是一個凸函數,因此我們可以到達一個局部最小點。

9.8 自主駕駛
參考視頻 : 9 - 8 - Autonomous Driving (7 min).mkv
ALVINN (Autonomous Land Vehicle In a Neural Network) 是一個基於神經網絡的智能系統

https://blog.csdn.net/u010223750/article/details/50534451
神經網絡過擬合有兩種情況,可以通過兩種方式解決:
(1)引入Validate 數據集
(2)規則化
加入規則化因子之后,整個模型其實是奔着選取較小的 w 而進化的,因為如果需要損失函數值小的話,一旦選取了比較大的 w,那么只有等式右邊第一項式子的值比較小的情況下才行,因此規則化的目的其實是減輕比較大的 w 值對損失函數的影響,為什么需要這么做,我們假設對於線性回歸而言,有一個數據特別偏離主模型,這樣的話,往往會導致模型受這個影響比較大,從而偏離主模型,這時候就需要抵消這個數據對結果的影響,這就用到了規范化,目的是消除其某些損失函數值過大的點影響,對於神經網絡,正則化的目的是為了消除太大的 w 對結果的影響,其結果就是局部的變化因素(個別 w 的變化)不會影響整個模型的數據,只有對全部模型起變化的因素才能影響到模型的建立,這樣就消除了局部噪聲的影響。
