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

PyTorch Adam optimizer 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
PyTorch’ta Adam optimizer kullanmak için modeli oluşturduktan sonra torch.optim.Adam ile model parametrelerini optimizer’a vermeniz, her eğitim adımında gradyanları hesaplayıp optimizer.step() çağırmanız gerekir. En küçük çalışan akış; kaybı hesaplama, zero_grad(), geriye yayılım ve ağırlıkları güncelleme sırasıdır. Eğitim sonunda kayıp azalıyor ve doğrulama başarımı iyileşiyorsa ayarlar işe yarıyor demektir; yalnızca eğitim kaybının düşmesi tek başına modelin genelleme yaptığını kanıtlamaz.

Adam optimizer nasıl çalışır?​


Adam, gradyanların ortalamasını ve gradyan karelerinin hareketli ortalamasını kullanarak her parametre için uyarlamalı öğrenme adımı hesaplar. Bu nedenle özellikle başlangıçta uygun bir varsayılan optimizer olabilir; ancak öğrenme oranı, modelin yapısı ve veri ölçekleri hâlâ sonucu belirler.

lr öğrenme oranıdır ve güncelleme adımının büyüklüğünü belirler. weight_decay ağırlıkların aşırı büyümesini sınırlamak için kullanılabilir. betas gradyan istatistiklerinin ne kadar hızlı güncelleneceğini, eps ise sayısal kararlılık için eklenen küçük değeri belirtir. Çoğu modelde önce varsayılan betas ve eps değerlerini değiştirmeden yalnızca öğrenme oranını ayarlamak daha anlaşılırdır.

En küçük çalışan kullanım​


Ön koşul olarak PyTorch’un kurulu olduğu ve model adlı bir torch.nn.Module nesnesinin bulunduğu varsayılır. Aşağıdaki örnek, rastgele girdilerle tek bir eğitim adımını gösterir; gerçek bir öğrenme sonucu üretmek için anlamlı veri ve hedefler kullanmanız gerekir.

Python:
import torch
from torch import nn

model = nn.Linear(10, 1)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.MSELoss()

x = torch.randn(32, 10)
y = torch.randn(32, 1)

model.train()
optimizer.zero_grad()

prediction = model(x)
loss = criterion(prediction, y)
loss.backward()
optimizer.step()

print(f"Kayıp: {loss.item():.4f}")

Bu kodda loss.backward() parametrelerin gradyanlarını hesaplar, optimizer.step() ise Adam’ın hesapladığı güncellemeyi uygular. optimizer.zero_grad() çağrısı önceki adımdan kalan gradyanların yeni gradyanlara eklenmesini önler.

Veri kümesiyle eğitim döngüsü​


Gerçek eğitimde optimizer bir kez oluşturulur; her mini yığın için kayıp hesaplanır ve model güncellenir. DataLoader kullanan temel sıra şöyledir:
  1. Modeli ve optimizer’ı oluşturun. Optimizer’a modelin kendisini değil, model.parameters() sonucunu verin. Öğrenme oranını başlangıç için örneğin 1e-3 olarak belirleyebilirsiniz.
  2. Modeli eğitim kipine alın. model.train() çağrısı, özellikle dropout ve batch normalization kullanan modellerin eğitim davranışını etkinleştirir.
  3. Her mini yığının gradyanlarını temizleyin. optimizer.zero_grad() çağrısını yeni kaybı hesaplamadan önce yapın.
  4. İleri yönlü hesaplama yapın. Girdiyi modelden geçirerek tahminleri üretin ve uygun kayıp fonksiyonuyla hedefe göre loss değerini hesaplayın.
  5. Geriye yayılımı çalıştırın. loss.backward() çağrısı model parametrelerinin gradyanlarını oluşturur.
  6. Parametreleri güncelleyin. optimizer.step() çağrısı Adam’ın güncellemesini uygular. Bu çağrı yapılmazsa gradyan hesaplanır ancak model ağırlıkları değişmez.
Üstteki tek çıkışlı model regresyon içindir. Aşağıdaki sınıflandırma örneği 10 özellik ve 3 sınıf kullanır. Önceden oluşturduğunuz, boş olmayan train_loader ve validation_loader, (N, 10) biçiminde kayan noktalı girdiler ile (N,) biçiminde, 0–2 sınıf indekslerini içeren torch.long hedefler sağlamalıdır.

Python:
model = nn.Linear(10, 3)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()

for epoch in range(10):
    model.train()
    total_loss = 0.0

    for inputs, targets in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()

        total_loss += loss.item()

    average_loss = total_loss / len(train_loader)
    print(f"Epoch {epoch + 1}: {average_loss:.4f}")

CrossEntropyLoss kullanıldığında model çıktısının genellikle sınıf başına ham skorları, yani logits değerlerini üretmesi beklenir; modele ayrıca softmax eklemek çoğu standart kullanımda gerekli değildir. Hedefler de çoğunlukla sınıf indekslerini taşıyan tamsayı tensörleridir.

