Ana içeriğe geç

Orta11 dkA — Sinir Ağı Temelleri

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.

Yüzey
Optimizerlar

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ı
mt=β1mt1+(1β1)gtm_t = \beta_1 m_{t-1} + (1-\beta_1) g_tvt=β2vt1+(1β2)gt2v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2m^t=mt1β1t\hat{m}_t = \frac{m_t}{1-\beta_1^t}v^t=vt1β2t\hat{v}_t = \frac{v_t}{1-\beta_2^t}wt+1=wtηv^t+ϵm^tw_{t+1} = w_t - \frac{\eta}{\sqrt{\hat{v}_t}+\epsilon}\,\hat{m}_t
SembolAnlamı
mtm_tBirinci moment — gradyanın kendisinin üstel ortalaması (momentum, 15. ders)
vtv_tİkinci moment — gradyan KARESİNİN üstel ortalaması (RMSprop, 17. ders)
m^t,v^t\hat{m}_t, \hat{v}_tBias-DÜZELTİLMİŞ versiyonlar — (1βt)(1-\beta^t)‘ye bölünerek erken adımlardaki küçük-kalma sorunu giderilir

tt büyüdükçe βt0\beta^t \to 0, yani (1βt)1(1-\beta^t) \to 1 — düzeltme yalnızca İLK adımlarda etkili, sonra otomatik olarak “kapanır”.

Kod

Neden özellikle İLK adım bu kadar riskli? vv‘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 vv sadece 0.00100 — gerçek gradyan karesinden (1.0) 1000 kat küçük! Bu küçük vv, paydada olduğu için adımı DEVASA büyütüyor. Düzeltme, vv‘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ı.

Adım sayısına karşı ağırlığı gösteren grafik; bias düzeltmesi olmayan çizgi hızla negatife savrulurken, düzeltmeli çizgi düzgün ve doğrusal bir şekilde iniyor.
Aynı gradyan, aynı hiperparametreler -- SADECE bias düzeltmesinin varlığı/yokluğu, yakınsama ile ıraksama arasındaki farkı yaratıyor.

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 (β1=0.9\beta_1=0.9, β2=0.999\beta_2=0.999, η=0.001\eta=0.001) ç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:

  1. Kendi optimizer’ını yazarken bias düzeltmesini UNUTMAK — bu notebook’ta gördüğümüz gibi, sonuç sessizce (hata mesajı vermeden) ıraksayabilir.
  2. 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.
  3. β2\beta_2‘yi (genelde 0.999) çok düşük ayarlayıp vv‘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)?
  1. Öğrenme oranı çok küçüktü
  2. 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)
  3. Gradyan yanlış hesaplandı
  4. 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?
  1. Sadece SGD ve Adagrad
  2. Momentum (gradyanın ortalaması) ve RMSprop (gradyan karesinin ortalaması) (doğru cevap)
  3. Sadece L1 ve L2 düzenlileştirme
  4. 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?
  1. Her zaman aynı etkiye sahiptir
  2. 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)
  3. Düzeltme sadece son adımda uygulanır
  4. 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.
Sonraki adım: Patlayan gradyan ve clipping →