• Yapay zeka soru ve sorunlarınızı uygun olan kategorilere açıp yanıt alabilirsiniz...

PyTorch autograd nasıl kullanılır?

Garfield

YZF Admin
Yaş
40
Konum
YurtDışı
Katılım
27 Eki 2026
Konular
664
Mesajlar
689
AI Seviyesi
Yeni
Autograd, PyTorch tensörleri üzerinde yapılan işlemleri izleyerek türevleri otomatik hesaplar. Temel kullanım için türevini istediğiniz tensörü requires_grad=True ile oluşturur veya bu özelliği sonradan açarsınız; hesaplama sonucunda skaler bir kayıp üretip .backward() çağırırsınız. Ardından türeve x.grad üzerinden erişebilir, eğitim döngüsünde bu gradyanı optimizer ile ağırlıkları güncellemek için kullanabilirsiniz.

En küçük autograd örneği​


Aşağıdaki örnekte y = x² + 3x fonksiyonu için x = 2 noktasındaki türev hesaplanır. Fonksiyonun türevi dy/dx = 2x + 3 olduğundan beklenen sonuç 7'dir.

Python:
import torch

x = torch.tensor(2.0, requires_grad=True)
y = x**2 + 3 * x

y.backward()

print("y =", y.item())
print("dy/dx =", x.grad.item())

Bu kodda x hesaplama grafiğinin başlangıç tensörüdür. y oluşturulurken yapılan üs alma, çarpma ve toplama işlemleri grafik üzerinde izlenir. y.backward() çağrısı zincir kuralını geriye doğru uygular. Beklenen çıktı yaklaşık olarak y = 10 ve dy/dx = 7 olur. Bu sonuç yalnızca bu noktadaki türevi gösterir; modelin iyi öğrendiğini veya seçilen fonksiyonun her noktada aynı gradyana sahip olduğunu kanıtlamaz.

Autograd ile temel kullanım sırası​


Bir model eğitilirken her iterasyonda önce eski gradyanlar temizlenir, sonra ileri yönlü hesap yapılır, kayıp hesaplanır ve geriye yayılım başlatılır. Aşağıdaki sıra, tek bir parametre için bu akışı gösterir.
  1. Gradyan tutulacak tensörü oluşturun. Parametre veya giriş tensörünü requires_grad=True ile oluşturun. Türev gerekmeyen sabit verilerde bu seçeneği açmayın; gereksiz hesaplama ve bellek kullanımına yol açabilir.
  2. Önceki gradyanı temizleyin. Aynı tensörle birden fazla kez .backward() çağıracaksanız x.grad = None ataması yapın. PyTorch gradyanları varsayılan olarak biriktirdiği için temizleme yapılmazsa yeni sonuç eski gradyana eklenir.
  3. İleri yönlü hesabı yapın. Modeli veya matematiksel ifadeyi parametrelerden başlayarak çalıştırın ve bir çıktı üretin.
  4. Kayıp değerini elde edin. Model çıktısı ile hedef arasındaki farkı ölçen tek bir kayıp tensörü oluşturun. Geriye yayılım için kayıp genellikle tek bir skaler olmalıdır.
  5. Geriye yayılımı başlatın. Kayıp tensörü üzerinde loss.backward() çağırın. Bunun sonucunda ilgili yaprak tensörlerin veya model parametrelerinin .grad alanları türevlerle doldurulur.
  6. Gradyanı kullanın. Bir optimizer kullanıyorsanız optimizer.step() ile parametreleri güncelleyin. Elle güncelleme yapıyorsanız bunu torch.no_grad() bloğu içinde gerçekleştirin; aksi hâlde güncelleme işlemi yeni bir hesaplama grafiğine eklenebilir.

Küçük bir parametre güncellemesi​


Aşağıdaki varsayımsal örnekte amaç, w değerini 3'e yaklaştırmaktır. Kayıp (w - 3)² olarak tanımlanır. w = 1 için türev -4 olur; öğrenme oranı 0,1 ise güncelleme sonrası değer 1,4'e ilerler.

Python:
import torch

w = torch.tensor(1.0, requires_grad=True)
learning_rate = 0.1

def loss_function(parameter):
    return (parameter - 3.0) ** 2

loss = loss_function(w)
loss.backward()

with torch.no_grad():
    w -= learning_rate * w.grad

