Adam
Önkoşul:RMSprop ve Adadelta
Kanca
15-17. derste momentum (gürültüyü yumuşatan “hız”) ve RMSprop (kararlı bir uyarlanabilir öğrenme oranı) fikirlerini ayrı ayrı gördük. Adam, bu ikisini BİRLEŞTİREN ve bugün en yaygın kullanılan optimizer.
Sezgi
Adam, HER ağırlık için iki ayrı hafıza tutar: gradyanın kendisinin ortalaması (momentum gibi) VE gradyanın karesinin ortalaması (RMSprop gibi). Ama bu iki hafıza SIFIRDAN başladığı için, ilk birkaç adımda “gerçek” değerlerinden sistematik olarak küçük kalırlar — Adam’ın en önemli (ve çoğu kişinin bilmediği) detayı bu sapmayı düzeltmesidir.
Optimizer yarışında Adam’ı (mor) izle — hem vadi hem eyer noktası senaryosunda genelde hızlı VE kararlı davranıyor.
Adım: 0
SGD'nin dar vadide nasıl ZİGZAG çizdiğine, momentumun ise bu salınımı nasıl yumuşatıp hızlandırdığına dikkat et.
Mekanizma
Adam’ı, bias düzeltmesi OLMADAN uygularsak ne olur?
Adam, bias düzeltmesi olmadan
# Adam = Momentum (15. ders) fikri + RMSprop (17. ders) fikri BİRLEŞTİRİLMİŞ.
# m: gradyanın üstel ortalaması (momentum'daki "hız" gibi)
# v: gradyan KARESİNİN üstel ortalaması (RMSprop'taki "cache" gibi)
def adam_duzeltmesiz(adim_sayisi, lr=0.3, b1=0.9, b2=0.999):
w, m, v = 5.0, 0.0, 0.0
yol = [w]
for t in range(1, adim_sayisi + 1):
g = 1.0 # sabit gradyan
m = b1 * m + (1 - b1) * g
v = b2 * v + (1 - b2) * g ** 2
w -= lr * m / (np.sqrt(v) + 1e-8)
yol.append(w)
return yol
yol_duzeltmesiz = adam_duzeltmesiz(15)
print("Bias düzeltmesi OLMADAN Adam:")
print(" " + ", ".join(f"{v:.2f}" for v in yol_duzeltmesiz))
print(f"\n15 adım sonra w={yol_duzeltmesiz[-1]:.2f} -- bu bir 'vadi'ye inmek değil, PATLAMAK!")Bias düzeltmesi OLMADAN Adam:
5.00, 4.05, 2.78, 1.29, -0.34, -2.08, -3.90, -5.77, -7.68, -9.63, -11.58, -13.55, -15.52, -17.49, -19.45, -21.40
15 adım sonra w=-21.40 -- bu bir 'vadi'ye inmek değil, PATLAMAK!15 adımda w, 5.0’dan -21.40’a savruluyor — bu bir yakınsama değil, bir PATLAMA. Şimdi TEK satırlık bir düzeltme ekleyelim:
Adam, bias düzeltmesiyle
# Sorun: m ve v, SIFIRDAN başlıyor -- ilk adımlarda GERÇEK değerlerinden çok KÜÇÜK kalıyorlar.
# Adam, bunu (1 - beta^t) ile BÖLEREK düzeltir -- "bias correction".
def adam_duzeltmeli(adim_sayisi, lr=0.3, b1=0.9, b2=0.999):
w, m, v = 5.0, 0.0, 0.0
yol = [w]
for t in range(1, adim_sayisi + 1):
g = 1.0
m = b1 * m + (1 - b1) * g
v = b2 * v + (1 - b2) * g ** 2
m_hat = m / (1 - b1 ** t)
v_hat = v / (1 - b2 ** t)
w -= lr * m_hat / (np.sqrt(v_hat) + 1e-8)
yol.append(w)
return yol
yol_duzeltmeli = adam_duzeltmeli(15)
print("\nBias düzeltmesi İLE Adam:")
print(" " + ", ".join(f"{v:.2f}" for v in yol_duzeltmeli))
print(f"\n15 adım sonra w={yol_duzeltmeli[-1]:.2f} -- düzgün, DOĞRUSAL bir iniş.")
print("Fark SADECE (1-beta^t) ile bölme -- ama sonuç YAKINSAMA ile IRAKSAMA arasındaki fark.")
Bias düzeltmesi İLE Adam:
5.00, 4.70, 4.40, 4.10, 3.80, 3.50, 3.20, 2.90, 2.60, 2.30, 2.00, 1.70, 1.40, 1.10, 0.80, 0.50
15 adım sonra w=0.50 -- düzgün, DOĞRUSAL bir iniş.
Fark SADECE (1-beta^t) ile bölme -- ama sonuç YAKINSAMA ile IRAKSAMA arasındaki fark.Aynı ayarlarla, aynı gradyanla, sonuç artık düzgün bir iniş: w=0.50. Çoğu kişi “küçük bir matematiksel detay, önemli olamaz” sanır. Yanlış, çünkü bu TEK terim, yakınsama ile ıraksama arasındaki farkı yaratıyor.
Matematik
Adam güncelleme kuralı
| Sembol | Anlamı |
|---|---|
| Birinci moment — gradyanın kendisinin üstel ortalaması (momentum, 15. ders) | |
| İkinci moment — gradyan KARESİNİN üstel ortalaması (RMSprop, 17. ders) | |
| Bias-DÜZELTİLMİŞ versiyonlar — ‘ye bölünerek erken adımlardaki küçük-kalma sorunu giderilir |
büyüdükçe , yani — düzeltme yalnızca İLK adımlarda etkili, sonra otomatik olarak “kapanır”.
Kod
Neden özellikle İLK adım bu kadar riskli? ‘nin başlangıçtaki değerine bakalım:
t=1'de v neden çok küçük?
# İlk adımda (t=1) v_hat'in düzeltmesiz haliyle düzeltmeli halini karşılaştıralım.
b2 = 0.999
v_ham_t1 = (1 - b2) * 1.0 ** 2 # sadece 0.001
v_hat_t1 = v_ham_t1 / (1 - b2 ** 1) # düzeltmeden sonra
print(f"\nt=1'de v (düzeltmesiz) = {v_ham_t1:.5f} -- GERÇEK gradyan karesinden (1.0) ÇOK küçük!")
print(f"t=1'de v_hat (düzeltmeli) = {v_hat_t1:.5f} -- gerçek değere (1.0) çok daha yakın.")
print("Düzeltmesiz küçük v, paydayı küçültüp adımı DEVASA büyütüyor -- patlamanın kaynağı bu.")
t=1'de v (düzeltmesiz) = 0.00100 -- GERÇEK gradyan karesinden (1.0) ÇOK küçük!
t=1'de v_hat (düzeltmeli) = 1.00000 -- gerçek değere (1.0) çok daha yakın.
Düzeltmesiz küçük v, paydayı küçültüp adımı DEVASA büyütüyor -- patlamanın kaynağı bu.t=1’de düzeltmesiz sadece 0.00100 — gerçek gradyan karesinden (1.0) 1000 kat küçük! Bu küçük , paydada olduğu için adımı DEVASA büyütüyor. Düzeltme, ‘yi 1.0’a (gerçek değerine) taşıyor.
PyTorch ile doğrulama
# PyTorch'un torch.optim.Adam'ı, bias düzeltmesini İÇİNDE otomatik yapar.
w_t = torch.tensor(5.0, requires_grad=True)
optimizer = torch.optim.Adam([w_t], lr=0.3, betas=(0.9, 0.999))
for t in range(15):
optimizer.zero_grad()
w_t.grad = torch.tensor(1.0)
optimizer.step()
print(f"\nPyTorch Adam, 15 adım sonra: w={w_t.item():.4f}")
print(f"Elle yazdığımız (düzeltmeli) Adam: w={yol_duzeltmeli[-1]:.4f} -- neredeyse birebir aynı.")
PyTorch Adam, 15 adım sonra: w=0.5000
Elle yazdığımız (düzeltmeli) Adam: w=0.5000 -- neredeyse birebir aynı.PyTorch’un torch.optim.Adam’ı bu düzeltmeyi otomatik yapar — sonuç (w=0.5000) elle yazdığımız versiyonla BİREBİR aynı.
Nerede işe yarar
Adam, günümüzde derin öğrenmenin VARSAYILAN optimizer’ıdır:
- Çoğu modern model (transformer’lar dahil, NLP kategorisinde göreceğiz) Adam veya türevleriyle (AdamW gibi) eğitilir.
- Varsayılan hiperparametreler (, , ) çoğu problemde iyi çalışır — bu, Adam’ın popülerliğinin bir nedeni.
- Momentum + uyarlanabilir öğrenme oranı birleşimi, hem gürültüye hem de kötü ölçeklenmiş gradyanlara karşı dayanıklı yapıyor.
Bu 3 hatayı yaparsın:
- Kendi optimizer’ını yazarken bias düzeltmesini UNUTMAK — bu notebook’ta gördüğümüz gibi, sonuç sessizce (hata mesajı vermeden) ıraksayabilir.
- Adam’ın “her zaman en iyi” olduğunu sanmak — bazı problemlerde (özellikle çok büyük dil modellerinde) düzgün ayarlanmış SGD+momentum daha iyi genelleme verebilir.
- ‘yi (genelde 0.999) çok düşük ayarlayıp ‘nin çok hızlı değişmesine, dolayısıyla adımların kararsızlaşmasına neden olmak.
Kendini test et
1. Notebook'ta bias düzeltmesi OLMADAN Adam neden ıraksadı (w=-21.40'a savruldu)?
- Öğrenme oranı çok küçüktü
- v (ikinci moment), ilk adımlarda gerçek değerinden ÇOK küçük kaldığı için payda küçüldü ve adım boyutu devasa büyüdü (doğru cevap)
- Gradyan yanlış hesaplandı
- Momentum kullanılmadı
Neden: t=1'de düzeltmesiz v sadece 0.001 (gerçek değerden 1000 kat küçük) -- bu küçük v, w -= lr*m/sqrt(v) formülünün paydasında olduğu için adımı orantısız şekilde büyütüyor.
2. Adam, hangi iki fikri birleştirir?
- Sadece SGD ve Adagrad
- Momentum (gradyanın ortalaması) ve RMSprop (gradyan karesinin ortalaması) (doğru cevap)
- Sadece L1 ve L2 düzenlileştirme
- Batch normalization ve dropout
Neden: Adam, momentumdan gradyanın üstel ortalamasını (m_t, birinci moment) ve RMSprop'tan gradyan karesinin üstel ortalamasını (v_t, ikinci moment) alıp birleştirir.
3. Bias düzeltmesi (m_t değerini (1-β₁^t) ile bölmek gibi) neden SADECE ilk adımlarda etkilidir?
- Her zaman aynı etkiye sahiptir
- t büyüdükçe β üzeri t sıfıra yaklaşır, bu yüzden (1-β üzeri t) 1'e yaklaşır ve bölme işlemi etkisiz hale gelir (doğru cevap)
- Düzeltme sadece son adımda uygulanır
- Düzeltme, öğrenme oranını değiştirir
Neden: β1 ve β2, 1'den küçük olduğu için üsleri (β^t) adım sayısı arttıkça sıfıra yaklaşır; bu da (1-β^t) payını 1'e yaklaştırıp düzeltmeyi kademeli olarak "kapatır" -- düzeltme sadece erken adımlarda büyük bir fark yaratır.
Özet
Özet
- Adam, momentum (birinci moment) ve RMSprop (ikinci moment) fikirlerini birleştirir.
- m ve v, sıfırdan başladığı için ilk adımlarda gerçek değerlerinden sistematik olarak küçük kalır -- bias.
- Bias düzeltmesi ((1-beta^t)'ye bölme), bu erken-adım sapmasını giderir; düzeltme olmadan eğitim ıraksayabilir.
- Adam, günümüzde derin öğrenmenin en yaygın kullanılan varsayılan optimizer'ıdır.
- Varsayılan hiperparametreler (β1=0.9, β2=0.999) çoğu problemde iyi bir başlangıç noktasıdır.