1. 程式人生 > >吳恩達《深度學習-改善深層神經網路》1--深度學習的實用層面

吳恩達《深度學習-改善深層神經網路》1--深度學習的實用層面

  1.  資料集

深度學習是基於經驗的,即使是經驗豐富的專家也很難再專案開始的時候就能夠確定最優引數,比如神經網路的層數,每層的單元數,每層的啟用函式,學習速率等,一般是先選擇一個簡單的模型,通過不斷的迭代來修改各引數,直到最優解。

法則一:一般在專案中會把資料集分成三份:

訓練集(training set):用於模型訓練

驗證集(developing set/dev set):用於交叉驗證

測試集(test set):模型確定後,用來檢測模型

規模小的資料量一般按照比例 7/3或者6/2/2來劃分資料集

對於大資料,資料量越大,訓練集佔得比重應該越大,比如對於百萬級的資料集,其比例可以是98/1/1,對於更大的資料集,其比例可以增加到99.5/0.25/0.25或99.5/0.4/0.1(因為驗證集用來驗證各種方法哪個更好,所以其所需資料可以比測試集大一些)。

法則二:驗證集和測試集要來自同一分佈(dev set and test set come from same distribution)

由於深度學習需要大量的資料,資料的來源可能五花八門,有的可能來自網頁抓取甚至人工合成,這就導致了訓練集可能跟驗證集和測試集來自不同的分佈,但是隻要保證驗證集和測試集來自同一分佈,演算法就會變得很快,後續課程還會給出更詳細的解釋

法則三:沒有測試集也可以

測試集的作用是對最終模型做出無偏估計(unbias estimate),如果不需要無偏估計也可以沒有測試集

2. Bias vs Variance(偏差和方差)

借用一張圖來說明

最優誤差又被稱為貝葉斯誤差,這裡沒有詳細講解

假設基本誤差很小,而且訓練集和驗證集樣本來自同一分佈,有:

訓練集誤差小,而驗證集誤差大,一般方差高,過擬合;

訓練集誤差大,驗證集的誤差跟訓練集誤差相近,一般偏差高,欠擬合;

訓練集誤差大,驗證集誤差更大,一般既偏差高又方差高,可能部分欠擬合部分過擬合

對於新建立的模型:

首先檢視偏差,如果模型偏差較高,那麼可以嘗試一個更復雜的網路,比如更多的隱藏層、更多的隱藏單元、用更多的時間來訓練模型(或新的神經網路架構,這部分在後面會介紹,加括號的意思是這種方法有時候有用有時候沒有,不過值得一試),直至偏差調至可接受範圍;

其次檢視方差,如果方差較高,那麼可以嘗試更多的資料、正則化、(新的神經網路架構),直至調整至低偏差和低方差。

Bias-variance tradeoff(偏差與方差權衡)

通常減少偏差很可能增加方差,而減少方差又很可能增加偏差,但是在大資料時代,在神經網路比較大資料量也很大的時候(正則適度的情況下),通常可以做到減少偏差或方差而不影響另一方,這是深度學習對監督學習大有裨益的一個重要原因。

3. 正則化Regularization

1)對於邏輯迴歸來說:

L2 Regularization:因為其用的是引數的歐幾里得範數,歐幾里得範數又被稱為2-範數,一般更傾向於用L2正則化;

L1 Regularization:採用向量的L1範數|W|,如果用L1正則化,得到的W是稀疏的,也就是向量W

裡面會有很多0,有人說這有利於壓縮模型,但是實際上並沒有降低太多記憶體,而且正則化的目的並不是壓縮模型。

正則化是對引數正則化,可以對W和b正則化,也可以只對W正則化,因為W包含了絕大多數的引數。

lambda被稱為正則化引數,在python裡面lambda是一個預留欄位,所以程式設計時一般用lambd來命名。

2)對於神經網路來說:

