PyTorch框架学习十三——优化器
PyTorch框架學習十三——優化器
- 一、優化器
- 二、Optimizer類
- 1.基本屬性
- 2.基本方法
- 三、學習率與動量
- 1.學習率learning rate
- 2.動量、沖量Momentum
- 四、十種常見的優化器(簡單羅列)
上次筆記簡單介紹了一下損失函數的概念以及18種常用的損失函數,這次筆記介紹優化器的相關知識以及PyTorch中的使用。
一、優化器
PyTorch中的優化器:管理并更新模型中可學習參數的值,使得模型輸出更接近真實標簽。
導數:函數在指定坐標軸上的變化率。
方向導數:指定方向上的變化率。
梯度:一個向量,方向為方向導數取得最大值的方向。
二、Optimizer類
1.基本屬性
2.基本方法
(1)zero_grad():清空所管理的參數的梯度。因為PyTorch中張量梯度不會自動清零。
weight = torch.randn((2, 2), requires_grad=True) weight.grad = torch.ones((2, 2))optimizer = optim.SGD([weight], lr=0.1)print("weight before step:{}".format(weight.data)) optimizer.step() # 修改lr=1 0.1觀察結果 print("weight after step:{}".format(weight.data))print("weight in optimizer:{}\nweight in weight:{}\n".format(id(optimizer.param_groups[0]['params'][0]), id(weight)))print("weight.grad is {}\n".format(weight.grad)) optimizer.zero_grad() print("after optimizer.zero_grad(), weight.grad is\n{}".format(weight.grad))結果如下:
weight before step:tensor([[0.6614, 0.2669],[0.0617, 0.6213]]) weight after step:tensor([[ 0.5614, 0.1669],[-0.0383, 0.5213]]) weight in optimizer:1314236528344 weight in weight:1314236528344weight.grad is tensor([[1., 1.],[1., 1.]])after optimizer.zero_grad(), weight.grad is tensor([[0., 0.],[0., 0.]])(2) step():執行一步優化更新。
weight = torch.randn((2, 2), requires_grad=True) weight.grad = torch.ones((2, 2))optimizer = optim.SGD([weight], lr=0.1)print("weight before step:{}".format(weight.data)) optimizer.step() # 修改lr=1 0.1觀察結果 print("weight after step:{}".format(weight.data))結果如下:
weight before step:tensor([[0.6614, 0.2669],[0.0617, 0.6213]]) weight after step:tensor([[ 0.5614, 0.1669],[-0.0383, 0.5213]])(3) add_param_group():添加參數組。
weight = torch.randn((2, 2), requires_grad=True) weight.grad = torch.ones((2, 2))optimizer = optim.SGD([weight], lr=0.1)print("optimizer.param_groups is\n{}".format(optimizer.param_groups))w2 = torch.randn((3, 3), requires_grad=True)optimizer.add_param_group({"params": w2, 'lr': 0.0001})print("optimizer.param_groups is\n{}".format(optimizer.param_groups))結果如下:
optimizer.param_groups is [{'params': [tensor([[0.6614, 0.2669],[0.0617, 0.6213]], requires_grad=True)], 'lr': 0.1, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}] optimizer.param_groups is [{'params': [tensor([[0.6614, 0.2669],[0.0617, 0.6213]], requires_grad=True)], 'lr': 0.1, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}, {'params': [tensor([[-0.4519, -0.1661, -1.5228],[ 0.3817, -1.0276, -0.5631],[-0.8923, -0.0583, -0.1955]], requires_grad=True)], 'lr': 0.0001, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}](4)state_dict():獲取優化器當前狀態信息字典。
weight = torch.randn((2, 2), requires_grad=True) weight.grad = torch.ones((2, 2))optimizer = optim.SGD([weight], lr=0.1, momentum=0.9) opt_state_dict = optimizer.state_dict()print("state_dict before step:\n", opt_state_dict)for i in range(10):optimizer.step()print("state_dict after step:\n", optimizer.state_dict())torch.save(optimizer.state_dict(), os.path.join(BASE_DIR, "optimizer_state_dict.pkl"))結果如下:
state_dict before step:{'state': {}, 'param_groups': [{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [2872948098296]}]} state_dict after step:{'state': {2872948098296: {'momentum_buffer': tensor([[6.5132, 6.5132],[6.5132, 6.5132]])}}, 'param_groups': [{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [2872948098296]}]}獲取到了優化器當前狀態的信息字典,其中那個2872948098296是存放權重的地址,并將這些參數信息保存為一個pkl文件:
(5)load_state_dict():加載狀態信息字典。
optimizer = optim.SGD([weight], lr=0.1, momentum=0.9) state_dict = torch.load(os.path.join(BASE_DIR, "optimizer_state_dict.pkl"))print("state_dict before load state:\n", optimizer.state_dict()) optimizer.load_state_dict(state_dict) print("state_dict after load state:\n", optimizer.state_dict())從剛剛保存參數的pkl文件中讀取參數賦給一個新的空的優化器,結果為:
state_dict before load state:{'state': {}, 'param_groups': [{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [1838346925624]}]} state_dict after load state:{'state': {1838346925624: {'momentum_buffer': tensor([[6.5132, 6.5132],[6.5132, 6.5132]])}}, 'param_groups': [{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [1838346925624]}]}注:state_dict()與load_state_dict()一般經常用于模型訓練中的保存和讀取模型參數,防止斷電等突發情況導致模型訓練強行中斷而前功盡棄。
三、學習率與動量
1.學習率learning rate
梯度下降:
其中LR就是學習率,作用是控制更新的步伐,如果太大可能導致模型無法收斂或者是梯度爆炸,如果太小可能使得訓練時間過長,需要調節。
2.動量、沖量Momentum
結合當前梯度與上一次更新信息,用于當前更新。
PyTorch中梯度下降的更新公式為:
其中:
- Wi:第i次更新的參數。
- lr:學習率。
- Vi:更新量。
- m:momentum系數。
- g(Wi):Wi的梯度。
舉個例子:
100這個時刻的更新量不僅與當前梯度有關,還與之前的梯度有關,只是越以前的對當前時刻的影響就越小。
momentum的作用主要是可以加速收斂。
四、十種常見的優化器(簡單羅列)
目前對優化器的了解還不多,以后會繼續跟進,這里就簡單羅列一下:
總結
以上是生活随笔為你收集整理的PyTorch框架学习十三——优化器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python学习笔记(列表和元组的简单实
- 下一篇: (Matlab函数详解)机器学习中的4种