Sıradaki

Yakınsayana kadar in

Zorluk: Orta

optimizasyon

Tek adımla yetinme: kayıp (loss) artık neredeyse hiç değişmeyene kadar gradyan inişi (gradient descent) adımları at.

L(w)=w2L(w) = w^2 loss’u için descend(w0, lr, tol=1e-6, max_steps=100) fonksiyonunu yaz. w0w_0 noktasından başla. η\eta öğrenme oranıdır (learning rate) ve kodda lr olarak geçer.

Yeni ağırlığı (weight) şu formül verir:

wyeni=w−η⋅2ww_{\text{yeni}} = w - \eta \cdot 2w

Döngü her adımda şunları yapar:

  1. Yeni weight’i hesapla.
  2. Loss’taki değişimi hesapla: ∣L(wyeni)−L(w)∣\lvert L(w_{\text{yeni}}) - L(w) \rvert.
  3. Değişim tol değerinden küçükse dur.
  4. Durduğunda yeni weight’i ve o ana kadar atılan adım sayısını bir demet (tuple) olarak döndür. Adım sayısına bu son adım dahildir.
  5. Durmadıysan ww‘yi yeni weight’e güncelle ve bir sonraki adıma geç.

max_steps adım sonunda hâlâ durmadıysan son weight’i ve max_steps’i döndür.

Örnekler

Girdi: w0 = 4.0, lr = 0.1
Çıktı: (0.0012980742146337075, 36)

Girdi: w0 = -3.0, lr = 0.4
Çıktı: (-0.00019199999999999957, 6)

Girdi: w0 = 2.0, lr = 0.95
Çıktı: (0.001910009901593639, 66)

İpucu 1

for steps in range(1, max_steps + 1): ile adımları say. Böylece döngü bitince adım sayısını ayrıca tutman gerekmez.

İpucu 2

w’yi güncellemeden önce iki loss’u karşılaştır. Sıra şöyledir:

  1. Yeni weight’i hesapla.
  2. İki loss’u karşılaştır.
  3. w’yi güncelle.

Gereksinimler

  • Dönüş değeri (float, int) biçiminde bir tuple’dır.
  • Adım sayısı 1’den başlar: ilk adımda durursan 1 döndür.
  • Loss’taki değişimin mutlak değerini tol ile karşılaştır.

Gradient descent minimuma yaklaştıkça adımlar küçülür. L(w)=w2L(w) = w^2 için gradyan (gradient) 2w2w‘dir. ww sıfıra yaklaştıkça adım da sıfıra yaklaşır.

Loss neredeyse değişmiyorsa devam etmenin faydası kalmaz. Buna yakınsama (convergence) denir.

Learning rate’e göre weight farklı davranır:

  • η>0,5\eta > 0{,}5: weight minimumun iki yanında salınır.
  • η=0,95\eta = 0{,}95: her adımda ww, −0,9-0{,}9 ile çarpılır ve yakınsama uzun sürer.
  • η>1\eta > 1: salınım büyür ve loss hiç azalmaz. Buna ıraksama (divergence) denir.

max_steps, ıraksamada döngünün sonsuza kadar sürmesini engeller.

Bu durma koşulu yalnızca loss’a bakar. η=1\eta = 1‘de:

  • ww her adımda yalnızca işaret değiştirir.
  • Loss hiç değişmez; fonksiyon ilk adımda durur.
  • ww yine de minimuma hiç yaklaşmamıştır.

Daha fazlası için Gradyan inişi dersine bak.

Adımları 1’den say ve her adımda şunları yap:

  1. Yeni weight’i hesapla.
  2. Loss’taki değişimi hesapla.
def descend(w0: float, lr: float, tol: float = 1e-6, max_steps: int = 100) -> tuple[float, int]:    w = w0    for steps in range(1, max_steps + 1):        new_w = w - lr * 2 * w        if abs(new_w**2 - w**2) < tol:            return new_w, steps        w = new_w    return w, max_steps

Durma koşulunu w’yi güncellemeden önce kontrol et. Önce güncellersen iki loss’u karşılaştıramazsın. Adım sayısı da bir kayar.

Bu problemde bir sorun mu var?

solution.py
def descend(w0: float, lr: float, tol: float = 1e-6, max_steps: int = 100) -> tuple[float, int]:    """Kayıp artık neredeyse değişmeyene kadar adım atar; (son ağırlık, adım sayısı) döndürür."""    w = w0    # Kodunu buraya yaz.    return w, 0

İçindekiler

Geri bildirim

Tür