Frobenius norm(弗羅貝尼烏斯範數):表示一個矩陣中所有元素的平方和,與L2演算法一樣,但是由於統計學的某些原因下標為F,原因有待發掘。

3)為什麼L2正則化被稱為權重衰減?

應用L2正則化之後,W[l]變成了(1-α*λ/m)W[l],即乘了一個小於1的係數

4)為什麼正則化可以防止過擬合?

解釋一:如果λ設定的足夠大,那麼權重矩陣W就會接近於0,那麼就相當於消除了隱藏層內多於1個的其他隱藏單元的影響,大大簡化了神經網路,可能導致神經網路從過擬合到欠擬合,不過只要調整λ到一個合適的值,可以實現防止過擬合卻也不至於欠擬合的剛剛好的狀態。

解釋二:對於啟用函式tanh,λ越大W越小,那麼Z就越小(忽略b的影響),實際上Z的取值範圍很小,tanh會相對呈線性(上圖紅色近線性區域),那麼整個網路的計算也是近似線性而非非常複雜的高度非線性函式,從而不會發生過擬合。

5)正則化後梯度下降注意事項

梯度下降時若構造成本函式和迭代次數的曲線圖,會發現成本函式隨迭代次數增加而下降,在正則化後,成本函式加了正則化項,所以在構建學習曲線的時候要用加了正則化項的成本函式,如果用原來的成本函式,則曲線不一定是下降的。

4. Dropout正則化(隨機失活)

1)原理:隨機刪除神經網路單元,雖然做法有點瘋狂但是確實有效,具體做法是對神經網路的各個單元,以拋硬幣的方式來決定其去留,這樣會大大簡化神經網路,對簡化後的神經網路進行訓練。

2)如何實施Dropout正則化?

Inverted dropout(反向隨機失活)--目前應用最廣泛的dropout正則化方法

注意!!!!只在訓練集應用dropout,不能在測試集應用

keep-prob可以理解為保留概率,值得注意的是,小於這個概率的單元保留,而大於這個概率的單元被移除,所以keep-prob越大保留的越多,越小保留的越少。不同層的keep-prob也可以不同,一般取決於該層W的維數,W維數越高,代表單元數越多,過擬合的可能性就打,那麼就可以多刪除一些,keep-prob就要小一些,反之亦然,對於單元很少的隱藏層,比如只有1個或2個單元,基本不會導致過擬合,其keep-drop可以設定為1。輸入層的keep-drop一般為1,也可以設定其他值比如0.9,因為一般很少刪掉輸入層的資料,所以這個值一般不會太小如0.5。不同層用不同的keep-drop值可以使正則化更靈活,但是也帶來一個問題,如此多的keep-drop引數,每一個引數都需要用交叉驗證來確定,那麼工作量將會非常大,還有一種選擇就是整個系統統一採用一個keep-drop引數。

a3/=keep-prob;  這一步是反向隨機失活的關鍵,其作用在於保持a3的期望值,因為小於keep-prob的單元被移除了,相當於損失了(1-keep-prob)%的值,若要不影響a3以及後續z4、a4的期望值,那麼這裡需要修正或彌補a3的損失。

這裡介紹的是foreprop,即前向傳播的隨機失活,對於反向傳播的隨機失活backprop需要自己推導

向量d或d3,他決定第三層中哪些單元歸零(both foreprop and backprop),對每一層以及每一次迭代,既可以用相同的d也可以用不同的d,即可以保持讓相同的單元被移除,也可以設定讓不同的單元被移除。

測試的時候不需要dropout正則化,按照正常步驟測試即可。

3)為什麼dropout正則化會有效果?

第一種理解:Dropout通過每次迭代時,神經網路都會變得比以前小,使用一個更小的神經網路看起來和正則化的效果是一樣的。

