Garfield
YZF Admin
PyTorch’ta Adam optimizer kullanmak için modeli oluşturduktan sonra
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.
Ön koşul olarak PyTorch’un kurulu olduğu ve
Bu kodda
Gerçek eğitimde optimizer bir kez oluşturulur; her mini yığın için kayıp hesaplanır ve model güncellenir.
Adam ayarlarını değiştirirken her parametrenin etkisini birbirine karıştırmamak için önce yalnızca
Öğrenme oranı çok büyükse kayıp dalgalanabilir veya
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.
Sonuçları yorumlarken şu ayrımları kullanın:
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:- Modeli ve optimizer’ı oluşturun. Optimizer’a modelin kendisini değil,
model.parameters()sonucunu verin. Öğrenme oranını başlangıç için örneğin1e-3olarak belirleyebilirsiniz. - Modeli eğitim kipine alın.
model.train()çağrısı, özellikle dropout ve batch normalization kullanan modellerin eğitim davranışını etkinleştirir. - Her mini yığının gradyanlarını temizleyin.
optimizer.zero_grad()çağrısını yeni kaybı hesaplamadan önce yapın. - İleri yönlü hesaplama yapın. Girdiyi modelden geçirerek tahminleri üretin ve uygun kayıp fonksiyonuyla hedefe göre
lossdeğerini hesaplayın. - Geriye yayılımı çalıştırın.
loss.backward()çağrısı model parametrelerinin gradyanlarını oluşturur. - 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.
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 | Örnek | Etkisi |
|---|---|---|
| lr | 1e-3 | Her güncellemenin temel büyüklüğünü belirler. |
| weight_decay | 1e-4 | Ağı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. |
| eps | 1e-8 | Sayısal hesaplamalarda sıfıra bölme benzeri kararsızlıkları azaltır. |
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
NaNoluyor: Öğrenme oranını düşürün, girdilerde ve hedeflerdeNaNveya 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()veloss.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.
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.