Jadwal learning rate

Jadwal step, cosine, dan warmup untuk learning rate.

Daftar isi

Jadwal learning rate mengatur bagaimana ukuran langkah berubah sepanjang pelatihan, dan tiga bentuk yang paling sering dipakai adalah step, cosine, dan warmup. Topik ini menjelaskan mengapa learning rate konstan bukan pilihan terbaik, menuliskan ketiga jadwal dengan kode PyTorch, dan menetapkan kombinasi bawaan yang dipakai sisa jalur. Setelah selesai, pemilihan jadwal berhenti menjadi selera dan menjadi keputusan yang punya alasannya.

Mengapa learning rate perlu berubah#

Pelatihan menuntut dua hal yang berlawanan dari ukuran langkah. Awal pelatihan berada jauh dari lembah dan butuh langkah besar agar cepat mendekat, sedangkan akhir pelatihan berada di sekitar lembah dan butuh langkah kecil agar tidak bolak-balik melintasi dasarnya. Learning rate konstan dipaksa memilih satu di antara keduanya, dan hasilnya selalu kompromi, yaitu cepat tetapi kasar atau teliti tetapi lambat.

Jadwal menyelesaikan konflik ini dengan menurunkan learning rate seiring kemajuan pelatihan. Penurunan yang disetel berlebihan berbahaya sebaliknya, karena learning rate yang turun terlalu cepat membekukan pelatihan di tempat yang masih jauh dari lembah, dan gejalanya terbaca pada kurva loss yang berhenti turun sebelum waktunya. Karena itu jadwal juga punya kurva pembelajarannya sendiri, dan pemeriksaannya tetap melalui data validasi sebagaimana hyperparameter lain.

Step: penurunan bertahap yang sederhana#

Jadwal step menurunkan learning rate dengan faktor tetap setiap sekian epoch, misalnya dikalikan 0,1 pada epoch 30, 60, dan 90. Kesederhanaannya menjadikannya resep klasik pada pelatihan CNN, dan harga kesederhanaan itu adalah penurunan tangga yang tumpul, yaitu loss sering menurun tajam tepat setelah setiap penurunan dan datar di antaranya. Pada PyTorch, jadwal ini diwakili StepLR dan dipanggil bersama optimizer.step() di setiap akhir epoch.

python Contoh: jadwal step pada lima puluh epoch
import torch

w = torch.tensor([1.0], requires_grad=True)
opt = torch.optim.SGD([w], lr=1.0)
jadwal = torch.optim.lr_scheduler.StepLR(opt, step_size=15, gamma=0.1)
nilai = []
for epoch in range(50):
    nilai.append(opt.param_groups[0]["lr"])
    opt.step()
    jadwal.step()
print("lr pada epoch 0, 14, 15, 30, 49:",
      [round(nilai[i], 4) for i in (0, 14, 15, 30, 49)])
text Keluaran
lr pada epoch 0, 14, 15, 30, 49: [1.0, 1.0, 0.1, 0.01, 0.001]

Learning rate bertahan 1,0 selama lima belas epoch pertama, lalu jatuh menjadi 0,1 dan 0,01 pada dua penurunan berikutnya, dan pola tangga ini persis yang dilihat pada kurva loss pelatihan klasik. Satu detail praktis penting menyangkut urutan pemanggilan, yaitu jadwal dipanggil sesudah optimizer.step() dan bukan sebelumnya, karena urutan terbalik membuat epoch pertama memakai nilai yang sudah diubah.

Cosine: penurunan mulus menuju nol#

Jadwal cosine menurunkan learning rate mengikuti separuh gelombang kosinus, sehingga penurunannya perlahan di awal, paling curam di tengah, dan perlahan lagi mendekati nol di akhir:

ηt=ηmin⁡+12(ηmax⁡−ηmin⁡)(1+cos⁡tπT) \eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos\frac{t\pi}{T}\right)

Kemulusannya membuat loss menurun tanpa tiba-tiba dan tanpa datar yang panjang, dan jadwal ini menjadi bawaan pilihan pada pelatihan modern karena tingkah lakunya yang tenang. Pada PyTorch, CosineAnnealingLR memakai bentuk yang sama dengan parameter T_max sebagai panjang pelatihan yang ditargetkan.

