Varian SGD

Intuisi Momentum dan Adam serta kapan masing-masing dipilih.

Daftar isi

Varian SGD adalah optimizer yang memperhalus atau menyesuaikan langkah gradient descent, dan dua nama yang paling sering muncul adalah Momentum dan Adam. Topik ini menjelaskan apa yang diubah masing-masing varian, memperlihatkan perbedaannya pada fungsi yang sama, dan menutup dengan kaidah pemilihan optimizer yang dipakai pada sisa jalur. Setelah selesai, baris optim.SGD atau optim.Adam pada kode pelatihan memiliki makna yang utuh.

SGD murni dan harga kebisingannya#

SGD murni memakai aturan yang diwarisi gradient descent, yaitu θ←θ−ηgt \theta \leftarrow \theta - \eta g_t dengan gt g_t gradien batch saat ini. Karena gradien batch adalah perkiraan yang bising, langkahnya berubah-ubah arah di sekitar lintasan rata-ratanya. Kebisingan itu bukan murni kerugian, karena membantu pelatihan melewati titik pelana, tetapi pada lembah yang sempit ia membuat langkah berosilasi dari dinding ke dinding alih-alih turun ke dasarnya.

Dua keluarga perbaikan menangani masalah itu dengan cara berbeda. Momentum menyatukan arah-arah terbaru menjadi satu kecepatan yang halus, sedangkan keluarga adaptif seperti Adam menyetel panjang langkah per parameter berdasarkan riwayat gradiennya sendiri. Keduanya tidak saling meniadakan, dan Adam bahkan memuat momentum di dalamnya.

Momentum: kecepatan yang menumpuk#

Momentum memperlakukan pembaruan parameter seperti benda yang bergerak dengan inersia. Ia menyimpan kecepatan vt v_t yang merupakan campuran kecepatan sebelumnya dan gradien saat ini:

vt=βvt−1+gt,θ←θ−ηvt v_t = \beta v_{t-1} + g_t, \qquad \theta \leftarrow \theta - \eta v_t

Nilai β \beta yang lazim adalah 0,9, yang berarti sembilan persepuluh kecepatan lama bertahan dan gradien baru hanya menambahkan sepersepuluhnya. Gradien yang arahnya konsisten menumpuk sehingga langkah efektifnya membesar, sedangkan gradien yang arahnya bergantian saling meniadakan, sehingga osilasi pada lembah sempit teredam.

Perbedaannya terlihat pada fungsi kuadrat yang sama dengan topik Gradient descent. Kode berikut membandingkan SGD murni dan SGD ber momentum pada f(w)=(w−3)2 f(w) = (w - 3)^2 dengan learning rate yang sama.

python Contoh: SGD murni berbanding momentum
import torch

def lintasan(optimizer_kelas, **opsi):
    w = torch.tensor([0.0], requires_grad=True)
    opt = optimizer_kelas([w], **opsi)
    posisi = []
    for _ in range(5):
        opt.zero_grad()
        loss = (w - 3.0) ** 2
        loss.backward()
        opt.step()
        posisi.append(round(w.item(), 3))
    return posisi

print("SGD murni     :", lintasan(torch.optim.SGD, lr=0.1))
print("SGD momentum  :", lintasan(torch.optim.SGD, lr=0.1, momentum=0.9))
text Keluaran
SGD murni     : [0.6, 1.08, 1.464, 1.771, 2.017]
SGD momentum  : [0.6, 1.62, 2.814, 3.926, 4.741]

Dalam lima langkah yang sama, versi momentum sudah melampaui sasaran 3 hingga 4,741 sebelum akan berbalik kembali, sedangkan versi murni baru mencapai 2,017. Percepatan pada arah konsisten inilah alasan praktis hampir semua pelatihan SGD memakai momentum, dan nilai bawaan PyTorch untuk momentum yang nol lebih merupakan kelalaian historis daripada rekomendasi.

Adam: langkah adaptif per parameter#

Adam menambahkan dua gagasan di atas momentum. Pertama, ia menyimpan rata-rata bergerak gradien dan kuadrat gradien untuk setiap parameter, lalu membagi langkah dengan akar kuadrat rata-rata kuadratnya. Akibatnya, parameter yang gradiennya selalu besar mendapat langkah yang diperkecil, dan parameter yang gradiennya jarang atau kecil mendapat langkah yang diperbesar, sehingga laju per parameter menyesuaikan skalanya sendiri. Kedua, kedua rata-rata diperbaiki biasnya pada langkah awal agar tidak mulai dari nol yang menyesatkan.

Bentuk pemanggilannya satu baris, dan nilai bawaannya adalah titik awal yang wajar untuk banyak masalah:

python Contoh: pemakaian Adam dengan nilai bawaan
import torch
import torch.nn as nn

model = nn.Linear(4, 1)
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
print("grup parameter:", len(opt.param_groups))
print("laju belajar  :", opt.param_groups[0]["lr"])
text Keluaran
grup parameter: 1
laju belajar  : 0.001

Learning rate 0,001 menjadi bawaan yang terkenal karena bersikap aman pada rentang masalah yang lebar, tetapi sifat aman itu bukan pengganti penalaan, dan topik Jadwal learning rate membahas bagaimana nilai ini seharusnya berubah sepanjang pelatihan.

Kaidah pemilihan pada jalur ini#

Kaidah yang dipakai sepanjang jalur ini sederhana dan konsisten dengan praktik umum. Pada pelatihan dari nol dengan jaringan kecil hingga menengah, SGD dengan momentum 0,9 dipakai sebagai baseline karena sederhana, hemat memori, dan sering menghasilkan generalisasi yang baik bila learning rate beserta jadwalnya tertata. Pada eksplorasi cepat, model transformer, dan fine-tuning, Adam atau varian AdamW dipilih karena tolerannya terhadap learning rate yang belum ditala dan keseimbangan laju antar parameter.

Tabel berikut merangkum kontrasnya tanpa mengganti kaidah di atas.

AspekSGD + momentumAdam
Skala langkahSama untuk semua parameterAdaptif per parameter
Kebutuhan penalaan lrLebih sensitifLebih toleran
Memori ekstraSatu buffer kecepatanDua buffer per parameter
Pemakaian umumCNN dari nolTransformer, fine-tuning

Yang tidak boleh dilupakan adalah kedua varian tetap memakai gradien yang sama hasil autograd. Optimizer hanya menentukan bagaimana gradien itu diterjemahkan menjadi langkah, sehingga kesalahan pada loss atau data tidak akan pernah diperbaiki oleh pergantian optimizer.

Ringkasan#

  • Momentum menumpuk gradien yang arahnya konsisten dan meniadakan yang bergantian, sehingga konvergensi lebih cepat dan osilasi teredam.
  • Adam menyetel panjang langkah per parameter dari rata-rata gradien dan kuadratnya, dengan bawaan lr 0,001 yang toleran.
  • SGD ber momentum menjadi baseline pelatihan dari nol, sedangkan Adam dipilih untuk transformer dan fine-tuning.
  • Optimizer hanya menerjemahkan gradien menjadi langkah, sehingga ia tidak menyembuhkan loss atau data yang salah.

Referensi#