02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面
文章目錄
- 1. 訓練,驗證,測試集
- 2. 偏差,方差
- 3. 機器學習基礎
- 4. 正則化
- 5. 為什么正則化預防過擬合
- 6. dropout(隨機失活)正則化
- 7. 理解 dropout
- 8. 其他正則化
- 9. 歸一化輸入
- 10. 梯度消失 / 梯度爆炸
- 11. 神經網絡權重初始化
- 12. 梯度的數值逼近
- 13. 梯度檢驗
- 14. 梯度檢驗的注意事項
- 作業
參考:
吳恩達視頻課
深度學習筆記
1. 訓練,驗證,測試集
深度學習是一個典型的迭代過程,迭代的效率很關鍵
創建高質量的訓練數據集,驗證集和測試集有助于提高循環效率
- 切分標準:
小數據量時代,常見做法是三七分,70%驗證集,30%測試集;也可以 60%訓練,20%驗證和20%測試集來劃分。
大數據時代,數據量可能是百萬級別,驗證集和測試集占總量的比例會趨于變得更小。
我們的目的就是驗證不同的算法,檢驗哪種算法更有效,不需要拿出20%的數據作為驗證集,很少的一部分占比的數據就已經足夠多了。 - 數據來源:
最好要確保 驗證集 和 測試集 的數據來自同一分布,因為要用驗證集來評估不同的模型,如果驗證集和測試集來自同一個分布就會很好
2. 偏差,方差
關鍵數據:
訓練集誤差、驗證集誤差
如果最優誤差(貝葉斯誤差,人分辨的最優誤差)非常高,比如15%。那么上面第二種分類器(訓練誤差15%,驗證誤差16%),15%的錯誤率對訓練集來說也是非常合理的,偏差不高,方差也非常低。
(以上基于假設:基本誤差很小,訓練集和驗證集 來自相同分布)
根據這兩個指標,更好的優化算法。
3. 機器學習基礎
4. 正則化
正則化有助于防止過擬合,降低方差
范數(norm) 幾種范數的簡單介紹
- L1 范數:∣∣X∣∣1=∑i=1n∣xi∣||X||_1 = \sum\limits_{i=1}^n |x_i|∣∣X∣∣1?=i=1∑n?∣xi?∣ 表示非零元素的絕對值之和
- L2 范數:∣∣X∣∣2=∑i=1nxi2||X||_2 = \sqrt{\sum\limits_{i=1}^n {x_i}^2}∣∣X∣∣2?=i=1∑n?xi?2? 表示元素的平方和再開方
矩陣的范數叫做:弗羅貝尼烏斯范數,所有元素的平方和 ∣∣W∣∣F2||W||_F^{2}∣∣W∣∣F2?
加上 L2 正則化 的損失函數:
J(ω,b)=1m∑i=1mL(y^(i),y(i))+λ2m∥ω∥22J(\omega, b)=\frac{1}{m} \sum_{i=1}^{m} \mathcal L \left(\hat{y}^{(i)}, y^{(i)}\right)+\frac{\lambda}{2 m}\|\omega\|_{2}^{2}J(ω,b)=m1?i=1∑m?L(y^?(i),y(i))+2mλ?∥ω∥22?
- L1 正則,權重 w 最終變得稀疏,多數變成 0
- L2 正則,使得權重衰減
W[l]=(1?αλm)?W[l]?α(梯度)W^{[l]} = (1-\frac{\alpha\lambda}{m})*W^{[l]} - \alpha(梯度)W[l]=(1?mαλ?)?W[l]?α(梯度)
權重不但減少了,還乘以了小于1的系數進行衰減
5. 為什么正則化預防過擬合
J(ω,b)=1m∑i=1mL(y^(i),y(i))+λ2m∥ω∥22J(\omega, b)=\frac{1}{m} \sum_{i=1}^{m} \mathcal L \left(\hat{y}^{(i)}, y^{(i)}\right)+\frac{\lambda}{2 m}\|\omega\|_{2}^{2}J(ω,b)=m1?i=1∑m?L(y^?(i),y(i))+2mλ?∥ω∥22?
當 λ\lambdaλ 設置的很大的時候,最終 WWW 會變得很接近于 0,神經網絡中的很多單元的作用變得很小,整個網絡越來越接近邏輯回歸
λ\lambdaλ 增大時,整個神經網絡會計算離線性函數近的值,這個線性函數非常簡單,不是復雜的高度非線性函數,不會發生過擬合
L2 正則化是 訓練深度學習模型時最常用的一種方法
6. dropout(隨機失活)正則化
以上是一個樣本的過程,其他樣本也是同樣的過程。
實施 dropout 舉例:最常用的方法 - inverted dropout(反向隨機失活)
用一個三層網絡舉例
- 定義向量 ddd ,d[3]d^{[3]}d[3] 表示一個三層的 dropout 向量 d3 = np.random.rand(a3.shape[0],a3.shape[1]),對于元素小于 keep-prob 的,對應為 0,其概率為 1 - keep_prob
- 獲取激活函數 a[3]a^{[3]}a[3], a3 = np.multiply(a3, d3),使得 d[3]d^{[3]}d[3] 中為 0 的元素把 a[3]a^{[3]}a[3] 對應元素歸零
- 向外擴展 a[3]a^{[3]}a[3],a3 /= keep_prob
反向隨機失活(inverted dropout)方法通過除以keep-prob,確保 a[3]a^{[3]}a[3] 的期望值不變
7. 理解 dropout
- 其功能類似于 L2 正則化
- 對于參數集多的層,可以使用較低的 keep-prob 值(不同的層,可以使用不同的值),缺點是:需要交叉驗證更多的參數
dropout 一大缺點就是:代價函數不再被明確定義,每次迭代,都會隨機移除一些節點,想檢查梯度下降的性能,實際上是很難進行復查的
- 可以先關閉dropout,將keep-prob 設置為 1,確保 J 函數單調遞減
- 然后再嘗試打開dropout
8. 其他正則化
- 數據擴增,假如是圖片數據,擴增數據代價高,我們可以:
水平翻轉;隨意剪裁旋轉放大(這種方式擴增數據,進而正則化數據集,減少過擬合成本很低)
對于數字識別圖片,我們可以進行旋轉,扭曲來擴增數據集
- early stopping
在驗證集誤差變壞的時候,提早停止訓練
early stopping 缺點:不能同時處理 過擬合 和 代價函數不夠小的問題
- 提早停止,可能代價函數 J 不夠小
- 不提早結束,可能會過擬合
不使用 early stopping ,那么使用 L2 正則,這樣訓練時間可能很長,參數搜索空間大,計算代價很高
early stopping 優點:只運行一次梯度下降,可以找出 w 的較小值,中間值,較大值,無需嘗試 L2 正則化超參數 λ\lambdaλ 的很多值
9. 歸一化輸入
歸一化輸入,可以加速訓練
- 零均值(所有的數據減去均值)
- 歸一化方差(所有數據除以方差)
注意:μ,σ2\mu, \sigma^2μ,σ2 是由訓練集得到,然后用于其他所有數據集
10. 梯度消失 / 梯度爆炸
在非常深的神經網絡中,權重只要不等于 1,激活函數將會呈指數級遞增或者遞減,導致訓練難度上升,尤其是梯度與 L 相差指數級,梯度下降算法的步長會非常非常小,學習時間很長。
11. 神經網絡權重初始化
上面講到了梯度消失/爆炸,如何緩解這個問題?
為了預防 z 的值 過大 或 過小,n 越大時,你希望 wi 越小,合理的方法是 wi=1/nw_i = 1/nwi?=1/n,n 是輸入特征數量
w[l]=np.random.randn(shape)?np.sqrt(1n[l?1])w^{[l]} = np.random.randn(shape)*np.sqrt(\frac{1}{n^{[l-1]}})w[l]=np.random.randn(shape)?np.sqrt(n[l?1]1?),n[l?1]n^{[l-1]}n[l?1] 是給第 lll 層輸入的特征數量
- 如果使用ReLu激活函數(最常用),?np.sqrt(2n[l?1])*np.sqrt(\frac{2}{n^{[l-1]}})?np.sqrt(n[l?1]2?)
- 如果使用tanh激活函數,1n[l?1]\sqrt \frac{1}{n^{[l-1]}}n[l?1]1??,或者 2n[l?1]+n[l]\sqrt \frac{2}{n^{[l-1]}+n^{[l]}}n[l?1]+n[l]2??
這樣設置的權重矩陣既不會增長過快,也不會太快下降到 0
從而訓練出一個權重或梯度不會增長或消失過快的深度網絡
我們在訓練深度網絡時,這也是一個加快訓練速度的技巧
12. 梯度的數值逼近
在反向傳播時,有個測試叫做梯度檢驗
我們使用雙邊誤差,
f′(θ)=f(θ+ε)?f(θ?ε)2ε\left.f^{\prime}( \theta\right)=\frac{f(\theta+\varepsilon)-f(\theta-\varepsilon)}{2 \varepsilon}f′(θ)=2εf(θ+ε)?f(θ?ε)?
不使用單邊誤差,因為前者更準確。
13. 梯度檢驗
梯度檢驗幫助我們發現反向傳播中的 bug
dθapprox?[i]=J(θ1,θ2,…θi+ε,…)?J(θ1,θ2,…θi?ε,…)2εd \theta_{\text {approx }}[i]=\frac{J\left(\theta_{1}, \theta_{2}, \ldots \theta_{i}+\varepsilon, \ldots\right)-J\left(\theta_{1}, \theta_{2}, \ldots \theta_{i}-\varepsilon, \ldots\right)}{2 \varepsilon}dθapprox??[i]=2εJ(θ1?,θ2?,…θi?+ε,…)?J(θ1?,θ2?,…θi??ε,…)?
dθ[i]=?J?θid \theta[i]=\frac{\partial J}{\partial \theta_{i}}dθ[i]=?θi??J?
檢驗 dθapprox?[i]≈dθ[i]d \theta_{\text {approx }}[i] \approx d \theta[i]dθapprox??[i]≈dθ[i]
∥dθapprox??dθ∥2∥dθapprox?∥2+∣∣dθ∣∣2\frac{\left\|d \theta_{\text {approx }}-d \theta\right\|_{2}}{ \left\|d \theta_{\text {approx }}\right\|_{2}+||d \theta||_2}∥dθapprox??∥2?+∣∣dθ∣∣2?∥dθapprox???dθ∥2??
檢查上式的值是否 <10?7< 10^{-7}<10?7
14. 梯度檢驗的注意事項
作業
02.改善深層神經網絡:超參數調試、正則化以及優化 W1.深度學習的實踐層面(作業:初始化+正則化+梯度檢驗)
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 410. 分割数组的最
- 下一篇: LeetCode 732. 我的日程安排