Memahami Cara Kerja Learning Rate Scheduler pada Pytorch
Metode lr_scheduler digunakan untuk menyesuaikan kecepatan pembelajaran untuk pengoptimal. sementara model pelatihan bisa kita ubah sesuai dengan kecepatan pembelajaran, misalnya pada tahap awal pelatihan, kita memerlukan kecepatan pembelajaran yang sedikit lebih tinggi daripada kondisi selanjutnya. jika pembelajaran kita terlalu sedikit maka model akan membutuhkan banyak waktu untuk dilatih, dan jika kecepatan pembelajaran tinggi pada tahap pelatihan selanjutnya maka model tidak akan mencapai minimum global. jadi itulah mengapa penyesuaian kecepatan pemelajaran sangat penting untuk mendapatkan akurasi yang lebih tinggi.
Jenis Learning Rate
- LambdaLR: pada dasarnya meningkatkan kecepatan pembelajaran per batch dengan fungsi yang diberikan, Di LambdaLR setelah setiap batch, kecepatan pembelajaran diperbarui dengan fungsi yang diberikan dan kemudian dikalikan dengan kecepatan pembelajaran.
- MultiplicativeLR: seperti LambdaLR kecuali dalam kecepatan pemelajaran MultiplicativeLR yang diperbarui berdasarkan faktor konstan per periode, pada kecepatan pembelajaran periode pertama dihitung dengan mengalikan faktor tertentu dengan kecepatan pembelajaran awal, dan kemudian kecepatan pembelajaran setelah periode pertama dihitung dengan mengalikan faktor tertentu dengan kecepatan pembelajaran periode sebelumnya( zaman-1).
- StepLR: memperbarui kecepatan pembelajaran setelah setiap ukuran_langkah dengan gamma, artinya jika ukuran_langkah adalah 7 maka kecepatan pembelajaran akan diperbarui setelah setiap 7 periode dengan mengalikan kecepatan pembelajaran saat ini ke gamma.
- MultiStepLR: seperti StepLR kecuali dalam hal ini kita dapat menetapkan status pencapaian kapan kita ingin mengubah kecepatan pembelajaran berdasarkan gamma.
- ExponentialLR: kecepatan pembelajaran meningkat secara eksponensial setelah setiap batch. itu berarti gamma akan dikalikan dengan kecepatan pemelajaran saat ini setelah setiap periode
- CosineAnnealingLR: Tetapkan kecepatan pembelajaran setiap grup parameter menggunakan jadwal anil kosinus. Ketika last_epoch=-1, tetapkan lr awal sebagai lr. Perhatikan bahwa karena jadwal ditentukan secara rekursif, kecepatan pembelajaran dapat diubah secara bersamaan di luar penjadwal ini oleh operator lain. Jika kecepatan pembelajaran diatur hanya oleh penjadwal ini, maka kecepatan pembelajaran pada setiap langkah menjadi
- ReduceLROnPlateau: Kurangi kecepatan pembelajaran ketika metrik berhenti ditingkatkan. Model sering kali mendapat manfaat dari pengurangan kecepatan pemelajaran sebanyak 2-10 kali setelah pembelajaran mengalami stagnasi. Penjadwal ini membaca kuantitas metrik dan jika tidak ada peningkatan yang terlihat selama beberapa periode ‘kesabaran’, kecepatan pembelajaran akan berkurang.
- CyclicLR: Menetapkan kecepatan pembelajaran setiap grup parameter sesuai dengan kebijakan kecepatan pembelajaran siklis (CLR). Kebijakan ini memutarkan kecepatan pembelajaran antara dua batas dengan frekuensi konstan, seperti yang dijelaskan secara rinci dalam makalah Kecepatan Pembelajaran Siklik untuk Jaringan Syaraf Tiruan. Jarak antara dua batas dapat diskalakan berdasarkan per-iterasi atau per-siklus.
Mari kita coba satu-satu, seperti apa nilai learning rate nya
import torch.nn as nn import torch from torch import optim import torchvision import matplotlib.pyplot as plt import torchvision.transforms as transforms import numpy as np
kita buat model kecil saja dan looping buat epoch nya, ada 2 function yang kita gunakan nanti tergantung kebutuhan
def do(optimizer,scheduler): lr = list() criterion = nn.MSELoss() # initial a dummy model model = nn.Linear(30, 1) inputs = torch.rand(4,30) targets = torch.rand(1) for epoch in range(10): outs = model(inputs) loss = criterion(outs,inputs) # train() optimizer.step() # validate() scheduler.step() print('epoch={}, learning rate={:.4f}'.format(epoch, optimizer.state_dict()['param_groups'][0]['lr'])) lr.append(optimizer.state_dict()['param_groups'][0]['lr']) plt.figure() plt.plot(np.array(lr)) plt.show() def do2(optimizer,scheduler): lr = list() criterion = nn.MSELoss() # initial a dummy model model = nn.Linear(30, 1) for epoch in range(10): inputs = torch.rand(4,30) targets = torch.rand(1) outs = model(inputs) loss = criterion(outs,inputs) # train() optimizer.step() # validate() scheduler.step(loss) print('epoch={}, learning rate={:.4f}'.format(epoch, optimizer.state_dict()['param_groups'][0]['lr'])) lr.append(optimizer.state_dict()['param_groups'][0]['lr']) plt.figure() plt.plot(np.array(lr)) plt.show()
langsung run saja
lambda1 = lambda epoch: epoch /10 optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1) do(optimizer,scheduler) lambda1 = lambda epoch: 0.50 optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda=lambda1) do(optimizer,scheduler) optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.8) do(optimizer,scheduler) optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=[2,5,8], gamma=0.5) do(optimizer,scheduler) optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.5) do(optimizer,scheduler) optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=4) do(optimizer,scheduler) optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min',factor=0.2, patience=2,min_lr=0.001) do2(optimizer,scheduler) optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = optim.lr_scheduler.CyclicLR(optimizer,base_lr=0.01,max_lr=0.1,mode='triangular2') do(optimizer,scheduler)