CodeBlanks Logo Icon CodeBlanks

zero_grad()

zero_grad() her adımda gradyanları sıfırlar.

zero_grad()

opt.zero_grad(), optimize edicinin yönettiği tüm parametrelerin gradyanlarını temizler. PyTorch 2'de varsayılan set_to_none=True'dur: gradyanlar sıfır tensörü yerine None yapılır; bu biraz bellek ve zaman kazandırır:

opt.zero_grad()
print(w.grad)                    # None
opt.zero_grad(set_to_none=False)
# gradyan tensörü korunur, değerleri 0 olur

Konum önemlidir: zero_grad ya döngünün başında ya da step()'tan hemen sonra çağrılır; backward ile step arasında çağrılırsa gradyanlar silinir ve güncelleme olmaz.

Ağırlık azaltma

Optimize ediciler L2 düzenlileştirmeyi doğrudan uygulayabilir: weight_decay her adımda ağırlıkları biraz sıfıra çeker. Adam'da bu ceza uyarlamalı ölçekle karıştığı için AdamW azaltmayı ayrı uygular ve genellikle daha iyi genelleşir:

opt = torch.optim.SGD(params, lr=0.1, weight_decay=1e-4)   # g += wd·p
opt = torch.optim.AdamW(params, lr=1e-3, weight_decay=0.01) # p -= lr·wd·p ayrıca

Transformer'lar genellikle AdamW ile eğitilir.

Uygulama Yanlış yerde zero_grad

w = 1.0 için (w ** 2) kaybını geri yay, sonra zero_grad() ve ardından step() çağır (lr = 0.1). w'nin değişmediğini (w.item()) ve gradyanın None olduğunu aynı satırda yazdır. Ardından doğru sırayla (önce step) tekrarlayıp yeni w'yi yazdır.

Başlangıç kodu

model.py
import torch

w = torch.tensor(1.0, requires_grad=True)
opt = torch.optim.SGD([w], lr=0.1)

# buraya yaz

Örnek çözüm

model.py
import torch

w = torch.tensor(1.0, requires_grad=True)
opt = torch.optim.SGD([w], lr=0.1)

(w ** 2).backward()
opt.zero_grad()
opt.step()
print(w.item(), w.grad is None)
(w ** 2).backward()
opt.step()
opt.zero_grad()
print(round(w.item(), 3))

Beklenen çıktı

1.0 True
0.8

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>backward()</code> ile <code>step()</code> arasında <code>zero_grad()</code> çağrılırsa ne olur?

  • Normal güncelleme
  • İki kat güncelleme
  • Hata
  • Gradyanlar silinir, parametre güncellenmez Doğru cevap

Açıklama: step() gradyanı None olan parametreleri atlar.

2 Gradyanları None yerine sıfırla.

Soru
opt.zero_grad(____=False)
Cevap
opt.zero_grad(set_to_none=False)

Açıklama: set_to_none=False gradyan tensörünü korur.

3 Kavramları eşleştir.

Kavram Anlamı
zero_grad() Gradyanları None yapar
set_to_none=False Sıfır tensörü
weight_decay Ağırlıkları sıfıra çeker
AdamW Ayrık azaltma

İleri seviye bölümündeki tüm dersler