第二種理解:從單個神經元的角度,神經元的作用是接收輸入並生成一些有意義的輸出,而通過dropout,神經元會被隨機刪除,也就是當前神經元不能依賴任一輸入神經元,所以不會給任何一個輸入加上太多權重,因此單元將通過這種方式積極的傳播開,併為其每個輸入單元各加適量權重,通過傳播所有的權重,dropout將產生壓縮權重的平方範數(squared norm of the weight)的效果,這就跟L2 Regularization類似,通過壓縮權重,防止過擬合,但L2對不同權重的衰減是不同的,取決於倍增啟用函式的大小。

drop-out正則化的作用是預防過擬合,所以除非過擬合,一般不會應用drop-out正則化,而dropout主要應用於計算機視覺,因為在這個領域通常資料量不足夠大,且輸入層的維度很高,容易存在過擬合的問題。

dropout的一個缺點就是成本函式J不再被明確定義,因為每次迭代都會隨機刪除一些節點,成本函式的計算變得非常困難,所以繪製成本函式和迭代次數的曲線圖就非常困難了,通常的做法是先關掉dropout函式(將keep-drop設定為1),執行程式碼,確保成本函式是單調遞減的,然後在開啟dropout函式

5. 其他正則化方法

神經網路中出了L2正則化和drop-out正則化,還有幾種方法可以有效防止過擬合

1)擴增資料

如果擴增資料的代價太大或很難完成,可以考慮增加這樣的資料,比如對於影象資料來說,水平或其他角度旋轉(一般不要上下翻轉)、縮放、裁剪、扭曲(對於數字識別可以這樣做)等,這樣做雖然沒有重新收集資料效果好,但是這樣既節省花費也能有效預防過擬合,價效比不要太高。

2)Early stopping

在梯度下降中,一般會繪製成本函式和迭代次數的曲線,在early-stopping中需要加上驗證集誤差Jdev,成本函式應該是單調遞減,而驗證集誤差一般是先下降後上升,一旦驗證集誤差開始上升,就可以停止梯度下降,選擇驗證集誤差最小的點,既可以認為是最優解。

優點:只執行一次梯度下降,就能找到合適的引數。

缺點:機器學習的步驟中,其中之一是選擇一個演算法來優化代價函式J(成本函式),如梯度下降、momentum、RMSprop、Adam等;優化代價函式之後又不想過擬合,這裡也有一些工具如L2正則化、資料擴增等。在機器學習中我們已經有很多超引數要選擇,要在這麼多演算法中選出最合適的演算法也變得越來越複雜,所以為了能讓問題變得簡單點,當我們用工具優化代價函式J的時候,只關心w和b,使得J越小越好,只要想辦法減小J,其他的不用管;而防止過擬合呢,用另外一套工具來實現。也就是一個時間只做一件事,這種思路被稱為正交化。而early-stopping卻在同一時間將這兩件事做了,使得需要考慮的問題更為複雜,而過早的停止迭代,便停止了降低代價函式J的嘗試,可能使得代價函式不夠小。

L2正則化優缺點:需要嘗試大量不同的正則化引數lamda的值,計算代價較高,訓練神經網路的時間更長,但超引數的搜尋空間會更易於分解也更容易搜尋。

通常來說L2正則化應用更廣。

6. normalizing input(歸一化輸入)

1)歸一化輸入需要兩步:

-1-均值歸零(零均值化):x=x-μ(μ是均值)  

-2-歸一化方差:x=x/δ2 (δ2是均方差,因為x已經被零均值化了)

需要注意的是,對於訓練集、驗證集以及測試集,都需要用由訓練集獲得的μ以及δ2進行資料轉換。

2)為什麼要歸一化輸入資料?

如果輸入資料的特徵值取值範圍相差較大,會導致對應的引數w也會相差較大,代價函式的輪廓是狹長的橢圓,就必須使用一個比較小的學習比率,來避免J發生震盪,如果梯度下降的起始值在橢圓的長軸一頭,那麼可能就需要更多次迭代才能找到最小值;均值歸一化之後的代價函式的輪廓更接近圓,那麼不論從哪個位置開始,都能比較直接的找到最小值,就可以在梯度下降中使用較大的步長,從而更快的找到最小值。總的來說就是特徵值取值範圍越相似,代價函式就會更圓,就更容易優化。

