吳恩達Deeplearning.ai 知識點梳理(course 2,week 1)

Course 2主要講的是實踐,以及讓神經網絡工作的更好。

Traing/Dev/Test Set

  在Machine Learning中,一般會將數據集分成Training Set,Develop Set以及Test Set。Training Set用於訓練模型,Develop Set用於評估不同模型的性能(hold out/cross validation),Test Set用於最終的測試,得到一個無偏的結果。

  傳統機器學習問題上,數據集大概在100/1000/10,000的規模上,那麼三種數據集的佔比就是60%/20%/20%,如果沒有test set,只有training set和dev set,那麼就是70%/30%佔比。這個佔比在業界就是rule of thumb。但是對於深度學習而言,數據集的量往往會達到1,000,000,這個時候一般dev set和test set就10,000就可以了。也就是98%/1%/1%的佔比。

  很多人在調試的時候,會不用test set,只用training set和dev set,這個時候經常就把dev set叫做test set。所以這個名稱有時候容易混淆。但是這種的話,其實最後得到的模型結果不是無偏的,因爲人爲的去dev set的結果選擇模型啊等等(這個過程相當於人爲的根據dev set進行訓練),會導致整個結果容易在dev set上過擬合。雖然得到好結果,但是依舊在新問題上不能解決。當然,具體問題具體分析,有的時候確實不需要這個test set。

  另外一個問題是training/dev/test set的分佈不一樣。一個典型的例子是,比方我做了一個app,用來判別貓的圖和沒有貓的圖。我做了一個爬蟲收集到網上很多圖片,訓練了一個很好的模型,然後給用戶用。但是用戶用手機拍貓,判別的結果並不好。爲什麼呢?因爲爬蟲爬到的圖片,很可能很多都是藝術圖片,光線、清晰度、分辨率,都很高。而用戶用手機拍,光線條件可能會更隨意一些,另外如果有手抖星人,圖片模糊一些,就更不好了。這就是說訓練和最終的測試數據集分佈不一樣導致的效果不好。稱爲Mismatched train/dev distribution。

Bias/Variance

  Bias就是training error,Variance就是Develop error。在傳統的機器學習問題上,通常會有Bias-Variance Trade Off的討論。但是在深度學習上,則很少討論這個Trade Off的問題。如下圖所示:

Bias and Viariance

這就是典型的High Bias,Just Right以及High Variance,對應的是underfitting,just right以及overfitting。

  如果具體的數字,可以看到下一個示例:比方說我們有一個二分類問題,鑑別圖像中是否有貓,然後我們經過訓練模型後得到如下的結果:

結果編號 Bias Variance 評價
1 1% 11% High Variance
2 15% 16% High Bias
3 15% 30% High Variance and High Bias
4 0.5% 1% Low Variance and Low Bias

對於第一組結果來說,顯然Bias很小,但是Variance很大,所以這個是overfitting,第二個是underfitting,因爲bias和variance之間其實只差了1%,而第三個顯然又underfitting,又有很大的variance。第四個就是happing ending了。

  High Variance and High Bias的情況是什麼樣的呢?如下圖所示:

首先這個分類面因爲自身原因,導致無法fit,比方說圖裏邊的直線是無法fit這個數據集的,但是在某些區域,例如中間的位置,又overfit了。這是二維的情形,多維情況下,在沒怎麼設計好的模型上邊會更容易出現。

Basic recipe for machine learning

  一般來說,機器學習,尤其是深度學習,可以按照如下的方式進行:
Basic recipe for machine learning

  1. 首先看是否有High Bias,如果有,那麼就試試Bigger Network(一般都能奏效);run longer(就算不奏效也沒有hurt);換一個神經網絡架構(這個就得試試才知道結果了),一般來說經過這個都能把bias給去掉。
  2. 如果沒有High Bias,那就看看是否有High Variance,如果有,那麼有這麼幾種方法,一是用更多的數據(基本上都會奏效),二是使用正則化,三是使用其他神經網絡架構。
  3. 如果High Bias和High Variance都沒了,那就完成啦。

