內容來自https://www.bilibili.com/video/BV1FT4y1E74V,僅為本人學習所用。
文章目錄
- 訓練集、驗證集、測試集
- 偏差、方差
- 正則化
- 正則化參數
- 為什么正則化可以減少過擬合
- Dropout正則化
- Inverted Dropout
- 其他的正則化方法
- 數據增廣
- Early stopping
- 歸一化
- 梯度消失與梯度爆炸
- 產生原因
- 權重初始化
- He初始化
- Xavier初始化
- 梯度檢驗
- 梯度的數值逼近
- 步驟(如上圖)
- 一些建議
訓練集、驗證集、測試集
- 訓練集:用于訓練模型的數據集。通過學習訓練集中的數據特征和標簽之間的關系,來調整自身的參數,以盡可能準確地對數據進行擬合。
- 驗證集:在模型訓練過程中對模型進行評估和調整。在訓練過程中,使用驗證集可以監控模型的性能,如準確率、損失函數值,根據驗證集上的表現來選擇最優的模型參數。
- 測試集:在模型訓練和調優完成后,最終評估模型的性能。是一組完全獨立于訓練集和驗證集的數據,測試模型在實際應用中的泛化能力和準確性,判斷模型是否能夠很好地處理未見過的數據。
一般來說,數據集按照6:2:2或7:2:1的比例劃分為訓練集、驗證集和測試集。對于數據量非常大的數據集,驗證集和測試集的比例可以降低,比如95:2.5:2.5;而對于數據量較小的數據集,可以使用上述的原則。
有的時候會遇到這樣的場景:訓練一個識別貓的模型,訓練的時候使用的訓練集是大小固定,分辨率較低的圖片,但是在測試的時候使用的驗證集、測試集是隨機大小的,分辨率比較高的圖片。這兩類圖片是不同的,應該確保訓練集和驗證機、測試集的數據是同一個分布。
在訓練集上訓練數據,嘗試使用不同的模型框架;在驗證集上評估這些模型,迭代選出適用的模型;最后測試。
偏差、方差
偏差
是模型的預測值(期望輸出)與真實值之間的差異。高偏差意味著模型過于簡單,不能很好地捕捉數據中的復雜模式和特征,導致模型在訓練集和測試集上的表現都較差,出現欠擬合現象。
方差
描述的是模型對于給定數據集的預測結果的離散程度。如果模型在不同的訓練數據集上訓練后,得到的模型參數差異很大,導致預測結果波動較大,那么這個模型的方差就很高。高方差通常是因為模型過于復雜,對訓練數據中的噪聲和特定樣本的特征過度擬合,在訓練集上表現很好,但在測試集等新數據上表現不佳,出現過擬合現象。
偏差反映的是模型本身的擬合能力。從數學角度看,偏差衡量的是模型的期望預測與真實值之間的偏離程度;方差衡量的是模型預測結果的穩定性。
- 左圖 - high bias(高偏差):也叫
欠擬合
。模型過于簡單,無法很好地捕捉數據中的規律和特征,導致在訓練集上的表現就很差,對數據的擬合程度低。圖中用一條簡單的直線去劃分兩類數據點(圓圈和叉叉),明顯沒有很好地分開數據,在訓練集上的誤差就較大,更不用說在新數據上的表現了。 - 中圖 - just right(正好):也叫
適度擬合
。模型復雜度適中,能夠較好地學習到數據中的模式,既不會過于簡單而無法擬合數據,也不會過于復雜而只對訓練數據表現好。圖中用一條曲線比較合理地劃分了兩類數據點,在訓練集上有較好的擬合效果,同時也有較好的泛化能力,在新數據上也能有不錯的表現。 - 右圖 - high variance(高方差):也叫
過擬合
。模型過于復雜,把訓練數據中的一些偶然的特征也學習了進去,導致在訓練集上表現非常好,幾乎能完美擬合訓練數據,但在新數據上表現很差,泛化能力弱。圖中曲線過度地圍繞著數據點,甚至把一些可能是誤差的數據點也考慮進去了,雖然在訓練集上誤差極小,但在新數據上難以有好的表現。
在二維中可以直接可視化偏差和方差。但是在更多維中描述較為困難,使用幾個指標來描述偏差和方差。
識別一張貓的圖片,假設人的識別率是0%的錯誤。
- 在訓練集和測試集上錯誤率分別為1%和11%:說明模型對訓練集過擬合,對新的數據表現較差,稱為高方差。
- 在訓練集和測試集上錯誤率分別為15%和16%:說明模型對訓練集欠擬合,對新的數據表現也較差,稱為高偏差。
- 在訓練集和測試集上錯誤率分別為15%和30%:說明模型對訓練集欠擬合,但是對新的數據表現更差,稱為高偏差和高方差。
- 在訓練集和測試集上錯誤率分別為0.5%和1%:說明模型對訓練集和新的數據表現均較好,稱為低偏差和低方差。
圖中訓練集的紫色部分表現為高方差和高偏差。兩邊部分幾乎是一條直線,欠擬合,表現為高偏差,但是中間部分很靈活,對一些可能的錯誤點過擬合,(在新的數據上表現較差)表現為高方差。
對于高偏差的問題,嘗試選擇一個新的網絡、花費更多時間去訓練或者嘗試更先進的優化算法,一直到解決這個問題。當偏差降低到可以接受的范圍時,查看驗證集性能,檢查方差是否有問題。若方差較高,需要更多的數據去驗證或尋找更合適的神經網絡,但是有的時候并不能找到更多的數據的時候,可以采用正則化
來減少過擬合。做到具體問題具體分析,比如算法存在高偏差的問題,采用更多的數據去訓練作用則效果不大。
正則化
正則化參數
在模型的損失函數中添加一個懲罰項,對模型的參數進行約束。
以線性回歸模型為例,其原始損失函數為 L ( w , b ) = 1 n ∑ i = 1 n ( y i ? y ^ i ) 2 L(w,b)=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^2 L(w,b)=n1?∑i=1n?(yi??y^?i?)2,添加正則化項后變為 L ( w , b ) = 1 n ∑ i = 1 n ( y i ? y ^ i ) 2 + λ 2 m R ( w ) L(w,b)=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^2+ \frac{\lambda}{2m} R(w) L(w,b)=n1?i=1∑n?(yi??y^?i?)2+2mλ?R(w)。其中 λ \lambda λ是正則化系數,用于控制正則化的強度。 2 m 2m 2m是樣本數量的2倍,數字2主要是為了求導的方便。 R ( w ) R(w) R(w)是正則化項,它對模型參數 w w w進行約束,使模型參數不會過大,避免模型過于復雜而出現過擬合。
正則化項取 R ( w ) = ∑ j = 1 m w j 2 = w T w R(w)=\sum_{j=1}^{m}w_{j}^{2}=w^Tw R(w)=j=1∑m?wj2?=wTw稱為L2正則化(嶺回歸)
,對模型參數的平方求和。L2正則化使得 參數趨于較小的值,但不會使參數變為0,通過減小參數的量級來降低模型的復雜度,防止過擬合。
L2距離(歐幾里得距離):
- 在二維空間中:假設有兩個點 P ( x 1 , y 1 ) P(x_1,y_1) P(x1?,y1?)和 Q ( x 2 , y 2 ) Q(x_2,y_2) Q(x2?,y2?),它們之間的L2距離 d ( P , Q ) d(P,Q) d(P,Q)計算公式為 d ( P , Q ) = ( x 2 ? x 1 ) 2 + ( y 2 ? y 1 ) 2 d(P,Q)=\sqrt{(x_2 - x_1)^2+(y_2 - y_1)^2} d(P,Q)=(x2??x1?)2+(y2??y1?)2? 。幾何意義是兩點之間直線段的長度。
- 在n 維空間中:對于兩個 n 維向量 x = ( x 1 , x 2 , ? , x n ) \mathbf{x}=(x_1,x_2,\cdots,x_n) x=(x1?,x2?,?,xn?)和 y = ( y 1 , y 2 , ? , y n ) \mathbf{y}=(y_1,y_2,\cdots,y_n) y=(y1?,y2?,?,yn?),它們之間的L2距離 d ( x , y ) d(\mathbf{x},\mathbf{y}) d(x,y)的計算公式為 d ( x , y ) = ∑ i = 1 n ( y i ? x i ) 2 d(\mathbf{x},\mathbf{y})=\sqrt{\sum_{i = 1}^{n}(y_i - x_i)^2} d(x,y)=∑i=1n?(yi??xi?)2? 。
正則化系數 λ \lambda λ是一個超參數,需要通過驗證集等方法進行調整。 λ \lambda λ值過小,正則化效果不明顯,無法有效防止過擬合; λ \lambda λ值過大,會過度約束模型參數,導致模型過于簡單,出現欠擬合。采用交叉驗證等方法,在不同的 λ \lambda λ取值下訓練模型并在驗證集上評估性能指標,選擇使驗證集性能最優的 λ \lambda λ值。
反向傳播的時候,不要忘記對懲罰項的求導。
d w = ( 原損失函數求導的結果 ) + λ m w [ l ] \mathbf{d}w=(原損失函數求導的結果) + \frac{\lambda}{m}w^{[l]} dw=(原損失函數求導的結果)+mλ?w[l] w [ l ] : = w [ l ] ? α d w [ l ] w^{[l]}:=w^{[l]}-\alpha\mathbf{d}w^{[l]} w[l]:=w[l]?αdw[l]
為什么正則化可以減少過擬合
對于該損失函數,若 λ \lambda λ足夠大,求導后的 d w \mathbf{d}w dw也大,導致梯度下降的 w w w更小,當接近于0時,相當于將神經網絡的多個隱藏單元權重設置為0,整個大的神經網絡簡化成一個小的神經網絡,導致網絡欠擬合,更接近于高偏差的神經網絡。在調整 λ \lambda λ的過程中,總有個值讓神經網絡適度擬合。
實際上不是隱藏單元消失了,而是其權重變的更小。
Dropout正則化
對于左邊的過擬合的神經網絡,采用Dropout正則化
,在模型訓練過程中,Dropout以一定的概率隨機 丟棄(設置為 0)神經網絡中隱藏層和輸入層的一些神經元。右圖中,假設有遍歷每一層的神經元,假設每個神經元有50%的概率被丟棄。
Inverted Dropout
在普通Dropout中,訓練時以概率 p p p隨機將神經元的輸出設置為0,測試時所有神經元都正常工作,這就導致訓練和測試階段網絡的行為存在差異,測試時需要對網絡輸出進行額外的縮放調整來匹配訓練時的預期輸出。
反向隨機失活(Inverted Dropout)在訓練階段對激活值進行縮放補償,使測試階段無需額外調整。具體做法是:在訓練時,對于每個神經元,以概率 p p p將其輸出設置為0,同時將保留(未被丟棄)的神經元輸出除以 1 ? p 1 - p 1?p 。這樣做的效果是,訓練階段神經元輸出的期望值與測試階段所有神經元都正常工作時的期望值保持一致。
假設一個神經元在未應用Dropout時的輸出為 x x x ,Dropout概率為 p = 0.5 p = 0.5 p=0.5 。
- 普通Dropout訓練:該神經元有 0.5 0.5 0.5的概率輸出為0, 0.5 0.5 0.5的概率輸出為 x x x,其輸出的期望值為 0.5 × 0 + 0.5 × x = 0.5 x 0.5\times0 + 0.5\times x = 0.5x 0.5×0+0.5×x=0.5x 。測試時,所有神經元正常工作,輸出為 x x x ,因此測試時需要將訓練階段的輸出乘以2來匹配測試時的輸出。
- inverted dropout訓練:該神經元有 0.5 0.5 0.5的概率輸出為0, 0.5 0.5 0.5的概率輸出為 x 1 ? 0.5 = 2 x \frac{x}{1 - 0.5}=2x 1?0.5x?=2x ,其輸出的期望值為 0.5 × 0 + 0.5 × 2 x = x 0.5\times0 + 0.5\times2x = x 0.5×0+0.5×2x=x 。測試時,所有神經元正常工作,輸出同樣為 x x x ,無需額外調整。
每一層的概率(keep-prob)可以設置為不同的值,1表示全部保留。如果擔心某些層比其他層更容易發生擬合,可以將該層的keep-prob設置的比其他層更低,但這樣做缺點是需要使用交叉驗證搜尋更多的超參數。
Dropout正則化的缺點是損失函數 J J J不再有明確的定義,從而不能很好地繪制損失函數圖像。
其他的正則化方法
數據增廣
如果想要通過擴增訓練數據來解決過擬合問題,但是擴增數據代價較高,這個時候,可以在原有的數據集上添加改變后的數據集來增加訓練集(數據增廣
)。比如對圖片進行反轉或者裁剪;對文字旋轉或者變形。
Early stopping
在模型訓練過程中,模型在訓練集上的損失通常會不斷降低,而在驗證集上的損失會先下降,到達某一時刻后可能開始上升,這表明模型開始過擬合訓練數據。Early stopping 會在訓練過程中持續監控驗證集上的性能指標,當驗證集上的性能指標出現過擬合時,就停止訓練。
Early stopping提前停止訓練可能導致模型沒有充分學習到數據中的所有有用信息,沒有達到全局最優解,使得模型性能未達到理論上的最佳狀態。
歸一化
- 第一步,零均值化: μ = 1 m ∑ i = 1 m x ( i ) , x : = x ? μ \mu=\frac{1}{m}\sum_{i=1}^{m}x^{(i)},\ x:=x-\mu μ=m1?∑i=1m?x(i),?x:=x?μ。將數據的均值調整為 0 。有助于使數據在特征空間中分布更加對稱,減少數據的偏置影響。
- 第二步,方差歸一化: σ 2 = 1 m ∑ i = 1 m x ( i ) 2 , x / = σ 2 \sigma^2=\frac{1}{m}\sum_{i=1}^{m}x^{(i)^{2}},\ x/=\sigma^2 σ2=m1?∑i=1m?x(i)2,?x/=σ2。調整數據的方差,使不同特征的方差保持一致。如果不同特征的方差差異較大,那么方差大的特征可能會在模型訓練中占據主導地位,而方差小的特征的作用可能被忽視。
如果沒有歸一化,損失函數圖像像一個狹長的碗,在這樣的圖上運行梯度下降法,在更新參數時步伐不一致,可能導致在某些方向上過度更新,而在其他方向上更新不足,為了照顧不同的方向,學習率需設置的較小,從而需要更多的迭代次數才能收斂到最優解,增加了訓練時間和計算成本;歸一化使得損失函數更加對稱,算法可以更有效地調整參數,學習率可以設置的更大,花費更低的成本達到最優解。
梯度消失與梯度爆炸
- 梯度消失:在深度神經網絡的反向傳播過程中,梯度值隨著網絡層數的增加而逐漸變小,趨近于零。使得網絡中靠近輸入層的神經元的參數更新非常緩慢,甚至幾乎不更新,導致模型無法學習到足夠的信息,難以收斂到最優解。
- 梯度爆炸:與梯度消失相反,在反向傳播過程中,梯度值隨著網絡層數的增加而變得越來越大,導致參數更新步長過大,使得模型無法穩定收斂,甚至可能導致參數值變為NaN(非數值)。
產生原因
- 激活函數選擇:如果使用Sigmoid或Tanh等激活函數,它們的導數取值范圍是有限的,Sigmoid函數的導數在輸入值較大或較小時趨近于0。在深度網絡中,經過多層的鏈式求導后,梯度會不斷相乘,導致梯度值變得極小,從而引發梯度消失問題。
- 網絡層數過深:隨著網絡層數的增加,反向傳播時梯度需要經過多次乘法運算,這使得梯度值容易出現指數級的衰減(梯度消失)或增長(梯度爆炸)。
- 參數初始化不當:如果初始參數設置過大,在反向傳播過程中可能會導致梯度爆炸;如果初始參數設置過小,則可能加劇梯度消失問題。
權重初始化
He初始化
當使用ReLU激活函數時,傳統的初始化方法(如隨機初始化)可能會導致某些神經元在訓練初期就處于“死亡”狀態(即輸入小于0,輸出恒為0),或者使得梯度在反向傳播過程中迅速消失或爆炸。
He初始化是根據輸入層的神經元數量來調整初始化參數的方差,使得每一層的輸出方差在正向傳播過程中保持大致不變,同時在反向傳播時梯度的方差也能保持穩定,從而避免梯度消失和梯度爆炸問題,加速模型的收斂。
對于一個具有 n i n p u t (簡寫為 n i n ) n_{input}(簡寫為n_{in}) ninput?(簡寫為nin?)個輸入神經元的全連接層,其權重參數 W W W的每個元素 w i j w_{ij} wij?按照以下方式進行初始化:
- 從均值為0,標準差為 σ = 2 n i n \sigma = \sqrt{\frac{2}{n_{in}}} σ=nin?2??的正態分布中隨機采樣得到,即 w i j ~ N ( 0 , 2 n i n ) w_{ij} \sim N(0, \frac{2}{n_{in}}) wij?~N(0,nin?2?)。
- 也可以從均勻分布 U ( ? 6 n i n , 6 n i n ) U(-\sqrt{\frac{6}{n_{in}}}, \sqrt{\frac{6}{n_{in}}}) U(?nin?6??,nin?6??)中進行采樣。
對于卷積層, n i n n_{in} nin?表示輸入通道數乘以卷積核的高度和寬度。
Xavier初始化
對于一個具有 n i n n_{in} nin? 個輸入神經元和 n o u t n_{out} nout? 個輸出神經元的全連接層,其權重參數 W W W 的每個元素 w i j w_{ij} wij? 可以按照以下兩種方式進行初始化:
- 正態分布初始化:從均值為 0,標準差為 σ = 2 n i n + n o u t \sigma = \sqrt{\frac{2}{n_{in} + n_{out}}} σ=nin?+nout?2?? 的正態分布中隨機采樣得到,即 w i j ~ N ( 0 , 2 n i n + n o u t ) w_{ij} \sim N(0, \frac{2}{n_{in} + n_{out}}) wij?~N(0,nin?+nout?2?)。
- 均勻分布初始化:從均勻分布 U ( ? 6 n i n + n o u t , 6 n i n + n o u t ) U(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}) U(?nin?+nout?6??,nin?+nout?6??) 中進行采樣。
Xavier初始化比較適用于使用Sigmoid、Tanh等傳統激活函數的神經網絡。
梯度檢驗
在實現復雜的神經網絡和反向傳播算法時,代碼中可能會出現各種錯誤,如索引錯誤、矩陣運算錯誤等。梯度檢驗可以幫助我們及時發現這些錯誤,確保反向傳播算法的實現是正確的。
梯度的數值逼近
由導數的定義可知。在微積分中,函數 f ( x ) f(x) f(x) 在某一點 x x x 處的導數可以用極限來近似表示:
f ′ ( x ) ≈ f ( x + ? ) ? f ( x ? ? ) 2 ? f'(x) \approx \frac{f(x + \epsilon)-f(x - \epsilon)}{2\epsilon} f′(x)≈2?f(x+?)?f(x??)?
其中 ? \epsilon ? 是一個非常小的正數。
在神經網絡中,我們通過反向傳播算法計算損失函數 J ( θ ) J(\theta) J(θ) 關于參數 θ \theta θ 的導數 ? J ? θ \frac{\partial J}{\partial \theta} ?θ?J?,梯度檢驗就是將反向傳播計算得到的梯度與使用上述近似公式計算得到的梯度進行比較,如果兩者非常接近,則說明反向傳播算法的實現是正確的。
g ( θ ) g(\theta) g(θ)是 f ( θ ) f(\theta) f(θ)的導數。
可以看出誤差是0.0001,不是很大,說明該代碼是正確的。
步驟(如上圖)
- 定義損失函數和參數:明確神經網絡的損失函數 J ( θ ) J(\theta) J(θ) 以及需要更新的參數 θ \theta θ。
- 初始化參數:給參數 θ \theta θ 賦予初始值。
- 使用反向傳播計算梯度:通過反向傳播算法計算損失函數 J ( θ ) J(\theta) J(θ) 關于參數 θ \theta θ 的梯度 ? θ J \nabla_{\theta}J ?θ?J(對損失函數求某個參數的導數)。
- 使用數值近似計算梯度:對于參數 θ \theta θ 中的每一個元素 θ i \theta_i θi?,分別計算 J ( θ 1 , ? , θ i + ? , ? , θ n ) J(\theta_1, \cdots, \theta_i + \epsilon, \cdots, \theta_n) J(θ1?,?,θi?+?,?,θn?) 和 J ( θ 1 , ? , θ i ? ? , ? , θ n ) J(\theta_1, \cdots, \theta_i - \epsilon, \cdots, \theta_n) J(θ1?,?,θi???,?,θn?),然后使用近似公式 ? J ? θ i ≈ J ( θ 1 , ? , θ i + ? , ? , θ n ) ? J ( θ 1 , ? , θ i ? ? , ? , θ n ) 2 ? \frac{\partial J}{\partial \theta_i} \approx \frac{J(\theta_1, \cdots, \theta_i + \epsilon, \cdots, \theta_n)-J(\theta_1, \cdots, \theta_i - \epsilon, \cdots, \theta_n)}{2\epsilon} ?θi??J?≈2?J(θ1?,?,θi?+?,?,θn?)?J(θ1?,?,θi???,?,θn?)? 計算梯度的近似值。
- 比較兩種梯度:計算反向傳播得到的梯度 ? θ J \nabla_{\theta}J ?θ?J 和數值近似得到的梯度之間的差異,通常使用相對誤差來衡量:
d = ∥ ? θ J ? ? θ J a p p r o x ∥ 2 ∥ ? θ J ∥ 2 + ∥ ? θ J a p p r o x ∥ 2 d = \frac{\|\nabla_{\theta}J - \nabla_{\theta}J_{approx}\|_2}{\|\nabla_{\theta}J\|_2 + \|\nabla_{\theta}J_{approx}\|_2} d=∥?θ?J∥2?+∥?θ?Japprox?∥2?∥?θ?J??θ?Japprox?∥2??
其中 ∥ ? ∥ 2 \|\cdot\|_2 ∥?∥2? 表示向量的 L2 范數(L2距離)。如果相對誤差 d d d 非常小(例如小于 1 0 ? 7 10^{-7} 10?7),則說明反向傳播算法的實現是正確的;否則,可能存在代碼實現錯誤。
一些建議
- 梯度檢驗僅用于調試,不能訓練過程中使用。
- 若算法未能通過梯度檢驗,檢查各個值,比如如 d z \mathbf{d}z dz、 d w \mathbf{d}w dw、 d a \mathbf{d}a da,大概定位。
- 進行梯度檢驗時要考慮正則化項。
- 梯度檢驗不適用于帶有隨機失活(Dropout)的情況。
- 剛開始的時候初始化的W和b都很小,趨于0,而模型可能在W和b小的時候可以很好的計算梯度,但是當迭代了一段時間后,W和b變大,模型可能會在這一部分存在問題,因此這個時候在開啟梯度檢驗比較合適。