3)什麼時候用?

一般用於特徵值取值範圍相差較大的時候,這樣會顯著提高優化速度,但如果特徵值取值範圍相差不大,進行均值歸一化也沒什麼壞處,所以若沒法確定是否該進行均值歸一化的時候,那就均值歸一化吧。

7. vanishing/exploding gradients梯度消失與梯度爆炸

1)神經網路中,由於權重的疊加效應,啟用函式以及梯度都會隨著層數的增加而呈指數增長(或降低),當層數較大時,啟用函式或梯度就容易出現爆炸或消失的情況。

2)怎麼辦?

目前雖然沒有一個完整的方案可以徹底解決梯度消失或爆炸的情況,但可以通過對權重初始化的優化來改善它,輸入層神經單元越多,那麼得到的z就越大,為了防止梯度消失或爆炸,可以使其權重除以輸入層神經單元n[l-1]的個數(在初始化時),這樣新得到的z就不會變化過大。具體的對於不同啟用函式,人們研究了其對應的最優值:

8. Gradient Checking梯度檢驗

1)Numerical approximation of gradients梯度的數值逼近

雙邊誤差(two-sided difference)的值近似導數值(其實導數的定義就是雙邊誤差的極限),所以可以利用這一特性,檢查梯度的正確性。

上圖函式g是函式f的一階導數

2)梯度檢驗

可以通過梯度檢驗來檢查backprop的實施是否正確

梯度檢查首先要做的是分別將W[1],b[1],,W[L],b[L]這些矩陣構造成一維向量,然後將這些一維向量組合起來構成一個更大的一維向量θ。這樣cost function J(W[1],b[1],,W[L],b[L])就可以表示成J(θ)

然後將反向傳播過程通過梯度下降演算法得到的dW[1],db[1],,dW[L],db[L]按照一樣的順序構造成一個一維向量dθdθ的維度與θ一致。

接著利用J(θ)對每個θi計算近似梯度,其值與反向傳播演算法得到的dθi相比較,檢查是否一致。例如,對於第i個元素,近似梯度為:

dθapprox[i]=J(θ1,θ2,,θi+ε,)J(θ1,θ2,,θiε,)2ε

計算完所有θi的近似梯度後,可以計算dθapproxdθ的歐氏(Euclidean)距離來比較二者的相似度。公式如下:

||dθapproxdθ||2||dθapprox||2+||dθ||2

一般來說,如果歐氏距離越小,例如107,甚至更小,則表明dθapproxdθ越接近,即反向梯度計算是正確的,沒有bugs。如果歐氏距離較大,例如105,則表明梯度計算可能出現問題,需要再次檢查是否有bugs存在。如果歐氏距離很大,例如103,甚至更大,則表明dθapproxdθ差別很大,梯度下降計算過程有bugs,需要仔細檢查。

3)梯度檢查的使用技巧及注意事項

--不要在訓練過程使用梯度檢查!!!因為梯度檢查計算量大耗時長,所以一般只在debug的時候使用。

--如果梯度檢查失敗,那麼需要檢查所有項,並試著找出bug!! 通過比較dθapproxdθ,找到差異較大的dθ[i],檢查其計算導數的過程是否有bug

--如果梯度檢查中有正則化項,一定要記得正則化項!!  即如果對成本函式進行了正則化,梯度千萬不要忘記正則化項。

--梯度檢查不能與dropout同時使用!!

--隨機初始化之後進行梯度檢查,反覆訓練網路之後,再重新進行梯度檢查(不常用)

相關推薦

深度學習-改善深層神經網路》3--超引數除錯、正則化以及優化

