譯者 | 朱先忠
審校 | 重樓
簡介
最近,我們團隊推出了一種稱為自動梯度下降(AGD:automatic gradient descent)的優(yōu)化器,它可以在不使用超參數(shù)的情況下訓練ImageNet數(shù)據(jù)集?;谶@一優(yōu)化器算法,可以消除在模型訓練時對昂貴且耗時的學習速率調(diào)整、學習速率衰減調(diào)度器等選項的需求。您可以在鏈接處找到我們發(fā)表的有關此算法的論文。
我與Jeremy Bernstein、Kevin Huang、Navid Azizan和Yisong Yue一起參與了這個項目。您可以參閱Jeremy先生的GitHub代碼庫以獲得一個干凈的Pytorch實現(xiàn),也可以參閱我的GitHub代碼庫以獲得具有更多功能的實驗版本。下面的圖1總結了我們提出的AGD算法與Adam和SGD兩種優(yōu)化算法之間的對比情況。
圖1:實線顯示訓練精度,虛線顯示測試精度
其中,左圖展示的是與我們的方法相反的具有默認超參數(shù)的Adam和SGD算法在CIFAR-10數(shù)據(jù)集上的深度全連接網(wǎng)絡(FCN)上不理想的表現(xiàn)。中間圖展示的是Adam和SGD算法的學習率網(wǎng)格搜索對比情況。我們所開發(fā)的優(yōu)化器的性能與經(jīng)過充分調(diào)參后的Adam和SGD性能差不多。右圖展示了我們所開發(fā)的AGD算法將ImageNet數(shù)據(jù)集訓練到相當高的測試精度。
動機
任何訓練過深度神經(jīng)網(wǎng)絡的人都可能有過不得不調(diào)整模型的學習速率的經(jīng)歷。這樣做的目的無處乎:(1)確保訓練的最大效率;(2)找到正確的學習率可以顯著提高整體模型的泛化應用能力。當然,這個過程也會伴隨著開發(fā)人員的巨大代價的付出。
圖2:為什么學習率對模型優(yōu)化非常重要
為了最大限度地提高收斂速度,你總會想盡可能找到最佳學習率:這是很大的一個值!而且,目標函數(shù)中的非線性項可能會把你折磨得“死去活來”。
然而,對于SGD算法來說,最佳學習率在很大程度上取決于正在訓練的體系結構。找到這個值通常需要一個代價高昂的網(wǎng)格搜索程序,需要涵蓋許多數(shù)量級內(nèi)容。此外,還需要選擇和調(diào)整其他超參數(shù),如動量和學習率衰減調(diào)度器。
為此,我們提出了一種稱為自動梯度下降(AGD)的優(yōu)化器,它不需要使用學習率就可以訓練大范圍的架構和數(shù)據(jù)集,可以在ImageNet數(shù)據(jù)集上從基礎模型一直擴展訓練到ResNet-50這樣的復雜模型。這種算法消除了對任何超參數(shù)調(diào)整的需要(因為此算法不需要分析有效學習率和學習率衰減值),從而節(jié)省了計算成本,并大大加快了模型訓練的過程。
為什么我們需要超參數(shù)呢?
究其原因,一個深度學習系統(tǒng)往往都是由許多相互關聯(lián)的組件組成:架構、數(shù)據(jù)、損失函數(shù)和梯度等。這些組件的交互方式都是圍繞著一種結構進行的;但是,到目前為止,還沒有人確切地弄清楚這個結構。所以,我們需要進行大量的調(diào)整工作(例如學習率、初始化、調(diào)度器等),以確??焖偈諗?,并避免過度擬合。
然而,盡管完美地描述這些相互作用可以消除優(yōu)化過程中的所有自由度;但是,目前這些自由度都是通過手動超參數(shù)調(diào)整來實現(xiàn)的。二階方法中目前使用Hessian矩陣來表征目標對權重擾動的敏感性,并以這種方式去除自由度——然而,這種方法可能計算密集,因此對于大型模型來說并不實用。
我們團隊通過分析這些相互作用的特征,最終找到了AGD優(yōu)化方法:
- 對于給定的數(shù)據(jù)和架構,我們根據(jù)權重的變化來約束神經(jīng)網(wǎng)絡輸出的變化。
- 我們將目標的變化(一次批運算中所有輸入的總損失)與神經(jīng)網(wǎng)絡輸出的變化聯(lián)系起來。
- 我們將這些結果結合在一種所謂的多數(shù)最小化方法(majorise-minimise approach)中。我們對目標進行多數(shù)化——也就是說,我們推導出與目標相切的目標的上界。然后我們可以將這個上限降到最低,因為我們知道這會讓我們的算法加快收斂。如圖3所示,紅色曲線表示目標函數(shù)的多數(shù)化,藍色曲線表示目標函數(shù)。
圖3:左側面板顯示了多數(shù)最小化背后的基本思想
最小化目標函數(shù)(藍色)是通過最小化一系列上限或多數(shù)(紅色)來實現(xiàn)的。右側面板顯示了權重的變化如何導致函數(shù)的變化,進而導致單個數(shù)據(jù)點的損失的變化,從而導致目標的變化。我們用?W來約束?L,并用它來構建我們的多數(shù)化。
基于Pytorch框架的AGD算法實現(xiàn)
在本節(jié)中,我們將介紹我們所開發(fā)的AGD優(yōu)化算法的所有關鍵部分基于Pytorch框架的實現(xiàn)代碼。相應的草圖推導可參考文后的附錄A。
參數(shù)操作
我們所使用的參數(shù)化與傳統(tǒng)PyTorch默認值略有不同。AGD算法可以在不借助參數(shù)化支持的情況下即可完成;不過,使用參數(shù)化可以簡化分析過程。對于完全連接的層l,我們使用正交初始化,并進行適當?shù)目s放以便使奇異值具有大?。簊qrt((l的輸入維度)/(l的輸出維度))。
import math
import torch
from torch.nn.init import orthogonal_
def singular_value(p):
sv = math.sqrt(p.shape[0] / p.shape[1])
if p.dim() == 4:
sv /= math.sqrt(p.shape[2] * p.shape[3])
return sv
class AGD:
@torch.no_grad()
def __init__(self, net, gain=1.0):
self.net = net
self.depth = len(list(net.parameters()))
self.gain = gain #用于加速訓練的可選用的超參數(shù)——在后面的任何實驗中并不使用
for p in net.parameters():
if p.dim() == 1: raise Exception("Biases are not supported.")
if p.dim() == 2: orthogonal_(p)
if p.dim() == 4:
for kx in range(p.shape[2]):
for ky in range(p.shape[3]):
orthogonal_(p[:,:,kx,ky])
p *= singular_value(p)
在此,我們之所以使用這種規(guī)范化,是因為它具有PyTorch默認參數(shù)化所沒有的優(yōu)秀特征,包括寬度穩(wěn)定性、對激活函數(shù)中的抗爆炸式增長能力以及促進特征學習。這與Greg Yang和Edward Hu二人開發(fā)的muP庫相似。
更新操作
這一步可以分成兩個單獨的部分。第一個是計算eta(η),即“自動學習率”,它實現(xiàn)對所有層的更新進行縮放。注意,Eta對梯度范數(shù)有對數(shù)依賴性——當梯度很小時,Eta近似為線性(就像標準優(yōu)化器一樣);但是,當它們非常大時,對數(shù)會自動執(zhí)行一種梯度修剪。
@torch.no_grad()
def step(self):
G = 0
for p in self.net.parameters():
G += singular_value(p) * p.grad.norm(dim=(0,1)).sum()
G /= self.depth
eta = math.log(0.5 * (1 + math.sqrt(1 + 4*G)))
for p in self.net.parameters():
factor = singular_value(p) / p.grad.norm(dim=(0,1), keepdim=True)
p -= self.gain * eta / self.depth * factor * p.grad
return log
使用eta乘以層的權重范數(shù)、乘以歸一化梯度并除以深度來更新每個層。除以深度實現(xiàn)了按深度縮放。有趣的是,分析中沒有使用梯度歸一化,因為像Adam這樣的其他優(yōu)化器也啟發(fā)式地引入了類似的想法。
實驗
進行這些實驗的目標是為了測試AGD優(yōu)化算法的能力:(1)在廣泛的體系結構和數(shù)據(jù)集上的收斂性能;以及(2)實現(xiàn)與調(diào)參后的Adam和SGD算法相當?shù)臏y試精度。
接下來的圖4顯示了從完全連接網(wǎng)絡(FCN)到ResNet-50網(wǎng)絡的四種架構在從CIFAR-10到ImageNet的數(shù)據(jù)集上的學習曲線。我們將實線所示的AGD優(yōu)化器與虛線所示的標準優(yōu)化器進行比較(SGD基于ImageNet數(shù)據(jù)集,調(diào)優(yōu)后的Adam對應于其他三種情況)。最上面一行顯示了訓練目標(損失)和自動學習率η。最下面一行顯示了訓練和測試的準確性。圖5展示了在8層FCN上進行比較的AGD、調(diào)優(yōu)后的Adam與調(diào)優(yōu)后的SGD。我們看到所有三種算法的性能非常相似,達到了幾乎相同的測試精度。
圖6顯示,AGD在較寬的深度(2至32)和寬度(64至2048)范圍內(nèi)訓練FCN。圖7顯示了AGD對批次大?。◤?2到4096)和4層FCN的依賴性。無論批量大小,它似乎都會收斂到一個很好的最優(yōu)值!
圖4——四種架構上的AGD與Adam算法比較:CIFAR-10上的16層深的FCN、CIFAR-10的ResNet-18、CIFAR-100上的VGG-16和ImageNet-1k上的ResNet-50。AGD與超參數(shù)調(diào)優(yōu)后的Adam保持合理的速度(這需要網(wǎng)格搜索幾個數(shù)量級)!
這些實線表示AGD,虛線表示Adam(除了ImageNet,我們使用SGD)。最上面一行顯示了訓練目標(即損失)和訓練期間自動學習率η的值。最下面一行顯示了訓練和測試的準確性。
圖5:具有均方誤差損失的深度為8的FCN網(wǎng)絡上的AGD、Adam與SGD算法比較
值得注意的是,Adam和SGD都調(diào)整了它們的學習率。在左邊圖形中,我們繪制了訓練和測試目標函數(shù)(即損失)。中間圖形顯示了訓練和測試的準確性。右邊圖形顯示了每個訓練周期期間權重的平均值、最小值和最大值變化。
圖6:AGD算法在很大的深度和寬度范圍內(nèi)能夠自如地收斂。不過,較小的架構往往缺乏實現(xiàn)低損耗的能力,但AGD仍可以訓練它們!
圖7:為了檢查AGD算法不僅適用于批量大小128,這里還提供了一個深度為4的FCN模型的批量大小選擇
結論
總的來說,本文實現(xiàn)了一個“架構感知”類型優(yōu)化器:自動梯度下降(AGD),它能夠在指定的批量范圍大小下訓練成功從CIFAR-10數(shù)據(jù)集上的FCN等小型模型系統(tǒng)直到大型數(shù)據(jù)集ImageNet上的ResNet-50等大型模型系統(tǒng),而無需手動進行超參數(shù)調(diào)整。
雖然使用AGD并沒有從機器學習中完全刪除所有的超參數(shù),但剩下的超參數(shù)——批量大小和體系結構——通常能夠?qū)崿F(xiàn)均衡時間/計算方面的預算代價。
盡管如此,仍然有許多工作要做。例如,我們沒有明確考慮由于批次大小而引入梯度的隨機性。此外,我們也沒有研究像權重衰減這樣的規(guī)則化。雖然我們在增加對仿射參數(shù)(在批處理范數(shù)層中)和偏差項的支持方面做了一些工作,但我們還沒有對其進行廣泛的測試,也沒有像本文引用的其他結果那樣從理論上證明它是合理的。
也許最重要的是,我們?nèi)匀恍枰M行轉(zhuǎn)換器(Transformer)所需的分析,并在NLP任務中測試AGD。在OpenWebText2上對GPT-2進行的初步實驗表明,AGD在這種情況下也非常有效!
最后,如果你想嘗試使用AGD算法的話,請查看Jeremy的GitHub代碼以獲得一個干凈的版本,或者查看我的GitHub以獲得支持偏置和仿射參數(shù)的開發(fā)版本!我們希望你會覺得這個算法有用。
附錄A
最后,我們將在這里簡要介紹一下我們論文證明過程中的一些重要步驟。這是為那些想看看此算法的主要思想是如何結合在一起的人設計的,而不需要經(jīng)過我們論文中的完整證明。
其中,方程(1)明確規(guī)定了如何將數(shù)據(jù)集S上的總體目標分解為各個數(shù)據(jù)點。L表示損失,x表示輸入,y表示目標,w表示權重。方程(2)顯示了目標線性化誤差的分解——在權重Δw發(fā)生變化的情況下,高階項對損失ΔL(w)變化的貢獻。目標的線性化誤差很重要,因為它等于在權重w-bounding下擴展的損失中的高階項的貢獻,這將告訴我們在高階項變得重要之前我們可以移動多遠,并確保我們正在采取合理大小的步長實現(xiàn)收斂。
方程(2)中的RHS上的第一項是兩個高維向量、模型的線性化誤差和損耗相對于f(x)的導數(shù)之間的內(nèi)積。由于沒有明確的理由說明為什么這兩個向量應該對齊,我們假設它們的內(nèi)積為零。
將L(W+ΔW)加到方程(2)的每一側,并注意到損失的線性化誤差恰好是布雷格曼散度(Bregman Divergence),我們可以進一步簡化符號表示:
Bregman散度是兩點之間距離的度量(在這種情況下,是神經(jīng)網(wǎng)絡兩個不同參數(shù)選擇的輸出),用嚴格凸函數(shù)定義——在這種情況中,即損失函數(shù)。
對于均方誤差損失來說,計算Bregman散度實際上是非常簡單的。并且,我們?nèi)菀椎贸鋈缦卤磉_:
其中,d是網(wǎng)絡的輸出維度。我們現(xiàn)在可以斷言存在以下縮放表達式。盡管所有這些都有點武斷;但是,采用這種形式會使問題分析變得更加簡單。
我們對網(wǎng)絡輸出的大小使用以下兩個界限。其中,方程(5)限制了網(wǎng)絡輸出的大小,并且僅將(輸入縮放)和(權重縮放)應用于完全連接的網(wǎng)絡。方程(6)限制了f(x)的最大變化與權重W的變化。(6)中的第二個不等式在大深度下最緊,但在任何深度下都成立。
現(xiàn)在,我們將方程(6)代入方程(4),并將所有項顯式展開,得到方程(7)。
在關于梯度條件的附加假設下,我們可以用方程(8)中定義的G代替方程(7)中的和,這在本文中進行了詳細討論。最后,我們得到方程(9)——這是多數(shù)化——圖3中的紅線。我們通過對η進行微分來最小化多數(shù)化,并在exp(η)中求解由此產(chǎn)生的二次方,保留正解。于是,我們有了以下新的表達形式:
至此,就完成了我們對自動梯度下降的推導介紹。如果您有任何意見、問題或其他類型的反饋,請告訴我們。
最后需要說明的是,本博客中的所有圖片都是由我們論文的作者制作的,圖2受鏈接https://www.jeremyjordan.me/nn-learning-rate/文章中的圖啟發(fā)而制作的。
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。
原文標題:Train ImageNet without Hyperparameters with Automatic Gradient Descent,作者:Chris Mingard