1. 程式人生 > >吳恩達-深度學習-課程筆記-6: 深度學習的實用層面( Week 1 )

吳恩達-深度學習-課程筆記-6: 深度學習的實用層面( Week 1 )

data 絕對值 initial 均值化 http 梯度下降法 ati lod 表示

1 訓練/驗證/測試集( Train/Dev/test sets )

構建神經網絡的時候有些參數需要選擇,比如層數,單元數,學習率,激活函數。這些參數可以通過在驗證集上的表現好壞來進行選擇。

前幾年機器學習普遍的做法: 把數據分成60%訓練集,20%驗證集,20%測試集。如果有指明的測試集,那就用把數據分成70%訓練集,30%驗證集。

現在數據量大了,那麽驗證集和數據集的比例會變小。比如我們有100w的數據,取1w條數據來評估就可以了,取1w做驗證集,1w做測試集,剩下的用來訓練,即98%的訓練集。對於數據量過百萬的數據,訓練集可以占到99.5%

我們在做一個應用的時候,比如訓練一個分類器識別貓,可能訓練集數據都是網上爬取的,驗證集和測試集都是用戶上傳的,這樣訓練集的分布和驗證測試集的分布不一致。

這種情況,有一條經驗法則,建議大家要確保驗證集和測試集的數據來自同一分布,因為你要用驗證集來評估不同的模型。而訓練集因為要收集大量數據,可以采用各種方法比如網頁抓取,這樣會導致訓練集和驗證測試集分布不一致。

測試集是對模型的無偏估計,沒有測試集的話就是在訓練集上訓練,在驗證集上評估然後修改參數叠代出適用的模型。有些團隊說他們的設置中只有訓練集和測試集,而沒有驗證集。這樣的訓練實際上就是只有訓練集和驗證集,並沒有用到測試集的功能。

2 偏差和方差( bias / variance )

高偏差:數據擬合的不好,欠擬合,比如在訓練集和驗證集上的效果都差,訓練集和驗證集準確率差不多

高方差:數據擬合的太好而泛化能力變差,過擬合,比如在訓練集上表現好,在驗證集上表現差,訓練集和驗證集的準確率相差甚多

高偏差和高方差:訓練集上表現很差,驗證集上表現更加差,訓練集和驗證集的準確率相差甚多。高方差和高偏差的數據樣本見下圖所示。

這裏有個假設前提:訓練集和驗證集來自同一分布。

表現好不好相對於最優誤差來講的,比如貓的二分類,人能夠幾乎0%的錯誤率識別是不是貓,那麽最優誤差是0%,這個時候訓練誤差和驗證誤差都是16%,可以判定為高偏差。

如果一個問題的最優誤差是15%,那麽訓練誤差和驗證誤差都是16%,就不能說它高偏差。

技術分享圖片

3 機器學習基礎( Basic recipe for machine learning )

訓練集表現不好,高偏差:重新構建網絡,更多隱藏層,更多隱藏單元,叠代更多次,更改優化器等等,必須做各種嘗試(可能有用,可能沒用)。反復嘗試,直到可以擬合數據為止。如果網絡空間很大,通常可以很好的擬合數據集。

過擬合,高方差:盡可能使用更多的數據,正則化,同樣要做各種反復的嘗試。

在深度學習早期,沒辦法做到只減少偏差或方差卻不影響另一方。

但當前的深度學習和大數據時代,只要有足夠大的網絡,足夠多的數據(也不一定只是這兩個,只是做個假設),就可以在不影響方差的同時減少偏差。

4 正則化( Regularization )

在原始的損失函數後面加一個正則項,主要是權重w的L2範式的平方,此方法稱為L2正則,實際上L2正則在進行梯度下降的時候做了一個權重衰減,從公式上可以看出。

也可以用L1正則,加上的是w的L1範式,就是絕對值相加,它可以使w稀疏,也就是w有很多0。

正則化就是對權重w進行懲罰,當w太大的時候損失函數會變大,這個時候優化為了使損失函數盡可能小就會懲罰w,減小了w的影響,使神經網絡變得簡單,由此來防止過擬合。

也可以這樣理解,正則使得w盡量小,這個時候z就比較小,比如對於激活函數tanh來說,z比較小的時候梯度相對來說比較像一條直線,那麽得到的函數相對呈線性,這樣整個神經網絡就不會過於復雜,由此來防止過擬合。

技術分享圖片

5 dropout正則( Dropout regularization )

除了L2正則,還可以用dropout正則來防止過擬合。

dropout會在每一層隨機刪除一些節點,相當於直接使某些層的權重為0,由此使得網絡規模變小,得到一個精簡後的網絡。

對於每一個樣本都會用一個精簡後的網絡訓練,這樣的話可以認為每個樣本訓練時的網絡結構是不一樣的。

具體如何實施呢?有幾種方式,ng講了常用的一種,Inverted dropout反向隨機失活。

對於模型的某一層,設定一個概率keep-prob表示保留單元的概率。生成一個隨機矩陣,表示每個樣本和每個隱藏單元是否丟棄:d3 = np.random.rand( a3.shape[0], a3.shape[1]) < keep-prob

過濾掉d3中所有等於0的元素:a3 = np.multiply( a3, d3 )

丟棄後需要把所有數值除以這個保留概率(為了保證a3的期望不變):a3 /= keep-prob