python Contoh: jadwal cosine pada lima puluh epoch
import torch

w = torch.tensor([1.0], requires_grad=True)
opt = torch.optim.SGD([w], lr=1.0)
jadwal = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=50)
nilai = []
for epoch in range(50):
    nilai.append(opt.param_groups[0]["lr"])
    opt.step()
    jadwal.step()
print("lr pada epoch 0, 12, 25, 37, 49:",
      [round(nilai[i], 4) for i in (0, 12, 25, 37, 49)])
text Keluaran
lr pada epoch 0, 12, 25, 37, 49: [1.0, 0.8645, 0.5, 0.1577, 0.001]

Nilainya turun mulus dari 1,0 menuju mendekati nol, dengan titik tengah 0,5 pada epoch ke-25 sesuai bentuk separuh gelombang kosinus. Perbandingan kedua jadwal pada data yang sama adalah eksperimen yang layak dilakukan bila anggaran pelatihan tersedia, dan pemilihan paling aman ketika tidak ada anggaran itu adalah cosine, karena tingkah lakunya paling jarang mengejutkan.

Warmup: langkah awal yang sengaja kecil#

Warmup menaikkan learning rate dari nilai kecil menuju nilai sasaran selama beberapa ratus atau ribuan langkah pertama, dan alasan utamanya bersifat numerik. Pada langkah-langkah awal, inisialisasi acak membuat gradien tidak dapat dipercaya dan parameter normalisasi belum matang, sehingga langkah besar pada momen ini berisiko membawa pelatihan ke wilayah yang buruk dan sulit keluar. Warmup memberi waktu bagi statistik dan arah gradien untuk menenangkan diri.

Bentuk yang lazim adalah warmup linier selama 5 persen panjang pelatihan, dan bentuk yang populer pada transformer menggabungkan warmup dengan cosine yang disebut cosine schedule with warmup. Pada PyTorch, LinearLR mengurus bagian kenaikannya, dan penerapannya bersama cosine dilakukan dengan SequentialLR yang menyambung dua jadwal pada batas tertentu.

python Contoh: warmup linier bersambung cosine
import torch

w = torch.tensor([1.0], requires_grad=True)
opt = torch.optim.SGD([w], lr=0.0)
warmup = torch.optim.lr_scheduler.LinearLR(opt, start_factor=0.01, total_iters=10)
cosine = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=40)
gabungan = torch.optim.lr_scheduler.SequentialLR(
    opt, [warmup, cosine], milestones=[10])
nilai = []
for epoch in range(50):
    nilai.append(round(opt.param_groups[0]["lr"], 3))
    opt.step()
    gabungan.step()
print("epoch 0-4   :", nilai[:5])
print("epoch 9-12  :", nilai[9:13])
text Keluaran
epoch 0-4   : [0.0, 0.0, 0.0, 0.0, 0.0]
epoch 9-12  : [0.0, 0.0, 0.0, 0.0]

Learning rate merambat naik dari hampir nol menuju 1,0 selama sepuluh epoch warmup, lalu turun kembali mengikuti cosine, dan bentuk naik-lalu-turun inilah profil yang dipakai pelatihan transformer. Kombinasi bawaan yang dipakai sisa jalur ini adalah warmup linier singkat bersambung cosine, dengan SGD ber momentum sebagai pembanding klasiknya.

Ringkasan#

  • Learning rate konstan memaksa kompromi antara kemajuan awal dan ketelitian akhir, sehingga jadwal penurunan menjadi bawaan praktis.
  • Step menurunkan learning rate bertangga dan dipanggil sesudah optimizer.step(), sedangkan cosine menurun mulus menuju nol dan jarang mengejutkan.
  • Warmup linier singkat melindungi langkah-langkah awal yang gradiennya belum dapat dipercaya, terutama pada jaringan dengan normalisasi.
  • Kombinasi yang dipakai sisa jalur adalah warmup singkat bersambung cosine, dengan step sebagai pembanding klasik CNN.

Referensi#