zero_grad()
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 73/78
- 5 dk
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 olurKonum ö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ıcaTransformer'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
import torch
w = torch.tensor(1.0, requires_grad=True)
opt = torch.optim.SGD([w], lr=0.1)
# buraya yazÖrnek çözüm
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.
opt.zero_grad(____=False)
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 |