print("Kayıp:", loss.item())
print("Gradyan:", w.grad.item())
print("Yeni w:", w.item())

Burada loss.item() güncellemeden önceki kaybı, w.grad.item() ise güncellemeden önceki türevi gösterir. Yeni parametre değeri yaklaşık 1,4 olur. Bu tek adım, yalnızca gradyanın hangi yönde ilerlenmesi gerektiğini gösterir; uygun öğrenme oranını, modelin yakınsayacağını veya gerçek bir veri kümesinde iyi sonuç alınacağını garanti etmez.

Gerçek sinir ağı eğitiminde aynı işi genellikle torch.optim optimizer'ı yapar. Mantıksal sıra optimizer.zero_grad(), ileri yönlü hesap, kayıp hesabı, loss.backward() ve optimizer.step() şeklindedir. zero_grad() çağrısı atlanırsa gradyanlar iterasyonlar arasında birikir ve güncelleme beklenenden farklı olur.

requires_grad, detach ve no_grad farkı​


Bu üç kullanım benzer görünse de farklı amaçlara hizmet eder. Seçim, bir tensörün türeve dâhil edilip edilmeyeceğine ve işlemin grafik üzerinde izlenip izlenmeyeceğine göre yapılmalıdır.
KullanımNe yapar?Ne zaman kullanılır?
requires_grad=TrueTensör üzerinden yapılan işlemleri autograd için izler.Türevini veya model parametresi gradyanını hesaplamak istediğinizde.
torch.no_grad()Blok içindeki işlemler için yeni gradyan grafiği oluşturmaz.Değerlendirme veya elle parametre güncellemesi sırasında.
.detach()Tensörü mevcut grafikten ayıran yeni bir tensör görünümü döndürür.Bir değeri gradyan akışını durdurarak başka bir hesaplamaya aktarmak istediğinizde.
Örneğin model değerlendirilirken gradyan gerekmiyorsa ileri yönlü hesabı with torch.no_grad(): içinde yapabilirsiniz. Bu, tahmin üretir ancak geriye yayılım için gerekli grafiği kurmaz. detach() ise tek bir tensörü mevcut hesaplama geçmişinden ayırmak için kullanılır. Bu iki yaklaşım aynı amaçla her durumda birbirinin yerine geçmez.

Gradyanın neden boş veya beklenenden farklı olduğu​


x.grad değerinin None olması, çoğu zaman x tensörünün hesaplama grafiğinin yaprak tensörü olmaması, requires_grad özelliğinin kapalı olması veya henüz .backward() çağrılmaması anlamına gelir. Ara tensörün gradyanını incelemek gerekiyorsa geriye yayılımdan önce o tensör üzerinde .retain_grad() kullanılması gerekebilir.

Gradyanın sıfır olması ise None ile aynı değildir. Sıfır, o noktadaki türevin gerçekten sıfır olabileceğini; None ise gradyan alanının doldurulmadığını gösterir. Önce requires_grad durumunu, ardından kaybın gerçekten parametreye bağlı olup olmadığını ve .backward() çağrısının çalışıp çalışmadığını kontrol edin.

Aynı grafiğe bağlı bir kayıp üzerinde birden fazla kez geriye yayılım yapacaksanız grafik varsayılan olarak ilk çağrıdan sonra serbest bırakılabilir. İkinci çağrı gerekiyorsa hesabı yeniden kurmak genellikle en açık çözümdür; aynı grafiği korumak zorunda olduğunuz özel durumlarda backward(retain_graph=True) seçeneğini dikkatli kullanın. Bu seçenek bellek kullanımını artırabilir.

Birden fazla çıktı için backward kullanımı​


.backward() parametresiz kullanıldığında çıktı genellikle skaler olmalıdır. Model birden fazla değer döndürüyorsa bu değerleri tek bir kayıp içinde toplayabilir veya ortalayabilirsiniz. Örneğin loss = losses.mean() sonrasında loss.backward() çağrılabilir. Alternatif olarak aynı şekilli bir başlangıç gradyanı verilebilir: losses.backward(torch.ones_like(losses)), çıktıların toplamının türeviyle aynı vektör-Jacobian çarpımını hesaplar. Bu seçim, her çıktının gradyana katkısını değiştirir; toplam ve ortalama aynı yönü korusa da gradyan büyüklükleri farklı olabilir.
 

Sen de şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic
Geri
Üst