深度學習層數、 Hidden Unit 數量、 Activation Function 、 Learning Rate 等需要決定的 Hyperparameters 通常會透過多次的測試來決定。
將資料切分成 Train / Dev / Test 三份,用 Train Set 訓練模型、 Dev Set 檢查不同 Hyperparameters 下模型的效果,並挑出表現最好的 Hyperparameters 、最後用 Test Set 得到無偏差的模型效果評估。
在傳統機器學習上,會用 60 / 20 / 20 的方式去切資料。但隨著資料量增大, Andrew 建議不用跟隨此原則, Dev / Test Set 皆各取一萬筆資料即可,其餘的皆用來訓練模型。
在切分資料的時候要注意,最好三份資料的分佈狀態皆是接近的,尤其是 Dev / Test Set ,因為這兩份會拿來評估模型的表現。
而若不想得到無偏差的模型效果評估,就可以不用切出 Test Set 。
透過 Train / Dev Set 來檢查模型是否有 High Bias 或 High Variance 。
假設已知模型最佳表現為 x ,則若在 Train Set 表現接近於 x ,是 Low Bias ,反之是 High Bias 。
若在 Dev Set 之表現接近於在 Train Set 之表現,是 Low Variance ,反之是 High Variance 。
建構深度學習網路時可以依照下面的步驟進行。首先將 Bias 降到足夠低,可以透過加大網路、增加訓練時間、改變神經網路的架構來達成。
當 Bias 夠低時,檢查 Variance 是否會高,若高的話,透過增加 Training Samples 、加上 Regularization 、改變神經網路的架構來降低。
調整過後再回頭檢視 Bias ,重複過程,直到 Bias 和 Variance 達到要求。
L2 Regularization :所有的 w 平方後相加。
L1 Regularization :所有的 w 絕對值相加。會使得 w 比較稀疏(較多 0 )。
上圖為加上 L2 Regularization 後做 Gradient Descent 的推導。
可以發現加上 L2 Regularization 後,每次更新 w 時,會多出一項 (- alpha*lambda/m)*w ,會使 w 每次都往 0 更靠近,因此又被稱作 Weight Decay 。
L2 Regularization 可以降低 Variance ,是因為它會使得 W 變小,使神經網路中,節點影響力下降,相對降低神經網路的複雜度。
另一種說法是,當使用 Tanh 當作 Activation Function 時,由於降低 W 會使進入 Tanh 的值變小較接近於零,其是在 Tanh 中接近於線性反應的區間,因此會讓神經網路的每個節點都變成幾近線性,降低複雜度。
- From HW: L2-regularization relies on the assumption that a model with small weights is simpler than a model with large weights. Thus, by penalizing the square values of the weights in the cost function you drive all the weights to smaller values. It becomes too costly for the cost to have large weights! This leads to a smoother model in which the output changes more slowly as the input changes.
神經網路中另一種 Regularization 的方式為 Dropout 。設定每個節點在訓練時保留的機率,每次會刪掉不同的節點進行訓練。
而訓練完後,使用神經網路時,不需要刪掉任何節點。
現在最常用的 Dropout 方式為 Inverted Dropout ,它會依照刪除節點的機率,重新 Normalize 每層的 Activation Value 。如此可以確保,每次下一層拿到的輸入期望值都會是一樣的,不會降低。下圖中的 a3 /= keep-prob 即是在做這件事。
Dropout 因為每次都會隨機刪除掉一些節點,所以每個節點不會僅依靠前一層的少數節點,否則當這些節點被刪除時,就無法有正確輸出。因此會平均分佈權重在前一層的所有節點上,與 L2 Regularization 的效果類似。
- From HW: When you shut some neurons down, you actually modify your model. The idea behind drop-out is that at each iteration, you train a different model that uses only a subset of your neurons. With dropout, your neurons thus become less sensitive to the activation of one other specific neuron, because that other neuron might be shut down at any time.
Dropout 只需用在訓練時。
Dropout 可以設定不同的機率在不同層上,通常會在參數比較多的層設定較大的機率。不過這樣的方式也會讓 Hyperparameters 增加,需要微調每個層設定的 Dropout 機率。折中的做法是,選取一些層做 Dropout ,另一些不做,而這些做 Dropout 的層皆使用相同的機率。
Dropout 一開始是使用於電腦視覺領域,因為相較於影像像素數量,訓練的資料都不太足夠,多會有 Overfitting 的問題。但不一定同樣適用於其他的領域。
Dropout 的缺點是,使用後 Cost Function 將不再能完整定義,因為每次會有隨機的節點被丟掉。所以在每次的訓練迴圈裡, Cost Function 不一定皆會遞減。若要檢查訓練過程是否有問題,最好將 Dropout 關掉比較容易檢查。
其他 Regularization 的方法:
Data Augmentation ,如將圖片的資料做旋轉、縮放等處理後,當作一個新的訓練資料。使模型適應更多樣化的資料。
Early Stop ,訓練模型時,若 Dev Set 的 Cost Function 開始上升,即停止。但 Andrew 並不推薦這樣的做法,因為 Early Stop 同時也使 Cost 沒有降到最低。他認為降低 Cost 、避免 Overfitting 兩件事,應該分開來處理,降低耦合性。
在訓練神經網路時,先將所有的輸入特徵皆 Normalize 成平均為零、變異數為一。這樣可以加快訓練速度。
訓練深度神經網路的一個問題是, Gradient Vanishing / Exploding。當層數很多時,只要數值不接近於 1 ,經過多層的傳播,數值即會變很大或很小。
其中一個解決方式是,在一開始的時候對於 W 做好的初始化,讓 Activation Function 出來的數字能盡量接近 1 。當 Input 越多時, W 的初始化就要越小,如此才能使最後輸出的值較小。而不同的 Activation Function 也有不同的初始化方式。若用 Relu ,通常用 :
np.random.randn(shape)*np.sqrt(2/n^(l-1)) 。
在檢查 Gradient 算的正不正確時,用 Double Side 的估計方式會比較準。
同時 Andrew 也給我們準則,看怎麼樣的狀況是計算 Gradient 有問題。