1. 系統組織超參除錯Tuning process1)深度神經網路的超參有學習速率、層數、隱藏層單元數、mini-batch大小、學習速率衰減、β(優化演算法)等。其重要性各不相同,按重要性分類的話:   第一類:最重要的引數就是學習速率α    第二類:隱藏層單元數、min

深度學習-改善深層神經網路1--深度學習實用層面

 資料集深度學習是基於經驗的,即使是經驗豐富的專家也很難再專案開始的時候就能夠確定最優引數,比如神經網路的層數,每層的單元數,每層的啟用函式,學習速率等,一般是先選擇一個簡單的模型,通過不斷的迭代來修改各引數,直到最優解。法則一:一般在專案中會把資料集分成三份:訓練集(tra

[DeeplearningAI筆記]改善深層神經網路1.1_1.3深度學習實用層面_偏差/方差/欠擬合/過擬合/訓練集/驗證集/測試集

覺得有用的話,歡迎一起討論相互學習~Follow Me 1.1 訓練/開發/測試集 對於一個數據集而言,可以將一個數據集分為三個部分,一部分作為訓練集,一部分作為簡單交叉驗證集(dev)有時候也成為驗證集,最後一部分作為測試集(test).接下來我們開始

[DeeplearningAI筆記]改善深層神經網路_深度學習實用層面1.10_1.12/梯度消失/梯度爆炸/權重初始化

覺得有用的話,歡迎一起討論相互學習~Follow Me 1.10 梯度消失和梯度爆炸 當訓練神經網路,尤其是深度神經網路時,經常會出現的問題是梯度消失或者梯度爆炸,也就是說當你訓練深度網路時,導數或坡度有時會變得非常大,或非常小,甚至以指數方式變小.這加

系列課程——卷積神經網路(From:網易雲課堂)

一.卷積神經網路1.計算機視覺圖片分類、圖片識別:給出64*64圖片計算機判斷是否是一隻貓目標檢測:檢測出圖片中有哪些物體以及他們的位置風格遷移:圖片融合圖片1的輪廓和圖片2的風格eg:1000*1000大小的圖片的特徵向量將達到1000*1000*3(RGB 3channe

深度學習工程師系列課程之——改善深層神經網路:超引數除錯、正則化以及優化》學習筆記

本課程分為三週內容: 深度學習的使用層面 優化演算法 超引數除錯、Batch正則化和程式框架 WEEK1 深度學習的使用層面 1.建立神經網路時選擇: 神經網路層數 每層隱藏單元的個數 學習率為多少 各層採用的啟用函式為哪些 2

deeplearning.ai課程《改善深層神經網路:超引數除錯、正則化以及優化》____學習筆記(第一週)

____tz_zs學習筆記第一週 深度學習的實用層面(Practical aspects of Deep Learning)我們將學習如何有效運作神經網路(超引數調優、如何構建資料以及如何確保優化演算法快速執行)設定ML應用(Setting up your ML applic

改善深層神經網路引數:超引數除錯、正則化以及優化——優化演算法

機器學習的應用是一個高度依賴經驗的過程,伴隨著大量的迭代過程,你需要訓練大量的模型才能找到合適的那個,優化演算法能夠幫助你快速訓練模型。 難點:機器學習沒有在大資料發揮最大的作用,我們可以利用巨大的資料集來訓練網路,但是在大資料下訓練網路速度很慢; 使用快速的優化演算法大大提高效率

改善深層神經網路:超引數除錯、正則化以及優化 第一週

吳恩達 改善深層神經網路:超引數除錯、正則化以及優化 課程筆記  第一週 深度學習裡面的實用層面 1.1 測試集/訓練集/開發集        原始的機器學習裡面訓練集,測試集和開發集一般按照6:2:2的比例來進行劃分。但是傳統的機器學習

.深度學習系列-C1神經網路深度學習-w3-(作業:一個隱藏層進行二維資料分類)

前言 **注意:coursera要求不要在網際網路公佈自己的作業。如果你在學習這個課程,建議你進入課程系統自行完成作業。使用邏輯迴歸作為一個最簡單的類似神經網路來進行影象判別。我覺得程式碼有參考和保留的意義。v 使用一個 2×4×1的網路來對資料進

.深度學習系列-C1神經網路深度學習-W3淺層神經網路

詞彙 justification n. 理由;辯護;認為有理,認為正當;釋罪 prime n.角分號(g’(z)) shallow 淺層 學習目標 Understand hidden units and hidden layers

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

學習吳恩達DL.ai第二週視訊筆記。 1.深度學習實用層面 在訓練集和驗證集來自相同分佈的前提下,觀察訓練集的錯誤率和驗證集的錯誤率來判斷過擬合(high variance高方差)還是欠擬合(high bias高偏差). 比如訓練集錯誤率1%,驗證集11%則過擬合(

.深度學習系列-C1神經網路深度學習-W2-(作業:神經網路思想的邏輯迴歸)

注意:coursera要求不要在網際網路公佈自己的作業。如果你在學習這個課程,建議你進入課程系統自行完成作業。使用邏輯迴歸作為一個最簡單的類似神經網路來進行影象判別。我覺得程式碼有參考和保留的意義。 Logistic Regression with a N

.深度學習系列-C1神經網路深度學習-w4-( 作業:建立神經網路

前言 注意:coursera要求不要在網際網路公佈自己的作業。如果你在學習這個課程,建議你進入課程系統自行完成作業。我覺得程式碼有參考和保留的意義。 本週的作業包含兩個部分。Building your Deep Neural Network, De

改善深層神經網路——深度學習實用層面(5)

目錄 正則化 偏差大的解決辦法:在正則化引數合適的情況下增大網路(不影響方差) 方差大解決辦法:調整正則化引數或者準備更多資料增大資料集(不影響偏差) 正則化 邏輯迴歸正則化: 神經網路正則化: 6.Dropout正則化 除

TensorFlow入門-07.深度學習深層神經網路

0.深度學習的定義(維基百科): 一類通過多層非線性變換對高複雜性資料建模演算法的合集。 1.深度學習與深層神經網路的關係: 因為深層神經網路時實現“多層非線性變換”最常用的一種方法,所以在實際中基本上可以認為深度學習就是深層神經網路的代名詞。 2.深度學習的兩個重要

改善深層神經網路week1學習筆記

1.Initialization Zero initialization 即初始化為0。如果將w權重矩陣和b偏置矩陣都使用Zero initialization則會產生以下的結果: 演算法對每個測試樣裡都會輸出0,因此準確率在0.5左右,與隨機猜測無異。總體來說,因

DeepLearing學習筆記-改善深層神經網路(第三週作業-TensorFlow使用)

0- 背景: 採用TensorFlow的框架進行神經網路構建和結果預測 1- 環境依賴: import math import numpy as np import h5py import matplotlib.pyplot as plt import

【機器學習 】CS229課程筆記notes4翻譯-Part VI學習理論

CS229課程筆記 吳恩達 Part VI 學習理論 1 偏差/方差權衡         當我們談論線性迴歸,我們討論它是否擬合一個簡單的模型,比如線性模型“y=θ0+θ1x”,或者更復雜的模型,比如多項式模型“y=θ0+θ1x+θ2x2+θ3x3+θ

改善深層神經網路_優化演算法_mini-batch梯度下降、指數加權平均、動量梯度下降、RMSprop、Adam優化、學習率衰減

1.mini-batch梯度下降 在前面學習向量化時,知道了可以將訓練樣本橫向堆疊,形成一個輸入矩陣和對應的輸出矩陣: 當資料量不是太大時,這樣做當然會充分利用向量化的優點,一次訓練中就可以將所有訓練樣本涵蓋,速度也會較快。但當資料量急劇增大,達到百萬甚至更大的數量級時,組成的矩陣將極其龐大,直接對這麼大