[課堂筆記]深度學習優化器新霸主

Posted by John on 2020-11-25
Words 1.3k and Reading Time 4 Minutes
Viewed Times

這篇文章是巨匠LIVE講堂(1124)上課的課堂筆記,主要在介紹近年的深度學習優化器技術。

  • 由於是上課時的筆記內容,所以不會是介紹文的形式

講者: 尹相志

課程網址: 11月Live講堂_深度學習優化器新霸主

(下方圖片皆引用自尹相志老師的slide)

隨機梯度下降(Stochastic Gradient Descent, SGD)

不同的優化器走到低點所需的時間都不同

Local Minima: 過去常遇到的問題,一但走到很難跳出來,如何避免?

鞍點: 除了該點外,其他的梯度都比該點還低(鞍點梯度=0),導致很優化方向很容易走偏

深度學習很重要的問題: learning rate對於loss的影響

  • 家用電腦: 10^-3往下調整

優化器的兩大類型

  • 基於學習速率調整
  • 基於動量(Mommentum)調整: 加入過去移動的方向 & 速度(慣性的概念)

Adam

使用了一階、二階動量的資訊

  • 為了不要被過去的資訊主導太多,所以使用了averaging的方式,時間越久的資訊越不重要

Adam有什麼問題?

  • 自適應: 根據過去的資訊來做統計的估算,在學習的初期由於沒有足夠的數據,variance很大,此時動量的估計很容易造成錯誤
  • 解決方式: 預熱,將前面幾個epoch設成很低的學習速率(e.g. 10^-6)
    • 因為很難收斂,也不用擔心會跑掉
    • 在這個variance很小的情況下也可以慢慢蒐集相關的資訊

  • 上圖中,上半部是沒有預熱的情況,此時不同的epoch更新的重點(分布)非常不同
    • 代表這10個epoch都在更新神經網路不同的地方
  • 使用預熱後,發現分布比較一致,每次更新會更新相同區域,能夠提供更好的優化穩定性
    • 但預熱太慢,怎麼辦?
    • RAdam

Lookahead Optimizer: k steps forward, 1 step back

同時維持兩種不同的更新策略:

  • Fast weights 快版:原本的更新策略
  • Slow weights 慢版:快版N次後,將整個路徑只取頭尾,作為慢版更新的方向

和目前既有的優化器是完全正交獨立的,所以這個機制可以加入現有的所有優化器

Ranger

解決初期方差過大的問題 RAdam + 解決後期優化路徑區率過大問題(LookAhead) = Ranger

  • 不太適用的模型: RNN-based (LSTM), (講者推測) Lookahead有兩種步調,但在RNN-based內就只有一個neuron在繞,在這種過程Fast weights的方向變動太大了,導致Slow weights更新的方向可能不是好的

Ranger還可以加什麼?

LARS

在過去,發現batch數量大到一個程度後,效果越來越差

  • 大batch的採樣梯度應該要更具代表性? 但可能蓋掉了一些小資訊
  • 當batch夠大的時候,學習速率也應該要跟著變大才能夠相襯
    • 但學習速率到底該多大多小?
    • 傳統優化器使用單一學習速率值,有可能造成某層的權重變化超過原始權重(有些需要大學習速率,有些需要較小的學習速率),導致學習震盪

上圖可以看到不同層需要的權值/學習率變化幅度不同

  • 第二欄: 權值
  • 第三欄: 更新量
  • 第四欄: 比值

甚至可以看到有很多層根本不用更新(比值很大的部分)

LARS(Layer-wise Adaptive Rate Scaling)

  • 計算每層的內部統計量來逐層調節學習率
  • 適用需要短時間訓練完模型的場景
  • 適用需要大batch的應用(Ex: SimCLR)

而LARS又跟前述優化器設計無關,所以可以再合併起來: LARS + Ranger = Ranger-LARS

  • 但如果批次數量小的時候,其實不太會用到

梯度中心化: Gradient Centralization

Gradient Centralization: 對全部梯度減掉平均值(沒有除以標準差)

對梯度做某種層級的Normalization,好處:

  1. 減掉梯度均值 -> 縮小梯度範圍,降低梯度爆炸問題
  2. Normalization -> 有助於模型泛化

已被證實有助於提升效果

目前只對FC, Conv做,所以不會影響BN layer

自動混和精度訓練: Automatic Mixed Precision Training

Pytorch 1.6 support

受到模型量化啟發,再訓練階段時在兩種精度下切換縮放,達到家夾提高模型泛化的效果

  • 再fp16 & fp32間切換
  • 計算loss的時候用fp32確保精度
  • inference的時候用fp16節省效率
  • 更新權重: 將模型縮放回原本fp32來進行更新

有些部分再轉成fp16的時候會不夠用(fp16的分布沒有涵蓋到模型權重的分布) -> 造成直接變成0

  • 這些部分需要使用fp32來確保精度
  • 可以用fp16表示的部分則繼續使用fp16
  • 自動搜索切點來切出那個點

達到節約空間 & 訓練變快 & 更robust


>