Materi
Gradient descent biasa hanya memakai gradien saat ini. Pada loss yang berbentuk lembah sempit, langkahnya bolak-balik melintasi dinding lembah dan maju pelan di sepanjang dasarnya; Deep Learning bab 8.3.2 memakai gambaran lembah ini untuk memperkenalkan momentum. Dive into Deep Learning §12.6 menulisnya sebagai rata-rata bocor (leaky average) gradien: v_t = β·v_(t−1) + g_t, lalu w ← w − η·v_t, dengan v₀ = 0 dan β di antara 0 dan 1. v disebut kecepatan: gradien yang arahnya konsisten saling menumpuk, gradien yang berganti tanda saling meredam.
Adam (d2l §12.10, Deep Learning bab 8.5.3) menyimpan dua rata-rata bergerak untuk setiap bobot: v_t = β₁·v_(t−1) + (1 − β₁)·g_t untuk arah gradien dan s_t = β₂·s_(t−1) + (1 − β₂)·g_t² untuk besarnya. Keduanya dimulai dari 0, jadi di langkah-langkah awal nilainya condong terlalu kecil dan dikoreksi: v̂_t = v_t / (1 − β₁ᵗ) dan ŝ_t = s_t / (1 − β₂ᵗ), dengan t dihitung mulai 1. Pembaruannya w ← w − η·v̂_t / (√ŝ_t + ε).
Pembagian dengan √ŝ memberi setiap bobot besar langkahnya sendiri, sehingga bobot bergradien kecil tidak tertinggal. Nilai yang umum dipakai, dan juga bawaan MLPClassifier scikit-learn, adalah β₁ = 0,9, β₂ = 0,999, dan epsilon 10⁻⁸; η diatur learning_rate_init. Parameter momentum di MLPClassifier (bawaan 0,9) hanya dipakai solver sgd.
# momentum pada f(w) = (w - 4) ** 2, beta 0.5, eta 0.1, mulai dari w = 0
w, v = 0.0, 0.0
for t in range(3):
g = 2 * (w - 4)
v = 0.5 * v + g
w = w - 0.1 * v
print(round(v, 2), round(w, 3)) # -8.0 0.8 | -10.4 1.84 | -9.52 2.792