Ana içeriğe geç

Orta10 dkA — Sinir Ağı Temelleri

RMSprop ve Adadelta

Önkoşul:Adagrad

Kanca

  1. dersin sonunda Adagrad’ın büyük zayıflığını gördük: efektif öğrenme oranı SÜREKLİ küçülüyor, uzun eğitimlerde öğrenme neredeyse duruyor. RMSprop, bu sorunu TEK bir değişiklikle çözüyor.

Sezgi

RMSprop, Adagrad’ın “tüm geçmişi biriktir” yaklaşımı yerine, SADECE YAKIN GEÇMİŞİ ağırlıklı olarak hatırlayan bir üstel hareketli ortalama kullanır. Bu küçük değişiklik, efektif öğrenme oranının sıfıra sürüklenmesini önler.

Optimizer yarışında RMSprop’u (turuncu-kahve) Adagrad ile karşılaştır — ikisi de “uyarlanabilir” ama farklı hızlarda hareket ediyorlar.

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

  1. dersteki Adagrad deneyini UZATALIM — 200 adım boyunca sabit bir gradyan alan bir ağırlığın efektif öğrenme oranı ne olur?

Adagrad, 200 adımda

# 16. derste Adagrad'ın efektif öğrenme oranının SÜREKLİ küçüldüğünü görmüştük.
# Bunu UZUN bir eğitimde (200 adım) izleyelim -- sabit gradyan alan bir ağırlık için.
def adagrad_efektif_lr(adim_sayisi, lr=0.4):
    cache = 0.0
    lrlar = []
    for t in range(adim_sayisi):
        cache += 1.0 ** 2  # sabit gradyan=1
        lrlar.append(lr / (np.sqrt(cache) + 1e-8))
    return lrlar

adagrad_lrlar = adagrad_efektif_lr(200)
print("Adagrad efektif öğrenme oranı (sabit gradyanla):")
for t in [1, 10, 50, 100, 150, 200]:
    print(f"  adım {t}: {adagrad_lrlar[t-1]:.5f}")
print("Sürekli küçülüyor -- 200. adımda başlangıcın SADECE %7'si kadar.")
Adagrad efektif öğrenme oranı (sabit gradyanla):
  adım 1: 0.40000
  adım 10: 0.12649
  adım 50: 0.05657
  adım 100: 0.04000
  adım 150: 0.03266
  adım 200: 0.02828
Sürekli küçülüyor -- 200. adımda başlangıcın SADECE %7'si kadar.

RMSprop, aynı 200 adımda

# RMSprop, TÜM geçmişi biriktirmek yerine bir ÜSTEL HAREKETLİ ORTALAMA kullanır.
# Bu, efektif öğrenme oranının bir noktada SABİTLENMESİNİ sağlar.
def rmsprop_efektif_lr(adim_sayisi, lr=0.1, decay=0.9):
    cache = 0.0
    lrlar = []
    for t in range(adim_sayisi):
        cache = decay * cache + (1 - decay) * 1.0 ** 2
        lrlar.append(lr / (np.sqrt(cache) + 1e-8))
    return lrlar

rmsprop_lrlar = rmsprop_efektif_lr(200)
print("\nRMSprop efektif öğrenme oranı (aynı sabit gradyanla):")
for t in [1, 10, 50, 100, 150, 200]:
    print(f"  adım {t}: {rmsprop_lrlar[t-1]:.5f}")
print("100. adımdan sonra SABİTLENİYOR (0.1) -- Adagrad'ın aksine sıfıra gitmiyor.")

RMSprop efektif öğrenme oranı (aynı sabit gradyanla):
  adım 1: 0.31623
  adım 10: 0.12391
  adım 50: 0.10026
  adım 100: 0.10000
  adım 150: 0.10000
  adım 200: 0.10000
100. adımdan sonra SABİTLENİYOR (0.1) -- Adagrad'ın aksine sıfıra gitmiyor.

Adagrad’ın efektif lr’ı 200. adımda başlangıcın sadece %7’sine (0.028) inerken, RMSprop’unki 100. adım civarında 0.1’de SABİTLENİYOR. Çoğu kişi “uyarlanabilir optimizer’lar hep aynı şekilde davranır” sanır. Yanlış, çünkü Adagrad’ın “toplam” hafızası sınırsız büyürken, RMSprop’un “hareketli ortalama” hafızası sabit bir ufka bakar.

