這篇文章是巨匠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,好處:
- 減掉梯度均值 -> 縮小梯度範圍,降低梯度爆炸問題
- 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