如何偵測並解決最佳化失敗的問題?
摘要:如果模型遇到最佳化方面的問題,請務必先修正,再嘗試其他項目。診斷及修正訓練失敗情形是積極研究的領域。
請留意圖 4 相關事項:
- 改變跨度並不會在學習率偏低時降低成效。
- 由於不穩定,高學習率不會再有效訓練。
- 採用 1000 步的學習率暖機步驟可解決這個不穩定性問題,讓穩定訓練能以最高學習率 0.1 進行穩定訓練。
找出不穩定的工作負載
如果學習率過大,任何工作負載都會變得不穩定。只有在強迫您使用太小的學習率時,這個問題才是不穩定的影響。至少兩種類型的訓練不穩定:
- 初始化或訓練前的不穩定。
- 在訓練期間突然不穩定。
您可以執行下列操作,透過系統化的方法找出工作負載中的穩定性問題:
- 執行學習率掃除作業,找出最佳學習率象限*。
- 將訓練率下降曲線繪製在方位上方*。
- 如果學習率 > lr* 顯示損失不穩定 (在訓練期間不會下降),則修正不穩定性通常會改善訓練。
在訓練期間,請記錄完整損失梯度的 L2 規範,因為離群值會導致訓練過程中的不穩定。這可告訴系統裁剪漸層或權重更新的積極程度。
注意:某些模型的穩定性非常早,其次則是復原為緩慢但是穩定的訓練。常見的評估時間表如果因為評估頻率不夠高,就可能錯過這些問題!
如要檢查這一點,您可以使用 lr = 2 * current best
訓練僅執行 500 步的縮寫,但評估每個步驟。
可能的常見不穩定模式可能修正
對於常見的不穩定模式,請考慮以下可能的修正方式:
- 套用學習率暖身。這適用於早期訓練不穩定。
- 套用漸層裁剪。這對於早期和訓練中不穩定的情況都很方便,並且可修正暖機無法進行的一些錯誤初始化。
- 試試新的最佳化器。有時 Adam 能處理 Momentum 無法執行的不穩定問題。我們目前正積極研究這方面的研究。
- 確認您針對模型架構採用最佳做法和最佳初始化設定 (依循範例進行)。如果模型尚未包含殘差連線和正規化設定,請新增這些連線。
- 正規化為殘差之前的最後一個作業。例如:
x + Norm(f(x))
。請注意,Norm(x + f(x))
可能會造成問題。 - 請嘗試將殘差分支版本初始化為 0。(請參閱「ReZero is All You 需要:大禁區快速整合」)。
- 降低學習率。這是最後手段。
學習率暖身
何時該套用學習率準備值
圖 7a 顯示超參數軸圖,表示模型遇到最佳化不穩定情形,因為最佳學習率位於不穩定性邊緣。
圖 7b 顯示了確認模型訓練損失的方式,確認模型訓練率比這個峰值多 5 倍或 10 倍。如果該圖表在穩定下降後突然增加 (例如上圖的步驟 1 萬左右),表示模型的最佳化不穩定。
如何套用學習率暖身
使用前述程序,允許 unstable_base_learning_rate
成為模型不穩定的學習率。
暖機作業會預先安排學習率時間表,將學習率從 0 提高到某個穩定程度base_learning_rate
,且至少有一度大於 unstable_base_learning_rate
一度。預設值為嘗試使用 10 倍 unstable_base_learning_rate
的 base_learning_rate
。雖然請注意,您可以針對 100 倍 unstable_base_learning_rate
之類的項目再次執行整個程序。具體時間表如下:
- 增加到 base_learning_rate 的值,從 0 增加到 base_learning_rate 。
- 以固定速率訓練 post_warmup_steps。
您的目標是找出最短的 warmup_steps
,以便您存取達到 unstable_base_learning_rate
的尖峰學習率。因此,您必須調整每個 base_learning_rate
的 warmup_steps
和 post_warmup_steps
。通常可以將 post_warmup_steps
設為 2*warmup_steps
。
暖身可以獨立於現有的衰減時間表而調整。warmup_steps
應以不同的數量順序進行清除。舉例來說,研究範例可以嘗試使用 [10, 1000, 10,000, 100,000]
。最大可行點不應超過 max_train_steps
的 10%。
建立在 base_learning_rate
上不會進行擴增訓練的 warmup_steps
後,應將其套用至基準模型。基本上,就是將這個排程附加至現有排程,然後使用上述說明的最佳查核點選項,將這項實驗與基準進行比較。舉例來說,假設我們原本有 10,000 個 max_train_steps
,接著使用 warmup_steps
達成 1000 步,新的訓練程序總共應該執行 11,000 步。
如果很長的 warmup_steps
需要穩定的訓練 (超過 max_train_steps
的 5%),您可能需要增加 max_train_steps
來因應這種情況。
整個工作負載的範圍並沒有真正的「典型」值。部分模型只需要 100 個步驟,而其他模型 (尤其是轉換器) 則可能需要 4 萬個以上的步驟。
漸層裁剪
出現較大或離群漸層問題時,梯度裁剪是最實用的用途。漸層剪輯可以修正下列其中一項問題:
- 早期訓練不穩定性 (提早呈現大型梯度規範)
- 訓練中不穩定 (訓練過程中的梯度突然提高)。
有時候,暖機時間越長,就越能修正裁剪效果的不穩定問題;詳情請參閱學習率暖機相關說明。
🤖? 暖身期間如何剪輯?
理想的剪輯片段門檻只是高於「一般」漸層常態。
以下是漸層裁剪的範例:
- 如果漸層 $\left | g\right |$ 大於漸層裁剪門檻 $\lambda$,則執行 ${g}'= \lambda\times \frac{g}{\left | g\right |}$ 其中 ${g}'$ 是新的漸層。
在訓練期間記錄未裁剪的漸層規範。根據預設,會產生下列結果:
- 漸層規範與步數的圖
- 匯總所有步驟的漸層規範直方圖
根據第 90 個百分位數的漸層規範選擇漸層裁剪門檻。門檻會因工作負載而異,但 90% 是很好的起點。如果 90% 的緣故,您可以調整這個門檻。
🤖? 該怎麼調整策略?
如果您嘗試了梯度裁剪,且不穩定的問題仍舊存在,您可以較難嘗試;也就是說,可以縮小門檻。
極度激烈的梯度裁剪 (也就是超過 50% 的更新會遭到裁剪),這是降低學習率的奇怪方法。如果發現自己使用極度積極的剪輯,那麼應該直接調降學習率。
為什麼要呼叫學習率和其他最佳化參數超參數?這些屬性並非先前發布內容的參數。
「超參數」一詞在貝葉斯機器學習中具有精確意義,因此所謂的「超參數」是指機器學習率,以及大多數的可微調的深度學習參數,可說是濫用術語。針對學習率、架構參數,以及深度學習的所有其他可微調項目,我們偏好使用「中繼資料參數」一詞。這是因為中繼資料參數可避免濫用「超參數」一詞而造成混淆。在討論貝氏最佳化方法時,這種混淆情況會因為機率回應表面模型都有自己的真正超參數。
不過,雖然可能會令人混淆,但在深度學習社群中,「超參數」一詞變得極為常見。因此,本文件的適用對象為一般大眾,其中涵蓋許多不太可能瞭解這項技術性的人。因此,我們選擇在內容中貢獻一己之力,希望能避免彼此混淆。也就是說,發布研究論文時可能會做出不同的選擇,我們鼓勵在大多數情況下改用「中繼參數」。
為什麼不應調整批次大小,直接改善驗證集的效能?
在不變更訓練管道的其他詳細資料的情況下變更批次大小,通常會影響驗證集的效能。但是,如果兩個批次大小的訓練管道都分別最佳化,則驗證集裡的效能差異通常會降低。
其中,超參數與批次大小最密切互動,因此最重要的是針對每個批次大小個別進行調整,分別是最佳化器超參數 (例如學習率、動量) 和正規化超參數。由於樣本變異數,較小的批次大小會讓訓練演算法產生雜訊。這種雜訊可能會有規律的效果。因此,較大的批次大小較容易過度配適,而且可能需要更強大的正規化和/或其他正規化技巧。此外,變更批次大小時,您可能需要調整訓練步驟數量。
將這些影響納入考量後,目前沒有證據顯示批次大小會影響最大可達成的驗證效能。詳情請參閱 Shallue 等人 2018 年。
所有熱門最佳化演算法的更新規則為何?
本節提供數種常用最佳化演算法的更新規則。
隨機梯度下降法 (SGD)
\[\theta_{t+1} = \theta_{t} - \eta_t \nabla \mathcal{l}(\theta_t)\]
其中 $\eta_t$ 是步驟 $t$ 的學習率。
累積熱度
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t v_{t+1}\]
其中 $\eta_t$ 是步驟 $t$ 的學習率,$\gamma$ 則是動量係數。
內斯特羅夫
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t ( \gamma v_{t+1} + \nabla \mathcal{l}(\theta_{t}) )\]
其中 $\eta_t$ 是步驟 $t$ 的學習率,$\gamma$ 則是動量係數。
RMSProp
\[v_0 = 1 \text{, } m_0 = 0\]
\[v_{t+1} = \rho v_{t} + (1 - \rho) \nabla \mathcal{l}(\theta_t)^2\]
\[m_{t+1} = \gamma m_{t} + \frac{\eta_t}{\sqrt{v_{t+1} + \epsilon}}\nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - m_{t+1}\]
廣告資料中心
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l}(\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]
紐西蘭
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l} (\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{\beta_1 m_{t+1} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]