(1) 基礎(chǔ)介紹1
Adam就像蒙著眼睛走唬复,你需要方向矗积,也需要對環(huán)境的感知。
一階距就是慣性的保持敞咧,代表方向棘捣。
二階距就是環(huán)境的感知,代表坡度的大小休建。
(1) 基礎(chǔ)介紹2
先理解隨機變量的一階矩和二階矩乍恐。模型的梯度是一個隨機變量,一階矩表示梯度均值测砂,二階矩表示其方差茵烈,一階矩來控制模型更新的方向,二階矩控制步長(學(xué)習(xí)率)砌些。用moveing average來對一階矩和二階矩進行估計呜投。bias correct是為了緩解初始一階矩和二階矩初始為0帶來的moving average的影響。
一、Adam基礎(chǔ)介紹:
Adam是一種可以替代傳統(tǒng)隨機梯度下降過程的一階優(yōu)化算法仑荐,它能基于訓(xùn)練數(shù)據(jù)迭代地更新神經(jīng)網(wǎng)絡(luò)權(quán)重雕拼;
Adam使用動量和自適應(yīng)學(xué)習(xí)率來加快收斂速度;
Adam名字來源于適應(yīng)性矩估計(adaptive moment estimation)的縮寫释漆。
二、Adam優(yōu)勢:
- 直截了當?shù)貙崿F(xiàn)
- 高效的計算
- 所需內(nèi)存少
- 梯度對角縮放的不變性
- 適合解決含大規(guī)模數(shù)據(jù)和參數(shù)的優(yōu)化問題
- 適用于非穩(wěn)態(tài)(non-stationary)目標
- 適用于解決包含很高噪聲或稀疏梯度的問題
- 超參數(shù)可以很直觀地解釋篮迎,并且基本上只需極少量的調(diào)參
三男图、Adam主要做法:
做法:基于梯度的一階矩估計(First Moment Estimation,即梯度的均值)和二階矩估計(Second Moment Estimation甜橱,即梯度的未中心化的方差)進行綜合考慮岂傲,計算出更新步長乃戈。
與傳統(tǒng)隨機梯度下降保持同一個學(xué)習(xí)率不同症虑,adam方法從梯度的一階矩和二階矩的預(yù)算來計算不同參數(shù)的自適應(yīng)學(xué)習(xí)速率。
什么是一階矩估計:在adam中為即一階梯度的均值习贫。一階矩估計在數(shù)學(xué)上為是期望值苫昌,換句話說就是平均數(shù)(離散隨機變量很好理解,連續(xù)的可以類比一下)月而。舉例:xy坐標系中议纯,x取大于零的整數(shù),y1, y2, ...,yn 對應(yīng)x=1, 2,..., n的值憨攒,現(xiàn)在我要對y求期望肝集,就是所有y累加除以n瞻坝,也就是y的均值捞挥。
什么是二階據(jù)估計:在adam中為梯度中心化的方差。二階中心矩就是對隨機變量與均值(期望)的差的平方求期望斩披。為什么要用平方仍劈,因為如果序列中有負數(shù)就會產(chǎn)生較大波動绑青,而平方運算就好像對序列添加了絕對值邪乍,這樣更能體現(xiàn)偏離均值的范圍。
Adam 算法同時獲得了 AdaGrad 和 RMSProp 算法的優(yōu)點否纬。
適應(yīng)性梯度算法(AdaGrad)為每一個參數(shù)保留一個學(xué)習(xí)率以提升在稀疏梯度(即自然語言和計算機視覺問題)上的性能吕晌。
均方根傳播(RMSProp)基于權(quán)重梯度最近量級的均值為每一個參數(shù)適應(yīng)性地保留學(xué)習(xí)率。這意味著算法在非穩(wěn)態(tài)和在線問題上有很有優(yōu)秀的性能临燃。
具體來說睛驳,算法計算了梯度的指數(shù)移動均值(exponential moving average)烙心,超參數(shù) beta1 和 beta2 控制了這些移動均值的衰減率。
超參數(shù) beta1 :控制一階距估計的衰減乏沸;
超參數(shù) beta2 :控制二階距估計的衰減淫茵;
移動均值的初始值和 beta1、beta2 值接近于 1(推薦值)蹬跃,因此矩估計的偏差接近于 0匙瘪。該偏差通過首先計算帶偏差的估計而后計算偏差修正后的估計而得到提升。
四蝶缀、Adam的參數(shù)配置:
alpha:同樣也稱為學(xué)習(xí)率或步長因子丹喻,它控制了權(quán)重的更新比率(如 0.001)。較大的值(如 0.3)在學(xué)習(xí)率更新前會有更快的初始學(xué)習(xí)扼劈,而較小的值(如 1.0E-5)會令訓(xùn)練收斂到更好的性能驻啤。
beta1:一階矩估計的指數(shù)衰減率(如 0.9)菲驴。
beta2:二階矩估計的指數(shù)衰減率(如 0.999)荐吵。該超參數(shù)在稀疏梯度(如在 NLP 或計算機視覺任務(wù)中)中應(yīng)該設(shè)置為接近 1 的數(shù)。
五赊瞬、Adam算法偽代碼:
在上述偽代碼中:
(1)初始化確定參數(shù)(步長)先煎、、(矩估計得指數(shù)衰弱速率巧涧,在[0薯蝎,1)之間)和隨機目標函數(shù) 。這些都是預(yù)定義好的谤绳;
(2)初始化參數(shù)向量占锯、一階矩向量、二階矩向量和時間步缩筛;
(3)循環(huán)消略,當參數(shù)沒有收斂時,循環(huán)迭代地更新各個部分瞎抛。即時間步加1艺演、更新目標函數(shù)在該時間步上對參數(shù)所求的梯度、更新偏差的一階矩估計和二階原始矩估計桐臊,再計算偏差修正的一階矩估計和偏差修正的二階矩估計胎撤,然后再用以上計算出來的值更新模型的參數(shù)θt;
(4)當參數(shù)收斂時断凶,返回模型參數(shù)伤提。
注意算法的效率可以通過改變計算順序而得到提升,例如將偽代碼最后三行循環(huán)語句替代為以下兩個:
其實认烁,就是3個公式收縮成2個公式飘弧;
六识藤、優(yōu)化器實現(xiàn)
1、預(yù)定義優(yōu)化器對象次伶,一般在代碼_main_處:
# 預(yù)定義優(yōu)化器
optimizers = {
'adam': torch.optim.Adam, # default lr=0.001
}
# 初始化優(yōu)化器
# opt.optimizer=“Adam”
opt.optimizer = optimizers[opt.optimizer]
2痴昧、初始化優(yōu)化器
# 初始化模型參數(shù)
_params = filter(lambda p: p.requires_grad, self.model.parameters())
# 初始化優(yōu)化器對象
# self.opt.learning_rate為學(xué)習(xí)旅
# self.opt.l2reg為二階矩估計衰減率
optimizer = self.opt.optimizer(_params, lr=self.opt.learning_rate, weight_decay=self.opt.l2reg)
3、模型訓(xùn)練處
# 梯度回傳
loss.backward()
# 更新參數(shù)
optimizer.step()
七冠王、Adam的改進和優(yōu)化策略(待更新)
八赶撰、參考文獻:
深度學(xué)習(xí)最常用的學(xué)習(xí)算法:Adam優(yōu)化算法
Adam優(yōu)化器
如何理解Adam算法(Adaptive moment estimation)? - 知乎 (zhihu.com)----帶你飛