pytorch adam 源码 关于优化函数的调整 optimizer 调参 重点
關(guān)于優(yōu)化函數(shù)的調(diào)整
拆下包:https://ptorch.com/docs/1/optim
class torch.optim.Optimizer(params, defaults)
所有優(yōu)化的基類(lèi).
參數(shù):
params (iterable) —— 可迭代的Variable 或者 dict。指定應(yīng)優(yōu)化哪些變量。
defaults-(dict):包含優(yōu)化選項(xiàng)的默認(rèn)值的dict(一個(gè)參數(shù)組沒(méi)有指定的參數(shù)選項(xiàng)將會(huì)使用默認(rèn)值)。
load_state_dict(state_dict)
加載optimizer狀態(tài)
參數(shù):
state_dict (dict) —— optimizer的狀態(tài)。應(yīng)該是state_dict()調(diào)用返回的對(duì)象。
state_dict()
將優(yōu)化器的狀態(tài)返回為一個(gè)dict。
它包含兩個(gè)內(nèi)容:
state - 持有當(dāng)前optimization狀態(tài)的dict。它包含了 優(yōu)化器類(lèi)之間的不同。
param_groups - 一個(gè)包含了所有參數(shù)組的dict。
step(closure)
執(zhí)行單個(gè)優(yōu)化步驟(參數(shù)更新)。
不同的優(yōu)化算子
參考:莫煩大神視頻,傳送門(mén)不給直接百度搜就好;
首先給出基本的四種更換優(yōu)化算子的代碼:
SGD 就是隨機(jī)梯度下降
opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)
momentum 動(dòng)量加速,在SGD函數(shù)里指定momentum的值即可
opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)
RMSprop 指定參數(shù)alpha
opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)
Adam 參數(shù)betas=(0.9, 0.99)
opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))
#再看下官方文檔
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)[source]
實(shí)現(xiàn)Adam算法。
它在A(yíng)dam: A Method for Stochastic Optimization中被提出。
#參數(shù):
params (iterable) – 用于優(yōu)化的可以迭代參數(shù)或定義參數(shù)組
lr (float, 可選) – 學(xué)習(xí)率(默認(rèn):1e-3)
betas (Tuple[float, float], 可選) – 用于計(jì)算梯度運(yùn)行平均值及其平方的系數(shù)(默認(rèn):0.9, 0.999)
eps (float, 可選) – 增加分母的數(shù)值以提高數(shù)值穩(wěn)定性(默認(rèn):1e-8)
weight_decay (float, 可選) – 權(quán)重衰減(L2范數(shù))(默認(rèn): 0)
step(closure) #執(zhí)行單個(gè)優(yōu)化步驟。
#參數(shù):
closure (callable,可選) – 重新評(píng)估模型并返回?fù)p失的閉包。
注意:momentum是梯度下降法中一種常用的加速技術(shù)。對(duì)于一般的SGD,其表達(dá)式為,沿負(fù)梯度方向下降。而帶momentum項(xiàng)的SGD則寫(xiě)生如下形式:
其中即momentum系數(shù),通俗的理解上面式子就是,如果上一次的momentum(即)與這一次的負(fù)梯度方向是相同的,那這次下降的幅度就會(huì)加大,所以這樣做能夠達(dá)到加速收斂的過(guò)程。
關(guān)于學(xué)習(xí)率的調(diào)整
首先在一開(kāi)始的時(shí)候我們可以給我們的神經(jīng)網(wǎng)絡(luò)附一個(gè)“經(jīng)驗(yàn)性”的學(xué)習(xí)率:
lr=1e-3 #SGD
lr=1e-3 #Adam一般要求學(xué)習(xí)率比較小
接著,假設(shè)對(duì)于不同層想給予不同的學(xué)習(xí)率怎么辦呢?
參考:https://www.cnblogs.com/hellcat/p/8496727.html
# 直接對(duì)不同的網(wǎng)絡(luò)模塊制定不同學(xué)習(xí)率 classifiter的學(xué)習(xí)率設(shè)置為1e-2,所有的momentum=0.9
optimizer = optim.SGD([{‘params’: net.features.parameters()}, # 默認(rèn)lr是1e-5
{‘params’: net.classifiter.parameters(), ‘lr’: 1e-2}], lr=1e-5,momentum=0.9)
##=======================以層為單位,為不同層指定不同的學(xué)習(xí)率
## 提取指定層對(duì)象為classifiter模塊的第0個(gè)和第3個(gè)
special_layers = t.nn.ModuleList([net.classifiter[0], net.classifiter[3]])
## 獲取指定層參數(shù)id
special_layers_params = list(map(id, special_layers.parameters()))
print(special_layers_params)
## 獲取非指定層的參數(shù)id
base_params = filter(lambda p: id§ not in special_layers_params, net.parameters())
optimizer = t.optim.SGD([{‘params’: base_params},
{‘params’: special_layers.parameters(), ‘lr’: 0.01}], lr=0.001)
當(dāng)你發(fā)現(xiàn)你的loss在訓(xùn)練過(guò)程中居然還上升了,那么一般來(lái)講,是你此時(shí)的學(xué)習(xí)率設(shè)置過(guò)大了。這時(shí)候我們需要?jiǎng)討B(tài)調(diào)整我們的學(xué)習(xí)率:
def adjust_learning_rate(optimizer, epoch, t=10):
“”“Sets the learning rate to the initial LR decayed by 10 every t epochs,default=10"”"
new_lr = lr * (0.1 ** (epoch // t))
for param_group in optimizer.param_groups:
param_group[‘lr’] = new_lr
官方文檔中還給出用
torch.optim.lr_scheduler 基于循環(huán)的次數(shù)提供了一些方法來(lái)調(diào)節(jié)學(xué)習(xí)率.
torch.optim.lr_scheduler.ReduceLROnPlateau 基于驗(yàn)證測(cè)量結(jié)果來(lái)設(shè)置不同的學(xué)習(xí)率.
參考:https://ptorch.com/docs/1/optim
其他調(diào)參的策略
1.L2-正則化防止過(guò)擬合
weight decay(權(quán)值衰減),其最終目的是防止過(guò)擬合。在機(jī)器學(xué)習(xí)或者模式識(shí)別中,會(huì)出現(xiàn)overfitting,而當(dāng)網(wǎng)絡(luò)逐漸overfitting時(shí)網(wǎng)絡(luò)權(quán)值逐漸變大,因此,為了避免出現(xiàn)overfitting,會(huì)給誤差函數(shù)添加一個(gè)懲罰項(xiàng),常用的懲罰項(xiàng)是所有權(quán)重的平方乘以一個(gè)衰減常量之和。其用來(lái)懲罰大的權(quán)值。在損失函數(shù)中,weight decay是放在正則項(xiàng)(regularization)前面的一個(gè)系數(shù),正則項(xiàng)一般指示模型的復(fù)雜度,所以weight decay的作用是調(diào)節(jié)模型復(fù)雜度對(duì)損失函數(shù)的影響,若weight decay很大,則復(fù)雜的模型損失函數(shù)的值也就大。
這個(gè)在定義優(yōu)化器的時(shí)候可以通過(guò)參數(shù) 【weight_decay,一般建議0.0005】來(lái)設(shè)置:
opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99), eps=1e-06, weight_decay=0.0005)
2、batch normalization。batch normalization的是指在神經(jīng)網(wǎng)絡(luò)中激活函數(shù)的前面,將按照特征進(jìn)行normalization,這樣做的好處有三點(diǎn):
提高梯度在網(wǎng)絡(luò)中的流動(dòng)。Normalization能夠使特征全部縮放到[0,1],這樣在反向傳播時(shí)候的梯度都是在1左右,避免了梯度消失現(xiàn)象。
提升學(xué)習(xí)速率。歸一化后的數(shù)據(jù)能夠快速的達(dá)到收斂。
減少模型訓(xùn)練對(duì)初始化的依賴(lài)。
減少參數(shù)選擇的依賴(lài)
一些通常的解釋?zhuān)篽ttps://blog.csdn.net/hjimce/article/details/50866313
3、加入dropout層:dropout一般設(shè)置為0.5
4、集成方法
最后,在訓(xùn)練過(guò)程中關(guān)于loss的一些說(shuō)明:
參考:https://blog.csdn.net/LIYUAN123ZHOUHUI/article/details/74453980
1 train loss 不斷下降,test loss 不斷下降,說(shuō)明網(wǎng)絡(luò)正在學(xué)習(xí)
2 train loss 不斷下降,test loss 趨于不變,說(shuō)明網(wǎng)絡(luò)過(guò)擬合
3 train loss 趨于不變,test loss 趨于不變,說(shuō)明學(xué)習(xí)遇到瓶頸,需要減小學(xué)習(xí)率或者批處理大小
4 train loss 趨于不變,test loss 不斷下降,說(shuō)明數(shù)據(jù)集100%有問(wèn)題
5 train loss 不斷上升,test loss 不斷上升(最終變?yōu)镹aN),可能是網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)不當(dāng),訓(xùn)練超參數(shù)設(shè)置不當(dāng),程序bug等某個(gè)問(wèn)題引起
作者:angnuan123
來(lái)源:CSDN
原文:https://blog.csdn.net/angnuan123/article/details/81604727
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
相關(guān)文章
總結(jié)
以上是生活随笔為你收集整理的pytorch adam 源码 关于优化函数的调整 optimizer 调参 重点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。