Matematik

RMSprop güncelleme kuralı
ct=ρct1+(1ρ)gt2c_t = \rho \, c_{t-1} + (1-\rho) \, g_t^2wt+1=wtηct+ϵgtw_{t+1} = w_t - \frac{\eta}{\sqrt{c_t} + \epsilon} \, g_t
SembolAnlamı
ρ\rho (rho)Bozunma katsayısı (genelde 0.9) — geçmişin ne kadarının “unutulacağı”
ctc_tKareli gradyanların ÜSTEL HAREKETLİ ORTALAMASI — Adagrad’daki gibi TOPLAM değil

Tek fark Adagrad’ın ct=ct1+gt2c_t = c_{t-1} + g_t^2 formülüyle burada: RMSprop ρ\rho ile geçmişi “unutturuyor”, Adagrad hiç unutmuyor. Bu tek terim, tüm uzun-vadeli davranışı değiştiriyor.

Kod

PyTorch’un torch.optim.RMSprop’u ile doğrulayalım, sonra RMSprop’un “öğrenme oranı bile gerektirmeyen” kuzeni Adadelta’ya kısaca bakalım:

PyTorch ile doğrulama

# PyTorch torch.optim.RMSprop ile karşılaştıralım.
w = torch.tensor(5.0, requires_grad=True)
optimizer = torch.optim.RMSprop([w], lr=0.1, alpha=0.9)
for t in range(30):
    optimizer.zero_grad()
    w.grad = torch.tensor(1.0)
    optimizer.step()
print(f"\nPyTorch RMSprop, 30 adım sonra w={w.item():.4f}")

PyTorch RMSprop, 30 adım sonra w=1.1052

Adadelta -- öğrenme oranı bile gerektirmez

# Adadelta, RMSprop'un bir adım ötesi: öğrenme oranını BİLE elle belirlemeye gerek bırakmaz.
# Geçmiş GÜNCELLEME büyüklüklerini de (Edelta) biriktirip, adım boyutunu kendi kendine ölçeklendirir.
def adadelta(adim_sayisi, decay=0.9, eps=1e-6):
    w, Eg, Edelta = 5.0, 0.0, 0.0
    yol = [w]
    for _ in range(adim_sayisi):
        g = 1.0
        Eg = decay * Eg + (1 - decay) * g ** 2
        delta_w = -(np.sqrt(Edelta + eps) / np.sqrt(Eg + eps)) * g
        w += delta_w
        Edelta = decay * Edelta + (1 - decay) * delta_w ** 2
        yol.append(w)
    return yol

yol_adadelta = adadelta(30)
print(f"\nAdadelta (öğrenme oranı BELİRTİLMEDEN), 30 adım sonra w={yol_adadelta[-1]:.4f}")
print("İlk adımlar çok KÜÇÜK (Edelta henüz 'ısınmadı') -- bu Adadelta'nın bilinen yavaş başlangıç özelliği.")

Adadelta (öğrenme oranı BELİRTİLMEDEN), 30 adım sonra w=4.8925
İlk adımlar çok KÜÇÜK (Edelta henüz 'ısınmadı') -- bu Adadelta'nın bilinen yavaş başlangıç özelliği.

Adadelta, RMSprop’un fikrini bir adım ileri götürüp GEÇMİŞ GÜNCELLEME büyüklüklerini de takip ediyor ve adım boyutunu kendi kendine ölçekliyor — ama ilk adımları ÇOK küçük kalıyor (henüz “ısınmadığı” için).

Adım sayısına karşı efektif öğrenme oranını gösteren grafik; Adagrad çizgisi sürekli sıfıra yaklaşırken RMSprop çizgisi bir noktada yatay bir çizgiye sabitleniyor.
Adagrad'ın efektif öğrenme oranı sıfıra sürükleniyor; RMSprop'unki bir kararlı duruma ulaşıp orada kalıyor.

Nerede işe yarar