有這麼2點Note:
+ High Bias和High Variance的處理方法是很不一樣的,所以最好先用dev set進行問題診斷。比方說如果有High Bias問題,那麼增加數據集一般都不會有用的。
+ 對於傳統的Machine Learning來說,通常會有一個Bias和Variance的Trade Off。因爲那個時候並沒有什麼特別好的工具來解決這類問題。但是現在不一樣了。在深度學習和大數據時代,我們可以比較獨立的調整Bias和Variance。一般來說,把神經網絡變大,同時做好正則化,一般並不一定會在減小Bias的同時增加Variance,當然,這樣肯定會增加計算量。而增加數據也通常會在減小variance的同時,不去影響bias。這也是爲什麼深度學習在監督學習領域裏比較成功的原因。

正則化(Regularization)

Weight Decay/L2 Norm(F Norm) Regularization

  下圖是Neural Network的Regularization。

就是在損失函數的末尾加上W 的F-Norm。這樣就可以控制W 內元素的整體大小。之所以叫Weight Decay(雖然不常用這個名字),是因爲在backpropagation的時候W 前邊係數是1αλm ,這是一個小於1的值。

  爲什麼L2 Regularization可以減輕Overfitting呢?如下兩個圖所示:
這裏寫圖片描述

這裏寫圖片描述

由於對W 內元素限制了大小,比方說有些Weight值很小,可以理解爲整個網絡中隱含層的神經元都“啞”了,不說話了,在這種條件下,整個網絡結構變得簡單,於是就趨向簡單的模型,在這個過程中,就減少了variance。還有一種理解是,假如activation是tanh或者sigmoid等函數,那麼weight很小,就比較接近原點這一段,這一段比較趨近於線性,那麼整個網絡就會趨向於線性網絡,從而又減少模型的複雜性,從而降低variance。

Dropout Regularization(隨機失活)

  Dropout Regularization是妥妥的直接刪掉一些神經元。在每一次迭代的時候,都是根據dropout的概率,刪掉一些神經元的輸出。如下:
Dropout Implementation
注意由於做了歸一化,那麼在test的時候就不用再去歸一化啥的了。
爲什麼隨機失活能夠起作用呢?
1. 在訓練的時候,因爲刪掉了一些神經元,所以相當於在一個更小的神經網絡上訓練。
2. 對於一個神經元來說,由於它的輸入可能隨機失活,所以會更傾向於給每個輸入一個小權重,這樣整體就減少了權重的L2 Norm(收縮權值),所以最後和L2 Norm比較相似。但是從機制上說,dropout是一種自適應形式而不是L2 Norm那種懲罰性正則化。
3. Dropout是一種正則化手段,一般在計算機視覺上用的很多,因爲維度很大。除非網絡已經過擬合了,否則不會使用這種手段。
4. Dropout還有一個問題就是使得Loss function不是那麼well defined了。所以調試時想要畫圖,就得把留存率設成1,然後畫圖看一下對錯。

Other Regularization

Data Augmentation

  Data Augmentation 好處就是不用出門蒐集數據。壞處就是數據集比較冗餘。但是畢竟省事兒,幾乎不要錢,只是增加計算量,值得一試。
1. 翻轉
2. 隨機裁切縮放

Early Stopping

  Early Stopping就是把training set和dev set的損失函數畫出來,然後在dev set 的損失最小的地方停止。因爲weight一開始很小,等到訓練到最後可能就比較大了,所以在中間停止,這樣w就是一箇中間值。
  不過Early Stopping有個不好的,就是把bias和variance一起調,這事就不是很好,不好調。

Normalizing Input

  就是把輸入的每一維歸一化一下。好處是可以更容易優化:
Normalizing Input
如果不做好歸一化,learning_rate就得設置的特別小,否則要是把learning_rate的設置的大一些,就會導致總是震來震去的。

梯度消失/爆炸

  Dr. Ng給出的解釋是,假如神經網絡的層數太多,那麼激活函數/梯度會因爲一級一級乘下來導致激活函數/梯度變得很大或者很小(指數級):
這裏寫圖片描述

參數初始化

  梯度爆炸/消失的問題雖然很逾越,但是可以通過合適的選擇w的初始值來減輕題都爆炸和消失的程度。
Weight Initializaton
將weight總體的均值控制在0,方差控制在1,就會比較好一些。那麼對於單個的w則可以乘以1/n[l1] ,對於ReLU,設置爲2則好一些。對於其他的,例如tanh,則是1,也稱Xavier initializaton,ReLU則是2的那個。

Gradient Checking

  用來檢查代碼是不是對的。可以用數值的方法計算出來,然後代碼計算,看一下兩個值是否一致,或者相比來說比較小。具體略。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章