學習率
學習速率(learning rate)是指導我們該如何通過損失函數的梯度調整網絡權重的超參數。學習率越低,損失函數的變化速度就越慢。雖然使用低學習率可以確保我們不會錯過任何局部極小值,但也意味着我們將花費更長的時間來進行收斂,特別是在被困在高原區域的情況下。
new_weight = existing_weight — learning_rate * gradient
圖1採用較小的學習率,梯度下降的速度慢;
圖2採用較大的學習率,梯度下降太快越過了最小值點,導致不收斂,甚至震盪。
目的
- 瞭解pytorch中學習率調整的方法
測試環境
- windows 10
- Ananconda 3, python3.7
- pytorch 1.0
- pycharm
實驗/測試
pytorch中相關的API
關於學習率調整,pytorch提供了torch.optim.lr_scheduler
image.png
主要提供了幾個類:
torch.optim.lr_scheduler.LambdaLr
torch.optim.lr_scheduler.StepLR
torch.optim.lr_scheduler.MultiStepLR
torch.optim.lr_scheduler.ExponentialLR
torch.optim.lr_sheduler.CosineAnneaingLR
torch.optim.lr_scheduler.ReduceLROnPlateau
1. torch.optim.lr_scheduler.StepLR
.代碼
import torch
import torch.optim as optim
from torch.optim import lr_scheduler
from torchvision.models import AlexNet
import matplotlib.pyplot as plt
model = AlexNet(num_classes=2)
optimizer = optim.SGD(params=model.parameters(), lr=0.05)
# lr_scheduler.StepLR()
# Assuming optimizer uses lr = 0.05 for all groups
# lr = 0.05 if epoch < 30
# lr = 0.005 if 30 <= epoch < 60
# lr = 0.0005 if 60 <= epoch < 90
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
plt.figure()
x = list(range(100))
y = []
for epoch in range(100):
scheduler.step()
lr = scheduler.get_lr()
print(epoch, scheduler.get_lr()[0])
y.append(scheduler.get_lr()[0])
plt.plot(x, y)
0<epoch<30, lr = 0.05
30<=epoch<60, lr = 0.005
60<=epoch<90, lr = 0.0005
torch.optim.lr_scheduler.MultiStepLR
與StepLR
相比,MultiStepLR
可以設置指定的區間
- 代碼
# ---------------------------------------------------------------
# 可以指定區間
# lr_scheduler.MultiStepLR()
# Assuming optimizer uses lr = 0.05 for all groups
# lr = 0.05 if epoch < 30
# lr = 0.005 if 30 <= epoch < 80
# lr = 0.0005 if epoch >= 80
print()
plt.figure()
y.clear()
scheduler = lr_scheduler.MultiStepLR(optimizer, [30, 80], 0.1)
for epoch in range(100):
scheduler.step()
print(epoch, 'lr={:.6f}'.format(scheduler.get_lr()[0]))
y.append(scheduler.get_lr()[0])
plt.plot(x, y)
plt.show()
torch.optim.lr_scheduler.ExponentialLR
指數衰減
- 代碼
-
scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9) print() plt.figure() y.clear() for epoch in range(100): scheduler.step() print(epoch, 'lr={:.6f}'.format(scheduler.get_lr()[0])) y.append(scheduler.get_lr()[0]) plt.plot(x, y) plt.show()
原文鏈接: