Yakınsayana kadar in
Zorluk: Orta Çözüldüoptimizasyon
Tek adımla yetinme: kayıp (loss) artık neredeyse hiç değişmeyene kadar gradyan inişi (gradient descent) adımları at.
loss’u için descend(w0, lr, tol=1e-6, max_steps=100) fonksiyonunu yaz. noktasından başla. öğrenme oranıdır (learning rate) ve kodda lr olarak geçer.
Yeni ağırlığı (weight) şu formül verir:
Döngü her adımda şunları yapar:
- Yeni weight’i hesapla.
- Loss’taki değişimi hesapla: .
- Değişim
toldeğerinden küçükse dur. - 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.
- Durmadıysan ‘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:
- Yeni weight’i hesapla.
- İki loss’u karşılaştır.
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
1döndür. - Loss’taki değişimin mutlak değerini
tolile karşılaştır.
Gradient descent minimuma yaklaştıkça adımlar küçülür. için gradyan (gradient) ‘dir. 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:
- : weight minimumun iki yanında salınır.
- : her adımda , ile çarpılır ve yakınsama uzun sürer.
- : 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. ‘de:
- her adımda yalnızca işaret değiştirir.
- Loss hiç değişmez; fonksiyon ilk adımda durur.
- 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:
- Yeni weight’i hesapla.
- 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?