常見問題

如何偵測並解決最佳化失敗的問題?

摘要:如果模型遇到最佳化方面的問題,請務必先修正,再嘗試其他項目。診斷及修正訓練失敗情形是積極研究的領域。

比較 Standard WideResNet 和 Stride 1x1 WideResNet 的圖表。Y 軸是「測試錯誤率」,X 軸是「基礎學習率」。
            隨著基礎學習率增加,標準 WideResNet 的 TestErrorRate 會逐漸下滑。相較之下,Stride WideResNet 的基準學習率上升,會明顯出現波動。
圖 4. 在 WideResnet 中一個殘差區塊 (2x2 -> 1x1) 中的步長會導致訓練不穩定。

 

請留意圖 4 相關事項:

  • 改變跨度並不會在學習率偏低時降低成效。
  • 由於不穩定,高學習率不會再有效訓練。
  • 採用 1000 步的學習率暖機步驟可解決這個不穩定性問題,讓穩定訓練能以最高學習率 0.1 進行穩定訓練。

找出不穩定的工作負載

如果學習率過大,任何工作負載都會變得不穩定。只有在強迫您使用太小的學習率時,這個問題才是不穩定的影響。至少兩種類型的訓練不穩定:

  • 初始化或訓練前的不穩定。
  • 在訓練期間突然不穩定。

您可以執行下列操作,透過系統化的方法找出工作負載中的穩定性問題:

  • 執行學習率掃除作業,找出最佳學習率象限*。
  • 將訓練率下降曲線繪製在方位上方*。
  • 如果學習率 > lr* 顯示損失不穩定 (在訓練期間不會下降),則修正不穩定性通常會改善訓練。

在訓練期間,請記錄完整損失梯度的 L2 規範,因為離群值會導致訓練過程中的不穩定。這可告訴系統裁剪漸層或權重更新的積極程度。

注意:某些模型的穩定性非常早,其次則是復原為緩慢但是穩定的訓練。常見的評估時間表如果因為評估頻率不夠高,就可能錯過這些問題!

如要檢查這一點,您可以使用 lr = 2 * current best 訓練僅執行 500 步的縮寫,但評估每個步驟。

兩張圖表:兩個圖表的 x 軸是「全球步」,兩個圖表的 y 軸則是「訓練損失」。兩張圖表都比較 2、2 的轉換率和 轉換 Stride (1,1)。第一個圖表顯示每 1,000 步的評估作業。在第一張圖表中,兩個「轉換 Strides」指標都會顯示逐漸穩定下降的高度,以及較多的「全球步數」。第二張圖表顯示前 25 個步驟中頻繁的評估作業。在第二圖表中,「Conv Stride of (2,2)」畫面在前幾個全球步數中顯示了狂野的波動,之後全球步數將逐漸降低 20 步。轉換率截圖 (1,1) 顯示即便是第一個全球步數,但卻持續低的列車失誤。
圖 5. 較常在訓練開始時的評估作業值。如果您認為模型因早期訓練不穩定而發生問題,這個做法就相當實用。

 

可能的常見不穩定模式可能修正

對於常見的不穩定模式,請考慮以下可能的修正方式:

  • 套用學習率暖身。這適用於早期訓練不穩定。
  • 套用漸層裁剪。這對於早期和訓練中不穩定的情況都很方便,並且可修正暖機無法進行的一些錯誤初始化。
  • 試試新的最佳化器。有時 Adam 能處理 Momentum 無法執行的不穩定問題。我們目前正積極研究這方面的研究。
  • 確認您針對模型架構採用最佳做法和最佳初始化設定 (依循範例進行)。如果模型尚未包含殘差連線和正規化設定,請新增這些連線。
  • 正規化為殘差之前的最後一個作業。例如:x + Norm(f(x))。請注意,Norm(x + f(x)) 可能會造成問題。
  • 請嘗試將殘差分支版本初始化為 0。(請參閱「ReZero is All You 需要:大禁區快速整合」)。
  • 降低學習率。這是最後手段。

學習率暖身

兩張圖表展示同一項實驗。在第一個圖表中,X 軸是「全球步數」,Y 軸是「訓練損失」。隨著訓練率暖身的數字偏低,列車損失極為不穩定。隨著學習率的暖機數字較高,火車的損失也更加穩定。
圖 6.暖機期間不穩定的範例 (請注意水平軸對數尺度)。在本例中,暖機需要 4 萬個步驟才能順利完成訓練。

何時該套用學習率準備值

驗證集 (y 軸) 與基礎學習率 (X 軸) 的交叉熵損失圖表。圖表中顯示了六個可行的測試,這些試驗的「Base」級別學習率相對較低。基本學習率上升後,驗證損失就會下降,接著達到低點後,才會開始增加。圖表中也顯示了四個無法進行的試驗,每個試驗的「Base」級別學習率都相當高。
圖 7a.範例:模型的超參數軸圖,呈現訓練不穩定。最優異的學習率就位於可行的邊緣。「不可行」試驗會產生 NaN 或非典型的損失值。

 

訓練集 (y 軸) 與全球步數 (X 軸) 的交叉熵損失圖表。在最初的全球步驟中,損失下降的速度非常快。接著,損失的步數會大幅增加大約 10,000 步。接著,流失率會逐漸下降約 15,000 步。
圖 7b.以學習率訓練而成的模型損失,但發現不穩定。

 

圖 7a 顯示超參數軸圖,表示模型遇到最佳化不穩定情形,因為最佳學習率位於不穩定性邊緣。

圖 7b 顯示了確認模型訓練損失的方式,確認模型訓練率比這個峰值多 5 倍或 10 倍。如果該圖表在穩定下降後突然增加 (例如上圖的步驟 1 萬左右),表示模型的最佳化不穩定。

如何套用學習率暖身

步驟 76619 (y 軸) 與基礎學習率 (X 軸) 的驗證損失圖表。此圖表會比較 WMT14 EN-De 上的 LayerNorm Transformer 上四種不同情況的結果。學習率暖身可降低驗證損失,但學習率較低。
圖 8.學習率暖機對解決訓練不穩定等重大影響。

 

使用前述程序,允許 unstable_base_learning_rate 成為模型不穩定的學習率。

暖機作業會預先安排學習率時間表,將學習率從 0 提高到某個穩定程度base_learning_rate,且至少有一度大於 unstable_base_learning_rate 一度。預設值為嘗試使用 10 倍 unstable_base_learning_ratebase_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_ratewarmup_stepspost_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 萬個以上的步驟。

漸層裁剪

總收視點數 l2 溫度 (Y 軸) 與全球步數 (X 軸) 的圖表。在全球初期的全球步驟中,「一般」梯度規範訓練非常不穩定。片段門檻太過積極,導致學習率降低且訓練速度變慢。更高的裁剪門檻 (高於一般漸層規範) 可穩定早期訓練。
圖 9.漸層裁剪修正初期訓練不穩定。

 

出現較大或離群漸層問題時,梯度裁剪是最實用的用途。漸層剪輯可以修正下列其中一項問題:

  • 早期訓練不穩定性 (提早呈現大型梯度規範)
  • 訓練中不穩定 (訓練過程中的梯度突然提高)。

有時候,暖機時間越長,就越能修正裁剪效果的不穩定問題;詳情請參閱學習率暖機相關說明。

🤖? 暖身期間如何剪輯?

理想的剪輯片段門檻只是高於「一般」漸層常態。

以下是漸層裁剪的範例:

  • 如果漸層 $\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}\]