1. 程式人生 > >吳恩達deep learning筆記第二課 改善深層神經網路:超引數除錯、正則化以及優化

吳恩達deep learning筆記第二課 改善深層神經網路:超引數除錯、正則化以及優化

學習吳恩達DL.ai第二週視訊筆記。

1.深度學習實用層面

在訓練集和驗證集來自相同分佈的前提下,觀察訓練集的錯誤率和驗證集的錯誤率判斷過擬合(high variance高方差)還是欠擬合(high bias高偏差).

比如訓練集錯誤率1%,驗證集11%則過擬合(高方差)情況。

如果人眼可輕易識別圖片訓練後錯誤率15%,驗證集16%,則欠擬合(高偏差)情況。

如果人眼可輕易識別圖片訓練後15%,驗證集30%,則欠擬合和過擬合都存在(高方差和高偏差)。

選擇一個網路模型後,如果一旦偏差較大,可以選擇調整模型或者換網路,直到偏差降低到一定程度時,再觀察方差的情況,即再一個訓練集上可以取得不錯的效果時,用驗證集來測試,如果方差較大,可通過正則化,dropout或者增大資料集等方法來調整,不斷的嘗試,直到找到一個低偏差,低方差的模型。

L2正則化是訓練深度學習模型最常用的方法。

一個建議:在regularization時,代價函式J需要加上相應的regularization項,如果不加會看不到loss單調遞減的現象。

dropout也是計算機視覺常用的一種正則化。

Dropout使用時注意的細節:加入Dropout後損失函式J的公式會定義不再明確,定義明確的損失函式J影象是單調遞減的,所以我們會失去除錯工具, 通常會先關閉Dropout,即把dropout設為1,執行程式碼,確保損失函式單調遞減,然後再開啟程式碼加入dropout。

1.8其他正則化辦法