在測試階段不使用dropout,因為我們在測試階段不希望輸出的結果是隨機的。

另一個dropout有效的直觀理解是,因為對於某個單元,輸入單元有可能被刪除,所以神經網絡不會分配太大的權重,這相當於L2正則中的收縮權重的效果,所以說dropout的功能類似於L2正則。

每層的keep-prob可以不同,對於單元數多,容易過擬合的層可以用小一點的keep-prob,對於不容易過擬合可以用大一點的keep-prob。

很多dropout的第一次成功應用是在計算機視覺領域,因為計算視覺中往往輸入了過多的像素。計算機視覺的研究人員很喜歡用dropout,幾乎成了默認的選擇。

但是要記住,dropout是為了防止過擬合的手段,當算法過擬合的時候才使用,所以一般是用在計算視覺方面(往往沒有足夠的數據,容易過擬合)。

dropout的一大缺點就是代價函數不再被明確定義,每次叠代都會隨機移除一些節點,很難調試梯度下降的叠代過程(繪制叠代次數和cost的函數圖)。

可以在調試的時候先把keep-prob設置為1,繪制出叠代圖,之後再打開dropout。

6 其它正則化方法( Other regularization methods)

數據增強(data augmentation),對原始圖像做一些翻轉,裁剪,放大,扭曲等處理,產生額外的數據,這些額外的數據可能無法提供太多的信息,但是這麽做沒什麽花費(相比於收集新數據要簡單的多)。

提早停止(early stopping), 當發現驗證集降到最低開始上升的時候(表示要過擬合了),這個時候停止訓練,可以理解為選擇一個中等的w來防止過擬合(一開始隨機初始化很小,隨著訓練慢慢增大)。

early stopping有一個缺點,就是它無法同時處理最小化代價和防止過擬合這兩個問題(防止了過擬合,但是可能早早就停下來了,沒有做到最小化代價)。

所以代替early stopping用的L2正則,這樣訓練的時間就可能很長,你必須嘗試很多正則化參數,搜索參數的計算代價太高。而early stopping的優點就是無需嘗試很多參數。個人傾向於用L2正則。

技術分享圖片

6 歸一化輸入( Normalizing inputs)

歸一化輸入需要兩個步驟:零均值化歸一化方差

零均值化:樣本中的每個特征值都減去該特征 的平均值,這樣每個特征的均值為0

歸一化方差:樣本中每個的特征值除以該特征的方差,這樣每個特征的方差為1

值得註意的是,如果你在訓練集歸一化,那麽在測試集要用相同的平均值和方差(訓練集計算得到的)來歸一化,因為我們希望在訓練集和測試集上做相同的數據轉換。

為什麽要歸一化輸入特征呢?如下左圖所示,如果不歸一化的話,代價函數可能是一個非常細長狹窄的函數,在訓練的時候需要設置很小的步長,叠代時間會變長。

如下右圖所示,歸一化後,各個特征都在相似範圍內,代價函數更圓,更容易優化,梯度下降法能夠使用較大的步長,更快速地叠代。

技術分享圖片

技術分享圖片

7 梯度消失,梯度爆炸,權重初始化( Vanishing / exploding gradients,Weight initialization for deep networks )

ng的例子中,訓練神經網絡的時候如果網絡很深的話,假設權重都是1.5,傳遞到最後一層的y的值將會呈指數增長(因為每經過一層就會乘一個權重1.5),假設權重都是0.5,傳遞到最後一層的y將會變得很小很小。

這是造成梯度消失或梯度爆炸的原因,它給訓練造成了很大困難。針對梯度消失或梯度爆炸,有一個不完整的解決方案,雖然不能徹底解決問題,卻很有用。

考慮z = w1*x1 + w2*x2 + ...w(n)*x(n),為了防止z太大或太小,可以看到n越大的話,你就希望w越小,以此來平衡z,那麽很合理的設定就是把w設定為1/n。

所以在某一層,初始化權重的方法就是設定值為sqrt (1 / n上標l-1),如下圖所示,其中n上標l-1表示l層 的輸入特征數。如果你使用的是relu激活,那麽用2 / n效果會更好。

此外,還有一些其它的變種,見下右圖所示。權重初始化可以看做一個超參數,但是相比於其它超參數,它的優先級比較小,一般優先考慮調整其它超參數來調優。

技術分享圖片

8 梯度的數值逼近,梯度檢驗( Weight initialization for deep networks, Gradient Checking )

進行梯度檢驗的時候,考慮某點前進很小很小距離的點,和往後很小小距離的點,考慮了兩個點估計的梯度會更準確,漸進誤差為這段距離的平方O(ε^2)。

考慮某點前進很小很小的一段距離的點來估計梯度,只考慮了單邊,漸進誤差為這段距離O(ε)。

所以我們采用雙邊誤差的估計來進行梯度檢驗,用雙邊誤差的估計梯度和實際求導的梯度做一個距離計算,看看距離是否足夠小。

ng介紹的梯度檢驗如下圖所示,其中Θ[i]表示第i個樣本的所有權重,距離公式中的分母只是為了防止數值太大而加的。

需要註意的是,梯度檢驗和dropout不要同時進行,

技術分享圖片

技術分享圖片

 

吳恩達-深度學習-課程筆記-6: 深度學習的實用層面( Week 1 )