【NLP面試QA】基本策略
- 2020 年 4 月 3 日
- 筆記
防止過擬合的方法
- 根據驗證集分數設置 early_stoping
- 數據增強
- dropout
- 正則化:正則化會使得參數值更小,模型更簡單,從而避免過擬合,即奧卡姆剃刀原理
- 還有一些其他的方法,比如採用對抗訓練的方法可以增強模型的魯棒性和抗干擾能力,也能一定程度上防止過擬合
什麼是梯度消失和梯度爆炸?如何解決?
- 由於梯度反向傳播遵循鏈式求導法則,淺層網路的梯度包含深層網路梯度的累乘項,當多個梯度遠小於 1 時,使得淺層神經網路的梯度趨向於 0,難以訓練。相對的,若多個梯度遠大於 1,將使得淺層網路的梯度遠大於 1,不斷對梯度進行修正,使得網路權重不斷增大從而導致上溢,無法被訓練。
- 梯度爆炸:
- 產生原因:(1)隱藏層的層數過多;(2)權重的初始化值過大
- 解決方案:(1)梯度裁剪;(2)採用 ReLU 等激活函數
- 梯度消失:
- 產生原因:(1)隱藏層的層數過多;(2)激活函數梯度較小
- 解決方案:(1)採用殘差網路;(2)合適的權重初始化策略;(3)採用 Relu 等激活函數(梯度為1);(4)BatchNorm 等規範化方法
在深度學習中,網路層數增多會伴隨哪些問題,怎麼解決?
- 計算資源的消耗(GPU)
- 模型容易過擬合(Dropout)
- 梯度消失/梯度爆炸問題的產生(批量歸一化BN):歸一化操作能對各層的輸出做歸一化,這樣梯度在反向層層傳遞後仍能保持大小穩定,不會出現過小或過大的情況。
- 退化問題:隨著網路層數的增多,訓練集loss逐漸下降,然後趨於飽和,當你再增加網路深度的話,訓練集loss反而會增大(殘差網路ResNet)
關於模型參數
模型參數初始化的方法
- 均勻分布
- 正態分布
- 正交初始化
- 稀疏初始化
- Xavier 正態分布(Xavier 根據每一層的神經元個數來設置每層權值初始化的方差,防止梯度消失的情況出現,對於中心對稱的激活函數十分有效)
- Kaiming 正態分布(針對於 ReLU 激活函數,Xavier 還是會出現梯度消失的情況,因此提出了Kaiming 分布)
模型參數初始化為 0、過大、過小會怎樣?
- 初始化為 0,前向計算時,所有的隱層神經元的激活值都相同。這樣會導致所有神經元都是對稱的而沒有區分性,無法提取不同特徵。不僅僅在初始化為 0 的時候會出現這種情況,嚴格上來說不能將網路參數初始化為一個常數值
- 參數過小或過大:對於 sigmoid 和 tanh 這一類激活函數,初始化參數過小,意味著激活函數將丟失非線性能力。而當參數初始化過大的時候,將導致參數的激活值變得飽和,從而導致梯度變為零,導致模型難以訓練
為什麼說模型參數越小,模型越簡單
- 模型參數越小,使得某些維度上的特徵受到抑制難以表達,類似於 dropout 的作用
- 另一方面,對於 sigmoid 以及 tanh 這一類的激活函數,模型參數過小,將使得模型丟失非線性能力
正則化 Regularization
正則化方法
- 正則化是在損失函數中加入一個正則化項,正則化項表明,模型參數越大,對損失函數的懲罰越大,迫使模型參數在低損失的同時盡量變小。
- L1正則化:(J = frac{1}{m} sum_{i=1}^m L(f(x_i), y) + frac{lambda}{2m} sum_{j}|w_j|)
- L2正則化:(J = frac{1}{m} sum_{i=1}^m L(f(x_i), y) + frac{lambda}{2m} sum_{j}w_j^2)
- L1正則化會是的網路稀疏的原因:由於L正則化中絕對值的引入,使得當權重 (w_i=0) 的時候,其反向傳播梯度在(0^+)和(0^-)是非連續的,當兩側的梯度異號時,(w_i=0) 則成為了一個極小值,從而不再更新。多個權重發生這個情況的話,就使得網路變得稀疏了。
正則化如何解決過擬合的
- 正則化在損失函數中加上了權值相關的懲罰項,對解空間加了額外的約束,避免模型過度擬合數據
- 另一方面正則化會使得模型參數盡量小,參數越小,對於 sigmoid 和 tanh 等激活函數的激活值容易落在線性區間,使得模型的非線性能力減弱(模型越簡單越能避免過擬合即奧卡姆剃刀原理——「如無必要,勿增實體」,即「簡單有效原理」)
如何在程式碼中加入正則化
- 通常加正則化不會直接加在 loss 函數上,在 pytorch 的 optimization 中有一個 weight_decay 的關鍵字,可以對其進行設置,等效為 L2 正則化
關於梯度下降
Batch/Mini-Batch/SGD梯度下降
- Batch 梯度下降:訓練所有樣本,累加loss之後,再進行梯度反向傳播,更新模型參數。通常在小數據集時採用這種方法,因為越多的數據越能代表樣本總體
- SGD隨機梯度下降:
- 每次僅訓練單個樣本傳播一次梯度
- 容易受到單個樣本雜訊的影響
- 訓練速度較慢
- 最終通常在最優點附近持續震蕩,難以收斂
- mini-Batch梯度下降:訓練mini-batch個樣本,累加 loss 之後,進行梯度反向傳播,更新參數,如果 mini-batch 為1,則是隨機梯度下降演算法,如果 mini-batch 為 m(數據集大小),即是 batch 梯度下降法。當數據量足夠大,m 足夠大時,可以等價於 Batch 梯度下降
增大 batch size 的影響
- 增大記憶體利用率,並行效率提高,訓完一個 epoch 的迭代次數減少
- 各個樣本之間的梯度相互抵消,減小單個樣本雜訊的影響,下降方向更接近樣本總體的方向
- 但過大的 batch size 會使得迭代次數減少,想要達到相同的精度的時間大大增加,
- batch size 增大到一定程度梯度下降方向基本不再改變
優化演算法(Momentum/RMSProp/Adam)
-
動量梯度下降演算法(Momentum)
- 額外維護了參數梯度的一個滑動平均值,更新參數的不直接利用權重的梯度,而是利用當前的一個滑動平均值來進行更新,這樣的做法使得多次迭代的梯度在非收斂方向上的分量相互抵消,而收斂方向上的分量不斷疊加,使得收斂速度更快。
[begin{aligned} &v_{dW^{l}} = beta v_{dW^{l}} + (1-beta)dW^{l}\ &v_{db^{l}} = beta v_{db^{l}} + (1-beta)db^{l}\ &W^{l} = W^{l} – lr v_{dW^{l}}\ &b^{l} = b^{l} – lr v_{db^{l}} end{aligned}] -
RMSProp演算法(Root Mean Square Prop,均方根支):
- RMSProp演算法額外維護了參數梯度二階動量的滑動平均,二階動量記載了歷史梯度的變化幅度大小,利用二階動量資訊對梯度的更新做了一個限制作用,如果二階動量的平均資訊較大,說明該時段的梯度變化範圍較大,我們在該時段的梯度更新幅度就應該更小,減少在前往最小值路徑上的擺動情況
[begin{aligned} &s_{dW^{l}} = beta s_{dW^{l}} + (1-beta)(dW^{l})^2\ &s_{db^{l}} = beta s_{db^{l}} + (1-beta)(db^{l})^2\ &W^{l} = W^{l} – lr frac{dW}{sqrt{s_{dW}} + epsilon}\ &b^{l} = b^{l} – lr frac{dW}{sqrt{s_{db}} + epsilon} end{aligned} ] -
Adam優化演算法:結合了動量梯度下降演算法以及 RMSProp 演算法,能夠有一個超越兩者單獨的一個效果
歸一化 Normalization
深度學習中的 Internal Covariate Shift(內部協變數偏移)
深度神經網路涉及到很多層的疊加,而每一層的參數更新會導致上層的輸入數據分布發生變化,通過層層疊加,高層的輸入分布變化會非常劇烈,這就使得高層需要不斷去重新適應底層的參數更新。Google 將這一現象總結為 Internal Covariate Shift,簡稱 ICS。
ICS 會導致什麼問題
- 上層參數需要不斷適應新的輸入數據分布,降低學習速度。
- 下層輸入的變化可能趨向於變大或者變小,導致上層落入飽和區,使得學習過早停止。
- 每層的更新都會影響到其它層,因此每層的參數更新策略需要儘可能的謹慎。
Normalization 的基本思想與通用框架
- 基本思想:在將 輸入數據 送給神經元之前,先對其做平移和伸縮變換, 將 輸入數據 的分布規範化成在固定區間範圍的標準分布。
- 通用變換框架:
其中 (mu) 和 (sigma) 是平移和縮放參數,用於將數據轉化為標準正態分布。而 (b) 和 (sigma) 為再平移和再縮放參數,為可學習的,用於將數據轉化為相應的非標準正態分布。再平移和再縮放的操作是為了保證模型的表達能力不因為規範化而下降,或者說,在一定程度上尊重了神經元的學習結果。
-
Batch Normalization —— 縱向規範化
- 其規範化針對單個維度的輸出 (x_i)(單個神經元的輸出)進行的,利用網路訓練時一個 mini-batch 該神經源的輸出來計算 (x_i) 的均值和方差,因而稱為 Batch Normalization。
[mu_i = frac{1}{M}sum x_i, sigma_i = sqrt{frac{1}{M}sum (x_i-mu_i)^2+epsilon} ]其中,(M) 是 Mini-batch 的大小。BN 比較適用的場景是:每個 mini-batch 比較大,數據分布比較接近。在進行訓練之前,要做好充分的 shuffle. 否則效果會差很多。該方法在CNN中表現良好,但是在RNN中表現欠佳
-
Layer Normalization —— 橫向規範化
- 層規範化就是針對 BN 的上述不足而提出的。與 BN 不同,LN 是一種橫向的規範化,同一個規範化操作來轉換所有維度的輸入。
[mu = sum x_i, sigma = sqrt{sum (x_i-mu_i)^2+epsilon} ]參數均為標量(BN中是向量),所有輸入共享一個規範化變換。LN 針對單個訓練樣本進行,不依賴於其他數據,因此可以避免 BN 中受 mini-batch 數據分布影響的問題,可以用於 小mini-batch場景、動態網路場景和 RNN,特別是自然語言處理領域。此外,LN 不需要保存 mini-batch 的均值和方差,節省了額外的存儲空間。
為什麼 NLP 中用 Layer Normalization 效果較好而 CV 中 Batch Normalization 的效果較好
LN 和 BN 的主要區別在於 normalization的方向不同。
對於 RNN 等時序模型,具有兩個特點:
- 同一個 batch 內部的訓練實例長度不一(不同長度的句子),樣本間的數據分布差別較大
- 另外對於文本數據同一個詞很可能出現在不同的位置,即同一位置的數據分布會非常不一致
數據分布差異大是 BatchNorm 無法解決的問題,因此不適用。而對於句子方向上的歸一化更為合適的,不會引入樣本間的差異,而且句子的基本成分都是固定的,因此 LayerNorm 更為合適。