Öğrenme oranı ve yaygın seçenekler​


Adam ayarlarını değiştirirken her parametrenin etkisini birbirine karıştırmamak için önce yalnızca lr değerini değiştirin. Aşağıdaki seçenekler farklı amaçlara hizmet eder:
AyarÖrnekEtkisi
lr1e-3Her güncellemenin temel büyüklüğünü belirler.
weight_decay1e-4Ağırlıkların aşırı büyümesini sınırlamaya yardımcı olur.
betas(0.9, 0.999)Gradyan ve gradyan karesi istatistiklerinin hareketli ortalamalarını belirler.
eps1e-8Sayısal hesaplamalarda sıfıra bölme benzeri kararsızlıkları azaltır.
Öğrenme oranı çok büyükse kayıp dalgalanabilir veya NaN olabilir. Çok küçükse kayıp azalması aşırı yavaşlayabilir. Önce eğitim ve doğrulama kayıplarını birlikte izleyin; eğitim kaybı düşerken doğrulama kaybı yükseliyorsa sorun yalnız optimizer seçimi olmayabilir, model aşırı öğreniyor olabilir. Bu durumda veri bölme, düzenlileştirme, model boyutu ve eğitim süresi de incelenmelidir.

weight_decay eklemek otomatik olarak daha iyi genelleme garantisi vermez. Değer artırıldığında eğitim kaybı yükseliyor ancak doğrulama sonucu iyileşiyorsa düzenlileştirme yararlı olabilir; her iki sonuç da kötüleşiyorsa değer fazla yüksek olabilir veya sorun veri ve model tarafında bulunabilir.

Doğrulama ve sorun kontrolü​


Eğitimden sonra modeli doğrulama verisiyle değerlendirirken gradyan hesaplamayı kapatın. Bu, ileri hesap için gradyan grafiği kurulmasını engelleyerek bellek kullanımını azaltır. no_grad() ağırlıkları kilitlemez; aşağıdaki doğrulama kodu optimizer.step() çağırmadığı ve parametreleri değiştirmediği için ağırlıklar güncellenmez:

Python:
model.eval()
validation_loss = 0.0

with torch.no_grad():
    for inputs, targets in validation_loader:
        outputs = model(inputs)
        validation_loss += criterion(outputs, targets).item()

validation_loss /= len(validation_loader)
print(f"Doğrulama kaybı: {validation_loss:.4f}")

Sonuçları yorumlarken şu ayrımları kullanın:
  • Kayıp düzenli azalıyor: Eğitim akışı ve öğrenme oranı en azından öğrenmeyi sağlayacak yönde çalışıyor olabilir; doğrulama sonucunu da kontrol edin.
  • Kayıp NaN oluyor: Öğrenme oranını düşürün, girdilerde ve hedeflerde NaN veya sonsuz değer bulunmadığını kontrol edin. Gerekirse gradyan normlarını ve model çıktılarının büyüklüğünü inceleyin.
  • Kayıp hiç değişmiyor: optimizer.step() ve loss.backward() çağrılarının yapıldığını, optimizer’a doğru model parametrelerinin verildiğini ve modelin çıktısının kayıp fonksiyonuna uygun olduğunu kontrol edin.
  • Eğitim iyi, doğrulama kötü: Bu durum Adam’ın çalışmadığını kanıtlamaz; aşırı öğrenme, veri sızıntısı, hatalı normalizasyon veya eğitim-doğrulama farkı araştırılmalıdır.
Optimizer’ı eğitim başladıktan sonra yeniden oluşturmak, Adam’ın tuttuğu hareketli gradyan istatistiklerini sıfırlar. Bu nedenle yalnızca öğrenme oranını değiştirmek istiyorsanız mevcut optimizer’ın parametre gruplarını güncellemek veya belgelenmiş bir öğrenme oranı çizelgeleyicisi kullanmak daha uygun olabilir. Modeli ve optimizer’ı kaydedip eğitime daha sonra devam edecekseniz ikisinin durumunu birlikte saklayın; yalnızca model ağırlıklarını kaydetmek optimizer’ın geçmiş istatistiklerini korumaz.

Sık sorulan sorular​

Adam ile AdamW aynı mıdır?​

Adam ve AdamW aynı optimizer değildir. Özellikle weight_decay kullanımının uygulanış biçimi farklı olduğundan, birinden diğerine geçerken aynı hiperparametrelerin aynı sonucu vereceği varsayılmamalıdır. Seçiminizi model türü, doğrulama sonucu ve kullandığınız eğitim yaklaşımına göre yapın.

Her eğitim döngüsünde optimizer yeniden oluşturulmalı mı?​

Hayır. Optimizer genellikle model oluşturulduktan sonra bir kez oluşturulur ve tüm eğitim boyunca kullanılır. Her döngüde yeniden oluşturmak Adam’ın biriktirdiği geçmiş istatistikleri sıfırlayabilir ve beklenen optimizasyon davranışını değiştirebilir.
 

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