RMSprop, pratikte Adagrad’ın neredeyse her zaman tercih edilen yerine geçtiği bir yöntemdir:

  • Uzun eğitimlerde RMSprop, Adagrad’a göre çok daha güvenlidir — öğrenme oranı sıfıra sürüklenmez.
  • ρ\rho (bozunma katsayısı) genelde 0.9 veya 0.99 olarak bırakılır — nadiren ayarlanır.
  • Adadelta, öğrenme oranı seçme derdini bile ortadan kaldırır ama yavaş başlangıcı nedeniyle pratikte RMSprop veya Adam kadar yaygın kullanılmaz.

Bu 3 hatayı yaparsın:

  1. Adagrad’ı hâlâ kullanıp “neden eğitim durdu” diye şaşırmak — RMSprop bu spesifik sorunu çözer.
  2. RMSprop’un ρ\rho‘sunu çok düşük (örn. 0.5) ayarlayıp “hareketli ortalamayı” neredeyse anlıksız hale getirmek — bu da gürültüyü geri getirir.
  3. Adadelta’nın yavaş başlangıcını “bozuk” sanıp erken durdurmak — bu, Edelta’nın henüz “ısınmamış” olmasından kaynaklanan BEKLENEN bir davranış.

Kendini test et

1. RMSprop, Adagrad'ın 'efektif öğrenme oranı sıfıra sürükleniyor' sorununu nasıl çözer?
  1. Öğrenme oranını sabit tutarak
  2. Tüm geçmiş gradyanları TOPLAMAK yerine, SADECE yakın geçmişi ağırlıklı hatırlayan bir üstel hareketli ortalama kullanarak (doğru cevap)
  3. Gradyanı sıfırlayarak
  4. Momentum ekleyerek

Neden: Adagrad'ın cache'i sınırsız TOPLAM iken RMSprop'unki üstel hareketli ORTALAMADIR -- bu sayede eski gradyanlar zamanla 'unutulur' ve efektif öğrenme oranı bir kararlı duruma ulaşıp orada kalır.

2. Notebook'ta 200 adım sonra Adagrad'ın efektif öğrenme oranı ile RMSprop'unki arasındaki temel fark neydi?
  1. İkisi de aynı şekilde davrandı
  2. Adagrad sürekli küçülmeye devam etti (başlangıcın %7'sine indi); RMSprop 100. adım civarında sabitlendi (doğru cevap)
  3. RMSprop sıfıra indi, Adagrad sabit kaldı
  4. İkisi de sıfıra indi

Neden: Adagrad'ın efektif lr'ı 200. adımda 0.02828'e (başlangıcın ~%7'si) düşerken, RMSprop'unki 0.1'de sabitlendi -- bu, RMSprop'un 'unutan hafızasının' doğrudan sonucudur.

3. Adadelta, RMSprop'tan hangi ek özelliğiyle ayrılır?
  1. Daha hızlı çalışır
  2. Geçmiş GÜNCELLEME büyüklüklerini de (Edelta) takip ederek, öğrenme oranını elle belirlemeyi bile gereksiz kılar (doğru cevap)
  3. Sadece görüntü verisinde çalışır
  4. Momentum kullanmaz

Neden: Adadelta, RMSprop'un gradyan-karesi hafızasına ek olarak geçmiş güncelleme büyüklüklerinin (Edelta) hareketli ortalamasını da tutar ve bunu adım boyutunu kendi kendine ölçeklemek için kullanır -- bu yüzden ayrı bir öğrenme oranı belirtmeye gerek kalmaz.

Özet

Özet

  • RMSprop, Adagrad'ın "tüm geçmişi topla" yaklaşımını "yakın geçmişi ağırlıklı hatırla" (üstel hareketli ortalama) ile değiştirir.
  • Bu değişiklik, efektif öğrenme oranının sıfıra sürüklenmesini önler -- bir kararlı duruma ulaşıp orada kalır.
  • RMSprop, pratikte Adagrad'ın yerini almış, uzun eğitimler için çok daha güvenli bir yöntemdir.
  • Adadelta, RMSprop'un fikrini genişletip öğrenme oranını bile elle belirlemeyi gereksiz kılar -- ama yavaş başlar.
  • Bir sonraki derste, momentum ve RMSprop'un fikirlerini BİRLEŞTİREN Adam'ı göreceğiz.
Sonraki adım: Adam →