相關課件:https://download.csdn.net/download/haoyutiangang/10495501
2.1 訓練 / 開發 / 測試集
- 訓練集: 訓練數據模型
- 開發驗證集: 選擇最好的模型
- 測試集: 無偏評估算法的運行狀況
數據劃分比例
- 小數據量(10-10000):60/20/20
- 大數據量(1000000) : 98/1/1
- 超大數據量: 99.5/0.25/0.25
- 應該確保開發驗證集與測試集來自同一分佈。
- 在不需要無偏評估的時候可以沒有測試集,只有訓練集和開發驗證集,這時候有些人把開發驗證集叫做測試集,所以當別人說他們只有訓練集和測試集時,其實應該說只有訓練集合開發驗證集。
2.2 偏差 / 方差
- 高偏差:欠擬合
- 高方差:過擬合
評判
以下假設最優誤差可以達到很小
訓練集誤差 | 測試集誤差 | 結論 |
---|---|---|
1% | 10% | 高方差 |
15% | 16% | 高偏差 |
15% | 30% | 高偏差 & 高方差 |
0.5% | 1% | 低偏差 & 低方差 |
2.3 機器學習基礎
- 高偏差:欠擬合
- 增加網絡結構,比如增加隱藏層數量
- 訓練更長的時間(不一定好使)
- (尋找合適的網絡架構)
- 高方差:過擬合
- 獲取更多的數據
- 正則化(regularization)
- (尋找合適的網絡架構)
通過以上方法我們可以實現降低一方的同時不增加另一方,這也是深度學習對監督式學習的裨益。
2.4 正則化(Regularization)
過擬合(低偏差,高方差)的時候第一想到的應該是正則化,因爲獲取更多的數據有時並不那麼容易。
2.4.1 邏輯迴歸(Logistic regression)
邏輯迴歸的L2正則化,因爲W變化影響大,所以正則化時僅對w進行正則化
- L2 正則化: 每一項平方的和
- L1 正則化:每一項和的絕對值
lambda 爲Python保留字,編程時可以用lambd代替。
2.4.2 神經網絡(Neural network)
神經網絡的正則化
後面仍然是每一項平方的加和, 該矩陣範數稱爲“Frobenius norm”
2.4.3 權重衰減
加入正則化後,梯度變爲:
梯度更新公式變爲:
代入可得:
因爲W係數小於1,所以相當於給了W一個衰減的參數,故L2範數正則化也被稱爲"權重衰減(Weight decay)"。
2.5 爲什麼正則化可以減少過擬合
上文介紹,L2正則化後
當lambda變得很大時,W會變得很小甚至趨近於零,而神經網絡就趨近於線性迴歸,由於線性迴歸不能解決複雜擬合的情況,所以在一定程度上可以起到消除過擬合的問題。
當然實際情況中,我們不會設置特別大的lambda, 但是從分析我們可以知道,存在一個lambda可以部分消除過擬合而不至於欠擬合。
2.6 Dropout 正則化
Dropout(隨機失活): 隨機消除一些神經元節點,保留下來的較小規模結構的神經網絡進行訓練。
2.6.1 實現方法
反向隨機失活:Inverted dropout
假設我們要對第3層進行dropout(修改的是a3)
keep_prob = 0.8 # 設置神經元保留概率
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob # 隨機消除矩陣
a3 = np.multiply(a3, d3) # 隨機消除後的a3
a3 /= keep_prob # 除以keep_prob,保持Z4期望值不變,Z4 = W4+b4
僅在訓練階段使用dropout,在測試階段不要使用,那樣會使預測結果變得隨機。
2.7 理解 Dropout
- 由於任何節點都可能被消除,所以無法依賴於某一個節點或者某一個輸入特徵,從而起到壓縮權重的作用(權重分佈更加均勻)
- 不同層的 keep_prob 可變,懷疑哪層造成過擬合則可以在那一層設置較小的keep_prob
- 通產不對輸入層進行dropout
缺點: 由於每次J都在變化,所以無法繪製出梯度下降圖。
使用:
- 關閉dropout, 即設置keep_prob = 1
- 運行代碼,確保J單調遞減
- 再打開dropout進行訓練
2.8 其他正則化方法
- 數據擴增(Data augmentation): 圖片變換增加圖片數據量,轉換,剪裁等等。
- early_stopping: 提前停止梯度下降。
- 缺點: 無法單獨處理偏差和方差,經常在方差不大的時候停止,此時偏差不夠理想。
2.9 歸一化輸入
講的是對輸入的歸一化,歸一化到同樣的範圍內
歸一化均值
歸一化方差:
在訓練集和測試集上使用同樣的均值和方差進行歸一化
不使用歸一化的代價函數中很可能我們需要很多次迭代才能到達全局最優解;如果使用了歸一化,無論從哪個位置開始迭代,我們都能以相對很少的迭代次數找到全局最優解。
2.10 梯度消失與梯度爆炸
假設g(z) = z; b = 0
- 當各層W相等且大於1時,激活函數的值將以指數級遞增
- 當各層W相等且小於1時,激活函數的值將以指數級遞減
在梯度函數上出現的以指數級遞增或者遞減的情況就分別稱爲梯度爆炸或者梯度消失。
2.11 神經網絡的權重初始化
隨機初始化權重W
爲了消除梯度消失和梯度爆炸,我們想把W設置爲1附近。
所以可以設置w_i 爲1/n
這裏除以的是輸入個數的算術平方根。
-
tanh 是合適於
又稱爲Xavier初始化 -
relu適合於
當然你也可以將其作爲一個參數進行調試,但是相比於其他參數而言,這個參數調參的優先級較低。
2.12 梯度的數值逼近
使用雙邊誤差的方法去逼近導數更準確, 精度比單邊導數高很多
2.13 梯度檢驗
因爲複雜函數求導比較複雜,容易出錯,所以需要進行梯度檢驗,驗證我們的反向傳播計算是否準確。
- 參數
- 參數向量連接:將各個參數轉化爲列向量(n*1的矩陣),然後按照順序連接這些列向量爲一個大的列向量 theta。
- 導參數向量連接:同上
- 逼近求導:循環向量的每一個值i,利用雙邊導數定義計算 J_i+ , J_i- , 從而計算出 J’(下面說明 J_i+的計算方法,J_i-類似)
- 向量矩陣的第 i 個值加上很小的 epsilon
- 將向量反向轉化爲參數 W,…b
- 利用各個參數求出 J 是爲 J_i+, 同理可求J_i-
- 3中循環各個 i 後計算的 J’ 組合爲一個導數列向量d_theta_approx, 與2的 d_theta 進行梯度檢驗
其中 ||.||_2 表示歐幾里得範數,表示平方只和的平方根,得到歐氏距離。
- check 的值:
- 10e(-7) great!
- 10e(-5) please check!
- 10e(-3) wrong!
2.14 關於梯度檢驗實現的註記
- 不要在訓練中使用
- 僅僅用於 debug
- 如果梯度檢驗失敗,仔細檢查d_theta_approx的每一項,哪一項與 d_theta 相差越大,對應到參數 W或 b.可能幫你定位到 bug
- 記着使用正則化
- 不可與 dropout 同時使用,此時可以設置 dropout 的 keep_prob = 1.0
- 隨機初始化參數爲比較小的值