×

Memahami Cara Kerja Learning Rate Scheduler pada Pytorch

Memahami Cara Kerja Learning Rate Scheduler pada Pytorch

182 Views

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

  1. 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.
  2. 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).
  3. 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.
  4. MultiStepLR: seperti StepLR kecuali dalam hal ini kita dapat menetapkan status pencapaian kapan kita ingin mengubah kecepatan pembelajaran berdasarkan gamma.
  5. ExponentialLR: kecepatan pembelajaran meningkat secara eksponensial setelah setiap batch. itu berarti gamma akan dikalikan dengan kecepatan pemelajaran saat ini setelah setiap periode
  6. 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
  7. 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.
  8. 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.
See also  Mencoba Kinerja Model VGG16

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)

You May Have Missed