其他減少過擬合的方法:Data augmentation(即通過翻轉,裁剪等操作擴大資料集),early stoping(即x軸是迭代次數,y軸是錯誤率,畫validation和train資料集錯誤率曲線,會發現train資料集錯誤率一直單調下降,而validation驗證集錯誤率先下降,後因為overfitting上升,取中間轉折點結束,但這有一個主要缺點,在中間結束意味著無法優化降低損失函式J, 無法優化。優點是相比於L2正則化,減少了除錯次數,一次就找出W的較小值,中間值和較大值,無需多次運算除錯L2正則化lambda的值 

1.9正則化輸入

Normalizing training sets:分兩步驟,第一步是零均值化,第二步是歸一化方差,算出均值u和方差,在測試集和訓練集上用同樣的的這兩個引數,而不是分別算。

在Unnormalize的情況下需要用很小的learningrate來下降,而normalize後梯度下降演算法能夠更直接的找到最小值,可以使用較大的學習率。

所以如果輸入特徵處於不同的範圍,比如0-1和0-1000,那麼歸一化特徵值就非常重要了。如果在相似範圍,則不那麼重要,但這列歸一化並不會產生不好的影響,所以經常選擇歸一化處理。

1.10梯度消失和梯度爆炸

在反向傳播的過程中,權重會指數型增長或者消失,從而大大增加神經網路訓練時間和難度。

可以通過有效的初始化權重在一定程度上避免。

1.11神經網路權重的初始化

(因為一定程度上避免了梯度消失和爆炸,所以這是加快神經網路訓練的辦法

根據選用的啟用函式如Relu或Tanh來選擇權重初始化,如選擇relu可以用W[l] = np.random.randn(shape ) + np.sqrt(2/n[l-1]).

如選擇tanh則用根號(1/n[l-1]),即xavier initialation。

當然,這只是給了一個預設的權重起點,來減少梯度消失和梯度爆炸,訓練出一個不會梯度爆炸或消失過快的網路

1.12梯度的數值逼近

在backprop時,有個操作叫梯度檢驗,它的作用是確保backprop正確實施,因為有時候寫下backprop方程式不能確保操作時所有細節都是正確的,所以用梯度檢驗以確定backprop的正確,在瞭解梯度檢驗前先說一下如何對計算梯度做數值逼近。

會發現雙邊檢驗(第一張圖,算出梯度3.0001)比單邊檢驗(第二張圖,算出梯度3.0301)更加精確。

1.13梯度檢驗(grad check)

梯度檢驗可以幫忙劍聖很多時間, 並還行啦backprop實施過程中的bug,

為了梯度檢驗,需要將網路中的W[1],b[1],W[2].b[2],,,W[L],b[L]引數轉換成一個巨大的向量資料theta。

於是原來的J(W[1],b[1],W[2].b[2],,,W[L],b[L]) 變成了J(theta)

同時d(W[1])。。。。也組成了一個d(theta)

接下來就是梯度檢驗的過程

1.14關於梯度檢驗實現的註記

1.不要再訓練中使用梯度檢驗,他只用於除錯。(因為它太慢了,所以只在測試時開啟,使用後關閉)

2.如果梯度檢驗失敗了,要檢查所有項,檢查每一項,找出BUG。

即d(theata[i])與d(theata)的值相差很大,我們要做的就是查詢不同的i值,看看是哪個數導致。

3.如果有正則化,記得代價函式的形式。比如有L2正則化,在求d(theta)時別忘了L2正則化帶來的代價函式J的附加項

4.梯度檢驗不能和dropout同時使用,因為每次迭代時,dropout會隨機消除隱層單元的不同子集,難以計算出代價函式J。使用梯度簡單的時候,把dropout的keep_prob設為1.檢驗完再開啟。

2.優化演算法(即加快模型的訓練速度)

能讓神經網路執行的更快。使用好用的優化演算法能大大提高大資料在深度網路模型的訓練速度。

2.1.、mini-batch gradient descent(比batch gradient descent下降快很多)

如5000000個樣本,分成5000個mini-batch,每個1000個。

for t = 1,2...5000,其中每一步是將1000個樣本向量化後同時處理,而不是一個個處理。所以用了mini-batch相當於更新了5000次權重w和偏差b。

2.2理解mini-batch 梯度下降法

mini-batch因為每次訓練的相當於不同的樣本集,所以他的損失函式J影象是震盪著下降的。(震盪的原因是因為也許X[1],Y[1]mini-batch比較容易運算,而X[2],Y[2]mini-batch比較難運算,所以損失函式J比前面的大)

mini-batch的兩種極端情況和一種適合的情況:

1.mini size=m(總數)時,即為batch gradient descent

2.mini size=1時,即為Stochastic gradient descent,因為相當於在不同的樣本集訓練,所以損失函式下降的時候波動厲害,有時向下,有時下降,總體向下,並且SGD永遠不會收斂,會在最小值附近小範圍波動。SGD雖然通過降低學習率也能改善噪聲,但確定也很明顯,會失去向量化帶給你的加速。

實際上,mini size大小應該在1和m之間選取一個合適的值,使得損失函式J更快的走向最小值,在一些範圍波動的時間變少,即使出現,也可以通過learningrate的減少來解決。

如下圖3種顏色代表3種情況。

那怎麼來選擇minibatch的大小的:

1.如果總體訓練集樣本量較小時,直接用batch gradient descent,比如m<=2000時。

2.典型的minibatch size大小為:64,128,256,512。(考慮到計算機記憶體通常是2的次方),通常都嘗試,來看哪個使得損失函式J的下降速度快並且波動小。

3.選區的minibatch要適合CPU/GPU memory。

2.3指數加權平均

如365天的氣溫a1,a2,a3....a365,可得一組加權平均數v0=0,v1=0.9*v0+0.1*a1,v2=0.9*v1+0.1*a2.....到v365=0.9*v364+0.1*a1,Vt可以看作1/(1-theta)的平均氣溫,其中此例theta為0.9,即vt = theta * vt-1 + (1 - theta) * at

當theta過大時,如0.98,則是50天的加權平均氣溫,曲線較為平緩。如下圖綠線

當theta過小時,如0.5,則是2天的加權平均氣溫,曲線較為震盪。如下圖黃線

取中間值較好,如0.9,10天,即紅線

2.4理解指數加權平均

如下圖所示,v100展開的公式如下:

會發現各項係數成指數關係,如beta(前面我叫theta)設定為0.9,會發現第十項,也就是0.9的十次方的時候係數只有0.34了,後面可以忽略不記,所以可以得到近10天的平均溫度。

因為指數加權平均公式為vt = theta * vt-1 + (1 - theta)*  at

只佔用單行數字的儲存和記憶體,佔用極少的記憶體,當然這不是最好,最精準的計算平均數的方法,如果要精準通過儲存前10天或50天的資料取平均數更為精準,但是要儲存這些資料,必須佔用更多的記憶體。在下面要計算多個變數的平均值,指數加權平均是一個很好的方法。

2.5指數加權平均的偏差修正

還需要了解一個概念,叫偏差修正。如果你在意訓練的初期情況,偏差修正就顯得很重要,如果不在意,可以選擇熬過初期。

因為在估測初期,如設v0的值為0,如果v1實際值為40,則v1=0.9 * v0 + 0.1 * 40 = 4。和實際的40相差很多,並且預測前期都有這個情況.

如果將公式再加上Vt = Vt/(1- beta^t)就可以完成偏差修正,在t較小時分母較小完成放大,在t較大時分母接近1無作用。

2.6動量梯度下降法(Momentum)

方法是利用計算梯度的指數加權平均數,並利用該梯度更新你的權重。這個演算法大多情況下都好於沒有momentum的梯度下降演算法。

因為之前batch/mini batch gradient descent 都是擺動是接近最低點,通過加權平均後襬動區域平緩,接近最低點速度加快。即縱軸運動減少,橫軸方向運動更快。

Momentum的一個本質:不是對所有情況都滿足,能優化碗裝結構,可以想象成給一個球一個向下的加速度。

會發現有兩個超引數,beta和學習率lambda,beta常用值為0 .9(一般效果都不錯),即平均迭代前面的十次梯度。並且一般不用偏差修正,十次後一般都過了初期。

其中紫色劃掉和不劃掉是兩個版本,不劃掉的好一點。

2.7RMSprop

希望W學習速度快,b學習減慢,  並且允許使用一個較大的學習率。

因為上述的希望,所以根據更新公式希望Sdw較小,Sdb較大,因為看圖本來DW就較小,Db就較大(看斜率),所以這個更新公式滿足了要求,並且加了一個小引數(約10的-8次)以防止分母為0.

2.8Adam優化演算法

算是Momentum和RMSprop的結合。一遍用Adam要使用偏差修正。

Adam有四個超引數:1.學習率lambda,需要除錯。2.beta1:常用值0.9,這是dw的移動平均數,也就是dw的加權平均數,是momentum設計的項。3.beta2:常用值0.999,這是dw^2的移動平均數。4.epsilon:常用值10的-8次方,防止分母為0.

綜上:使用Adam時,引數beta1,beta2,epsilon不需要調整,只需試學習率lambda調整。

2.9學習率衰減

優化演算法速度的一種方法就是隨時間衰減學習率。

1.可以將學習率設為lambda = (1/(decay-rate * epoch-num))* lamda0。要調整的超引數試lamda0和decay-rate

2.或者下圖的幾種方法,如指數衰減exponential decay等。

吳恩達:雖然學習率衰減的確有很大助益,但不是優先超引數調整的方法。

2.10區域性最優的問題

區域性最優並不是高維影象應該考慮的問題。印象中二維的區域性最優(左邊圖)並不是所有情況,比如20000維的時,並不可能每個點都是梯度為0(機率為2^20000分之一)可能在一部分為0,另一部分很大,就比如馬鞍的中心點,也就是saddle point鞍點。此時要加快速度往兩邊下降,而不是區域性最優。高維情況大多這樣。

,就比如馬鞍的中心點

第二章作業:見學習資料/吳恩達程式設計作業(jupyter notebook檔案)

重要知識點:

1.生成mini_batch時要記住的兩點:​

  • Shuffling and Partitioning are the two steps required to build mini-batches(記得先講資料集打亂再取一個個mini_batch出來加入到mini_batches中)
  • Powers of two are often chosen to be the mini-batch size, e.g., 16, 32, 64, 128.

​​​​2.mini_batch與batch與SGD:

  • The difference between gradient descent, mini-batch gradient descent and stochastic gradient descent is the number of examples you use to perform one update step.
  • You have to tune a learning rate hyperparameter αα.
  • With a well-turned mini-batch size, usually it outperforms either gradient descent or stochastic gradient descent (particularly when the training set is large).

3.momentum要點:

Note that:

  • The velocity is initialized with zeros. So the algorithm will take a few iterations to "build up" velocity and start to take bigger steps.因為速度初始化為0,所以需要需要通過幾輪去建立起速度(不用偏差修正),從而開始進行更大的步子(一開始更新小)。
  • If β=0, then this just becomes standard gradient descent without momentum.(只剩下dW)

How do you choose β?

  • The larger the momentum β is, the smoother the update because the more we take the past gradients into account. But if β is too big, it could also smooth out the updates too much.
  • Common values for β range from 0.8 to 0.999. If you don't feel inclined to tune this, β=0.9 is often a reasonable default.beta一般在0.8至0.999,一般0.9最好
  • Tuning the optimal β for your model might need trying several values to see what works best in term of reducing the value of the cost function J.如果要調整最佳theta,通過J減少最多來調節

What you should remember:

  • Momentum takes past gradients into account to smooth out the steps of gradient descent. It can be applied with batch gradient descent, mini-batch gradient descent or stochastic gradient descent.
  • You have to tune a momentum hyperparameter ββ and a learning rate αα.

4.If you run the model for more epochs on this simple dataset, all three methods will lead to very good results. However, you've seen that Adam converges a lot faster.如果你對模型在一個簡單資料集上跑很多輪,三種方法都會有很好的結果,然後Adam收斂的快許多。

3.超引數除錯、Batch正則化和程式框架

3.1除錯處理

對於超引數而言,如何找到一套好的設定?下面是關於如何系統地組織超參除錯過程的技巧

超引數有很多要調整,如學習率learning rate,momentum的beta,adam的beta1,beta2,epsilon,神經網路的layers和hidden units和mini-batch的大小,leaningrate decay

紅色learningrate最為重要, 黃色三個其次重要,紫色第三位重要,其實用Adam時beta1,beta2,epsilon都不用除錯,使用這三個數值即可。

比如兩個超引數的除錯,選擇如下層次不齊的點(而不是均勻取值,因為比如每行每列均勻取5個點,共25個,則如果超引數1重要程度遠大於超引數2,如學習率lambda和adam的epsilon。會發現只嘗試了5種超引數1,而層次不齊時嘗試了很多種),比如右下角幾個點表現較好,就放大右下角部分再多取幾個點,由粗到細。

3.2為超引數選擇合適的範圍(標尺)

儘量不要選均勻分割的辦法。

如0.0001至1,不要均勻分佈,而是取【-4,0】,由10的-4次方,10的-3次方,10的-2次方,10的-1次方,10的0次方這幾個段種取點實驗。

3.2超引數訓練的實踐:Pandas VS Caviar

方法一:panda通過不斷加入新的方法或者引數觀察損失函式J上升還是下降。

方法二:caviar魚子醬,通過同時實驗多種情況對比損失函式J。

3.4正則化網路的啟用函式

Batch歸一化(BN,Batch Norm)會使你的引數搜尋問題變得很容易,對超引數選擇更穩定,不僅僅是第一週說到的優化演算法以快速找到最小值(碗)。

Batch歸一化能將隱藏層的輸入在特定的均值u和方差標準化。均值和方差由gama和beta兩引數(也會反向更新)控制。實踐中這些都不需要自己操控,都可通過框架實現,只需理解原理即可。

3.5將BN擬合進神經網路

在啟用函式前進行BN是較為常見的方式。

過程是將輸入歸一化為均值0和方差的形式,再通過beta和gama縮放。這意味著無論b[l]是什麼值,都會被減去(均值最後為0)。所以在用BN時b可以暫時置0

3.6Batch Normal(BN)為什麼奏效?

加速網路只是BN作用的冰山一角,除了加速網路,BN還可以使權重比網路更滯後或更深層,即BN使得各隱藏層得到前面輸出更加穩定(受同樣的均值和方差影響),受影響幅度較小,使得後層的學習工作變得更容易些,各層更加獨立學 習,有助於加速整個網路的學習。

BN也有一定的正則化效果,但比較小,可以跟dropout一起使用來達到較大的正則化效果,因為mini-batch時求得均值和方差只是一部分,相對於總體有一定的噪聲,所以跟Dropout一樣引入了一定的噪聲來達到正則化的效果。

BN歸一化將你的資料以mini-batch的形式逐一處理,在測試時,可能需要對每一個樣本逐一處理,所以在測試時,需要做調整來應用batch歸一化進行預測。

3.7 測試時的Batch Norm

BN歸一化將你的資料以mini-batch的形式逐一處理,在測試時,可能需要對每一個樣本逐一處理,所以在測試時,需要做調整來應用batch歸一化進行預測。

因為對一個個單個樣本求均值和方差再歸一化沒有意義,所以採用指數加權平均來求u和sigma squared(方差)的估值,再來算Znorm。

總結一下,就是訓練時,u和sigma squared是在整個mini-batch上計算出來的。但在測試時,可能需要逐一處理樣本,方法是根據訓練集估算u和sigma squared,通常採用指數加權平均的方法,並可以在訓練過程中追蹤看到u和sigma squared。

3.8 softmax迴歸

前面都是二分類0和1。如果要分多類,有一種logistic迴歸的一般形式,叫做softmax迴歸,來識別多種分類。

會發現者之前的啟用函式都是接受單行數值輸入,如sigmoid和relu,輸入一個實數,輸出一個實數。而softmax特殊在是將結果歸一化,要輸入以個向量,最後輸出一個向量。 

3.9訓練一個softmax分類器