訓練集上表現不好(high bias)
- 嘗試使用更復雜更大的網絡結構(增加單元數、增加層數,或者更改結構)
- 增加訓練次數
更換激活函數
sigmoid 函數
sigmoid 缺點:
- 梯度消失
如圖sigmoid函數導數處在0-0.4間 而且很大範圍內都趨近於零。那麼在反向傳播的過程中梯度越傳越小,造成前幾層的梯度特別小。
2. 非中心對稱
sigmoid 的值恆大於0,那麼對於下一層來說,它的輸入永遠是正數,反向求導時,對於所有參數來說,
=這層輸入永遠是正數,更新方向取決於回傳的梯度,不同參數無法沿不同方向更新。容易出現zigzag現象。
3. 計算量大
tanh
解決了非原點對稱問題,但是還是有梯度消失問題
ReLU
優點:
- 實驗效果證明收斂較快
- 符合人的神經節運作方式
- 解決梯度消失問題
缺點:
由於當輸出恆爲負時回傳梯度爲0,會出現dead ReLU現象
Leakly ReLU & Parametric ReLU
解決了dead ReLU 問題
Exponential ReLU
可以看做介於relu和LeakyReLU之間。需要計算exp,從而計算量上更大一些。
Maxout
相當於一個group(輸出節點數)中學習k組參數,然後從中選出激活值最大的作爲這個節點的輸出。
其實是一個k段的分段函數,理論上可以擬合任意凸函數
參數量x k倍。
學習率優化
學習率衰減
- 等間隔調整學習率 StepLR
- 多間隔調整學習率 MultiStepLR
- 指數衰減調整學習率 ExponentialLR
- 餘弦退火函數調整學習率:CosineAnnealingLR
- 根據指標調整學習率 ReduceLROnPlateau
當某指標(loss或accuracy)在最近幾個epoch中都沒有變化(下降或升高超過給定閾值)時,調整學習率。
自適應學習率調整(學習率優化)
傳統SGD的缺點,爲什麼提出學習率優化
- 學習率大小和策略選擇困難
- 學習率不夠智能,對所有參數一視同仁。
- 同時面臨局部極值和鞍點的問題。
Momentum 動量法
協同參考之前累積的的梯度方向
Nesterov牛頓動量法(根據累計梯度計算提前點)
先按照動量方向前進到點C,再根據C點的梯度進行梯度下降,相比動量法
Adagrad(累計梯度反比)
對於不同的參數動態的採取不同的學習率,讓目標函數更快的收斂。
將每一個參數的累計梯度平方和開方,用基礎學習率除以這個數,來做學習率的動態更新。
adagrad算法一開始是激勵收斂,到了後面就慢慢變成懲罰收斂,速度越來越慢。
why?
不同維度變量的梯度變化率不一致,更新的步長不僅要與函數值變化率(一次微分)成正比,還要與導數變化率(二次微分)成反比,因爲曲線曲率越大,那麼導數變得快,到極值點的距離就越小,曲線曲率越小,導數變得慢,到極值點的距離越大。
這裏用累計梯度平方和來近似二次微分。
RMSprop(滑動窗口)
上述Adagrad 分母項爲前序梯度的累加值,會出現學習率越來越小,造成學習停滯問題。很可能出現早期迭代到不好的極值點之後,由於學習率太小而無法衝出這個極值點導致最後收斂到的解不優。RMSprop採用指數加權移動平均的方法解決。(滑動窗口思想)
AdaDelta(自適應學習率)
使用上次的近似變化量來近似學習率
Adam算法
= 動量法+RMSProp
測試集上表現不好(high varience)
- 收集更多的訓練數據
- 降低模型複雜度
降低參數空間的維度
剪枝 參數共享
降低每個維度上的有效規模(正則化)
L1、L2正則化
爲什麼減小參數大小->泛化能力好
如果參數絕對值都非常大,這種現象直觀表現在圖上就是曲線(曲面)不光滑,凹凸不平,很複雜;相反,如果w的各個分量的絕對值都很小,在0附近,那麼曲線(曲面)就會顯得很平滑。很顯然,在機器學習中,我們更希望擬合出的曲線(曲面)更爲平滑,因爲這樣的曲線(曲面)是具有較好的泛化能力的。
- L2 正則化
每次乘一個恆小於1的項,導致越來越小,趨近於0,但是由於符合高斯分佈,並不真正衰減爲0。L2正則化對於絕對值較大的權重予以很重的懲罰,對於絕對值很小的權重予以非常非常小的懲罰,當權重絕對值趨近於0時,基本不懲罰。
這樣有利於處理共線性強的特徵。
但是不能獲得較爲稀疏的網絡(權重!=0)。 - L1 正則化
那麼w原來是負數就+,原來是正數就-,整體優化方向=0
相對L2來說,面對不同的w值梯度恆等,那麼有利於較小值歸零,完成稀疏化,用於特徵選取。但是一開始值比較大的話對該權重的約束就不大了。
缺點:對於共線性強的特徵只留一個,但是有可能這幾個特徵對於決策都有用。
Early Stopping
訓練中計算模型在驗證集上的表現,當模型在驗證集上的表現開始下降的時候,停止訓練,這樣就能避免繼續訓練導致過擬合的問題
理論訓練誤差曲線
早停標準:
- st:泛化誤差大 , 泛化損失=泛化誤差/目前的最低的誤差-1(gl)
- st:訓練誤差。解釋:當訓練的速度很快的時候,我們可能希望模型繼續訓練。因爲如果訓練錯誤依然下降很快,那麼泛化損失有很大概率被修復。度量進展=平均訓練錯誤/目前最小的訓練錯誤-1(pq)
- 泛化錯誤的變化,即當泛化錯誤在連續ss個週期內增長的時候停止(up)
參考early stopping
Dropout
- 原理:
- ensemble解釋
當作一種集成化方法,假設該層神經元的數量爲n,那麼如果dropout=50% 相當於同時訓練了2^n個共享參數的網絡,每個網絡使用一個mini-batch(1 iter中)訓練。測試的時候用所有節點均值來近似所有網絡均值 - 減少神經元之間複雜的共適應關係
不一定每次dropout的時候兩個神經元都共存 - 生物學角度
- 物種爲了生存往往會傾向於適應這種環境,環境突變則會導致物種難以做出及時反應,性別的出現可以繁衍出適應新環境的變種,有效的阻止過擬合,即避免環境改變時物種可能面臨的滅絕。
2.方法
訓練的時候以p(一般取0.5使得可得到的網絡結構數最大)的概率選取神經元,測試時使用所有神經元,權重x(1-p)。(學得的w是偏大的,爲了使得訓練和測試時的輸出預期相近)
BN
爲啥做BN
- 對於神經網絡的每一層來說,它的輸入相當於上一層的輸出,那麼在不使用RMSProp的情況下,每個參數的學習率一致,爲了使得各參數的梯度變化大致相似,先歸一化
- 隨着層數的深入,如果是用sigmoid 或者tanh 作爲激活函數的話,輸出值會越來越小,導致梯度消失,先歸一化之後使得輸出靠近0附近(上述兩個激活函數梯度敏感範圍),減輕梯度消失問題
- 論文中的說法,減緩Internal covariate shift:每一層的輸入相當於上層輸出,而由於上層影響,在訓練過程中,每訓練一輪參數就會發生變化,對於一個網絡相同的輸入,但n-1層的輸出卻不一樣,這就導致對於相同輸入第n層的輸入也不一樣,這層輸入的分佈一直在變,不利於網絡學習
咋做BN
訓練:
- 轉化爲均值爲0,方差爲1的標準分佈
每個 e是一個小小偏置,防止分母趨向於0. - 加scale和偏置
爲啥加?之前都歸一化到標準分佈會使得網絡趨於線性,沒有好的表達能力,爲了保證非線性。 - 注意!BN層在bp的時候也要考慮,可以把它看成一層網絡。
- 測試:
使用訓練時累計得到的均值方差統計量來近似
具體到pytorch中
利用一個動量參數維護一個動態均值與動態方差
BN的優點
- 解決上述的 Internal convariate shift;
- 一定程度上減緩梯度消失,加速訓練
- 防止overfitting:在訓練中,BN的使用使得一個mini-batch中的所有樣本都被關聯在了一起,因此網絡不會從某一個訓練樣本中生成確定的結果。
- 減弱對初始化參數選取的要求
BN 的bp推導
由後向前根據鏈式法則來 參考知乎大佬鏈接
Normolization 對比
- BN: 在NHW上歸一化,得到C組var mean 值,batch size 小的時候效果不好,也不適合用在RNN上
- LN:在CHW上歸一化,得到N組var mean值,通常用在RNN上
- IN:Instance Norm在HW上歸一化,得到NXC組 var mean值,通常用在風格遷移上
- GN:GroupNorm將channel分組,然後再做歸一化;
- SN: SwitchableNorm, 將BN、LN、IN結合,賦予權重,由神經網絡自行學習使用哪一種