吴恩达《机器学习》学习笔记十——神经网络相关(2)
吳恩達《機器學習》學習筆記十——神經網絡相關(2)
- 一、 代價函數
- 二、 反向傳播算法
- 三、 理解反向傳播算法
- 四、 梯度檢測
- 五、 隨機初始化
- 1.全部初始化為0的問題
- 2.隨機初始化的思想
- 六、 神經網絡算法整體流程
- 1.選擇網絡具體架構
- 2.訓練神經網絡
課程鏈接: https://www.bilibili.com/video/BV164411b7dx?from=search&seid=5329376196520099118
上次筆記從非線性假設的問題引入,強調了通過特征映射使線性回歸、邏輯回歸模型解決非線性問題是不科學的,當初始特征空間比較大時,特征映射之后的特征空間將會非常龐大,非常浪費計算。
從而開始介紹神經網絡的歷史、結構和工作原理。這次筆記將繼續上次內容,對神經網絡的反向傳播算法進行學習,該算法結合梯度下降算法可以根據給定數據集對參數進行優化。
一、 代價函數
考慮神經網絡解決多分類問題:
數據集為:
定義L為網絡的層數,sl為第l層神經元的個數,上圖中L=4。
分類問題包括兩種:二分類與多分類:
二分類的標簽只有0/1,而且只需要一個輸出神經元;而多分類(K類)的標簽可以被表示成one-hot形式,如上圖中[1 0 0 0]這樣,K分類就需要K個輸出神經元。
神經網絡的代價函數是邏輯回歸代價函數的一般形式,將一個分類器的代價函數推廣到了多個,如下圖所示:
二、 反向傳播算法
這個算法是用來根據數據集優化參數的,過程中需要對代價函數求偏導:
先來看一個數據樣本的例子:
前向傳播的計算過程圖中已經展示,該過程可以計算每一個神經元的激活值。
前向傳播計算完之后,才需要進行反向傳播,反向傳播算法從直觀上說,就是需要對除輸入層之外的每一個神經元計算一個誤差δ_j ^ (l)(表示第l層第j個節點的誤差),已知a_j ^ (l)表示第l層第j個節點的激活值,這個δ_j ^ (l)在某種程度上就是這個節點的激活值的誤差,所以我們希望這個節點的激活值稍微有所改變。具體來說,以下面這個四層的網絡為例:
既然被稱為反向傳播,那么自然要從輸出層開始計算誤差,輸出層的誤差計算如下:
用向量表示的話,就是δ ^ (4)=a ^ (4) - y。然后用計算出來的δ ^ (4)去反向計算第三層的誤差δ ^ (3),再用δ ^ (3)去計算δ ^ (2),因為第一層就是輸入層,它的值是確定的,沒有誤差,所以不需要計算δ ^ (1),第二層、第三層的計算公式如圖中所示。
再從頭理一下反向傳播算法:
數據集如下所示:
(1) 初始化誤差矩陣:(?是δ的大寫形式)
這個誤差后面將用來計算代價函數的偏導數。
(2) 然后是前向傳播的計算以及反向傳播求誤差:
先將輸入層的值傳給a(1),然后前向計算各神經元的激活值,前向計算完畢之后,從輸出層開始,反向計算各層的誤差。
(3) 計算D,從而計算代價函數偏導數的值:
計算出偏導數之后,就可以用梯度下降算法或其他高級優化算法去優化參數值,所以反向傳播算法的作用就是求出偏導數。
三、 理解反向傳播算法
先看一下前向傳播的過程:
假設只有一個樣本一個輸出單元,且不考慮正則化,,那么代價函數變為如下圖所示的cost(i):
圖中cost(i)表達式有誤,正確應該為:
反向傳播的計算:
四、 梯度檢測
反向傳播算法有一個不好的特性,很容易產生一些微妙的bug,當他與梯度下降或其他一些優化算法一同工作時,看起來確實能正常運行,并且代價函數在每次梯度下降的迭代中也在不斷減小,但是到最后得到的神經網絡其誤差將會比無bug的情況下高出一個數量級,并且很可能不知道這個差距是由bug造成的。
那么如何應對這種情況呢?有一種思想叫做梯度檢測,它能解決幾乎所有這種問題,使用梯度檢測,可以保證前向傳播和反向傳播都會是百分之百正確的。
先來看一下代價函數導數的一種近似數值計算方法(這里的變量θ為實數而非向量):
這里是用割線的斜率來近似切線的斜率,即代價函數的導數,當ε足夠小時,可以近似相等,如10 ^ (-4),一般也不能太小,否則會有數值計算上的誤差。
當變量θ是向量時,上述近似方法可以推廣為:
對每一個變量分別求偏導數。這些等式可以讓你從數值上去估算代價函數J所關于的任何參數的偏導數。由此寫出的代碼如下所示:
這里的gradApprox就是數值計算得到近似偏導數值,而我們把用反向傳播算法求得的偏導數值記為DVec,梯度檢測的下一步就需要檢驗:
驗證gradApprox是否等于或近似等于DVec,若兩種方法計算出來的導數是一樣的或者說非常接近,只有幾位小數的差距,那么就可以確信反向傳播算法的實現是正確的,此時把DVec用到梯度下降算法或其他優化算法中時,就可以確信計算的導數是正確的,那么代碼就能正確地運行,并很好的優化J。
總結一下實現的細節:
首先需要實現反向傳播算法去計算DVec,然后使用數值計算的方法計算gradApprox,并確保他們兩有近似的結果,這一步確保之后,在訓練時使用反向傳播算法計算梯度,而不再使用梯度檢測,因為數值計算法的計算量比較大、速度比較慢,而反向傳播算法是一個高性能的計算導數的方法,一旦通過檢驗確定反向傳播算法是正確的,就應該關掉梯度檢驗不再使用。
五、 隨機初始化
當使用梯度下降或高級優化算法時,首先需要為參數確定初始值。初始化結束后可以一步步通過梯度下降來最小化代價函數。
1.全部初始化為0的問題
之前在邏輯回歸中是將初始值全部設置成0,但是在神經網絡中這是不合適的,如下圖所示:
因為權重都為0,那么計算出來的兩個激活值a1和a2也相等,所以誤差也相等。進而導致,代價函數對兩個參數的偏導數也相等,所以用梯度下降更新后的參數值也會相等,只是可能不為0,但還是一直保持相等,后續也都會這樣,一直相等。所以這樣的話,兩條藍色的線的權重會相等,紅色的會相等,綠色的也會相等,所以這個神經網絡計算不出什么有趣的函數,每一層的神經元都在進行著相同的計算,這是一種高度冗余的情況。也被稱為對稱權重的問題。
2.隨機初始化的思想
為了避免上述的問題,在神經網絡的參數初始化時,需要采用隨機初始化的思想:
將參數值初始化為[-ε,ε]范圍內的一個隨機值。一般ε的值比較小,所以初始化后的參數值也是比較小的隨機值。隨機性打破了上述提到的對稱權重的問題。
六、 神經網絡算法整體流程
這節將結合上述所講的所有內容來做一個總體的回顧,相互之間有怎樣的聯系以及神經網絡學習算法的總體實現過程。
1.選擇網絡具體架構
對于一個具體的問題,首先要確定神經網絡的結構,包含幾層、幾個輸入神經元、幾個輸出神經元、每個隱藏層各有幾個神經元等等。具體的選擇依據如下圖所示:
根據輸入數據的特征數來確定輸入神經元的數量,根據需要分幾類來確定輸出神經元的數量,隱藏層默認使用一層,或幾層但每層的神經元數量相同,每層隱藏層的數量一般大于輸入層是有效的,越多越好。但隱藏層的具體選擇還需依據具體問題來具體分析。
2.訓練神經網絡
這里分為了六步:
(1) 隨機初始化權重為很小的數
(2) 執行前向傳播算法對所有輸入計算得到相應的預測值h(x)
(3) 按照公式計算出代價函數J(θ)
(4) 反向傳播算法計算代價函數的偏導數
然后是5、6兩步:
(5) 使用梯度檢測去比較通過反向傳播算法和數值估計兩種方法求出來的偏導數是否近似相等,如果近似相等,則停止梯度檢測,訓練過程將只使用反向傳播算法。
(6) 使用梯度下降法或高級優化方法用反向傳播求得的偏導數的結果去最小化代價函數,優化參數。
需要注意的一點是,神經網絡的代價函數J(θ)是非凸的,所以優化算法只能得到局部最優值。
總結
以上是生活随笔為你收集整理的吴恩达《机器学习》学习笔记十——神经网络相关(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理 第四章 图像增强
- 下一篇: MSE与FC作用