pytorch adam 源碼 關於優化函數的調整 optimizer 調參 重點


關於優化函數的調整
拆下包:https://ptorch.com/docs/1/optim

class torch.optim.Optimizer(params, defaults)
所有優化的基類.

參數:

params (iterable) —— 可迭代的Variable 或者 dict。指定應優化哪些變量。
defaults-(dict):包含優化選項的默認值的dict(一個參數組沒有指定的參數選項將會使用默認值)。
load_state_dict(state_dict)
加載optimizer狀態

參數:

state_dict (dict) —— optimizer的狀態。應該是state_dict()調用返回的對象。
state_dict()
將優化器的狀態返回為一個dict。

它包含兩個內容:

state - 持有當前optimization狀態的dict。它包含了 優化器類之間的不同。
param_groups - 一個包含了所有參數組的dict。
step(closure)
執行單個優化步驟(參數更新)。

不同的優化算子
參考:莫煩大神視頻,傳送門不給直接百度搜就好;

首先給出基本的四種更換優化算子的代碼:

SGD 就是隨機梯度下降

opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)

momentum 動量加速,在SGD函數里指定momentum的值即可

opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)

RMSprop 指定參數alpha

opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)

Adam 參數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]
實現Adam算法。
它在Adam: A Method for Stochastic Optimization中被提出。

#參數:

params (iterable) – 用於優化的可以迭代參數或定義參數組
lr (float, 可選) – 學習率(默認:1e-3)
betas (Tuple[float, float], 可選) – 用於計算梯度運行平均值及其平方的系數(默認:0.9,    0.999)
eps (float, 可選) – 增加分母的數值以提高數值穩定性(默認:1e-8)
weight_decay (float, 可選) – 權重衰減(L2范數)(默認: 0)
step(closure)  #執行單個優化步驟。

#參數:

closure (callable,可選) – 重新評估模型並返回損失的閉包。

注意:momentum是梯度下降法中一種常用的加速技術。對於一般的SGD,其表達式為,沿負梯度方向下降。而帶momentum項的SGD則寫生如下形式:

其中即momentum系數,通俗的理解上面式子就是,如果上一次的momentum(即)與這一次的負梯度方向是相同的,那這次下降的幅度就會加大,所以這樣做能夠達到加速收斂的過程。

關於學習率的調整
首先在一開始的時候我們可以給我們的神經網絡附一個“經驗性”的學習率:

lr=1e-3 #SGD

lr=1e-3 #Adam一般要求學習率比較小

接着,假設對於不同層想給予不同的學習率怎么辦呢?

參考:https://www.cnblogs.com/hellcat/p/8496727.html

# 直接對不同的網絡模塊制定不同學習率 classifiter的學習率設置為1e-2,所有的momentum=0.9

optimizer = optim.SGD([{‘params’: net.features.parameters()}, # 默認lr是1e-5
{‘params’: net.classifiter.parameters(), ‘lr’: 1e-2}], lr=1e-5,momentum=0.9)

##=======================以層為單位,為不同層指定不同的學習率

## 提取指定層對象為classifiter模塊的第0個和第3個

special_layers = t.nn.ModuleList([net.classifiter[0], net.classifiter[3]])

## 獲取指定層參數id

special_layers_params = list(map(id, special_layers.parameters()))
print(special_layers_params)

## 獲取非指定層的參數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)
當你發現你的loss在訓練過程中居然還上升了,那么一般來講,是你此時的學習率設置過大了。這時候我們需要動態調整我們的學習率:

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 基於循環的次數提供了一些方法來調節學習率.

torch.optim.lr_scheduler.ReduceLROnPlateau 基於驗證測量結果來設置不同的學習率.

參考:https://ptorch.com/docs/1/optim

其他調參的策略
1.L2-正則化防止過擬合

weight decay(權值衰減),其最終目的是防止過擬合。在機器學習或者模式識別中,會出現overfitting,而當網絡逐漸overfitting時網絡權值逐漸變大,因此,為了避免出現overfitting,會給誤差函數添加一個懲罰項,常用的懲罰項是所有權重的平方乘以一個衰減常量之和。其用來懲罰大的權值。在損失函數中,weight decay是放在正則項(regularization)前面的一個系數,正則項一般指示模型的復雜度,所以weight decay的作用是調節模型復雜度對損失函數的影響,若weight decay很大,則復雜的模型損失函數的值也就大。

這個在定義優化器的時候可以通過參數 【weight_decay,一般建議0.0005】來設置:

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的是指在神經網絡中激活函數的前面,將按照特征進行normalization,這樣做的好處有三點:

提高梯度在網絡中的流動。Normalization能夠使特征全部縮放到[0,1],這樣在反向傳播時候的梯度都是在1左右,避免了梯度消失現象。
提升學習速率。歸一化后的數據能夠快速的達到收斂。
減少模型訓練對初始化的依賴。
減少參數選擇的依賴
一些通常的解釋:https://blog.csdn.net/hjimce/article/details/50866313

3、加入dropout層:dropout一般設置為0.5

4、集成方法

最后,在訓練過程中關於loss的一些說明:

參考:https://blog.csdn.net/LIYUAN123ZHOUHUI/article/details/74453980
1 train loss 不斷下降,test loss 不斷下降,說明網絡正在學習
2 train loss 不斷下降,test loss 趨於不變,說明網絡過擬合
3 train loss 趨於不變,test loss 趨於不變,說明學習遇到瓶頸,需要減小學習率或者批處理大小
4 train loss 趨於不變,test loss 不斷下降,說明數據集100%有問題
5 train loss 不斷上升,test loss 不斷上升(最終變為NaN),可能是網絡結構設計不當,訓練超參數設置不當,程序bug等某個問題引起

作者:angnuan123
來源:CSDN
原文:https://blog.csdn.net/angnuan123/article/details/81604727
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

相關文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM