Stochastic Gradient Descent (SGD)
SGD, küçük rastgele veri yığınlarından hesaplanan, maliyeti düşük çok sayıda ağırlık güncellemesiyle modeli eğitir. Güncelleme kuralını, momentumu, yığın boyutunu ve kodu ele alır.
Stokastik gradyan inişi (SGD), bir optimizasyon algoritmasıdır ve bir modelin ağırlıklarını, tüm veri kümesi yerine küçük ve rastgele bir örneklem üzerindeki kayıp değerinin gradyanıyla tekrar tekrar güncelleyerek modeli eğitir; örneklem eğitim verilerinden seçilir. Her örneklemin gradyanı gürültülü olsa da tam veri kümesinin gradyanının yansız bir tahminidir; bu nedenle SGD, tam yığın gradyan inişinin tek bir yüksek maliyetli güncelleme yapacağı sürede çok sayıda düşük maliyetli güncelleme yapar. Bu yöntem, Robbins ve Monro'nun 1951 tarihli stokastik yaklaşım yöntemine dayanır ve momentumla birlikte evrişimli sinir ağları (CNNs) için standart bir optimizasyon algoritması olmaya devam eder.
SGD Nasıl Çalışır#
Her SGD adımı bir mini yığın B alır, geri yayılımla bu yığındaki kaybın gradyanını hesaplar ve her ağırlığı gradyanın ters yönünde küçük bir adımla günceller: w ← w − η·∇L_B(w); burada η, öğrenme oranıdır. Kesin tanımıyla SGD her adımda tek bir örnek kullanır, ancak derin öğrenme çerçeveleri bunu onlarca ila binlerce örnekten oluşan mini yığınlara uygular; bu nedenle pratikte «SGD» ve «mini yığın gradyan inişi» eş anlamlıdır. Daha büyük bir yığın boyutu, daha az gürültülü gradyan ve daha iyi donanım kullanımı sağlar; bunun karşılığında her epok başına güncelleme sayısı azalır.
Eğitim, her epokun başında verileri karıştırır, bunları mini yığınlar hâlinde işler ve her yığın için bir adım atar. 1.000 gürültülü noktaya doğru uydurma, sürecin tamamını gösteriyor:
import torch
torch.manual_seed(0)
# 1,000 noisy samples of y = 3x + 2
x = torch.randn(1000, 1)
y = 3 * x + 2 + 0.1 * torch.randn(1000, 1)
model = torch.nn.Linear(1, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.05, momentum=0.9)
for epoch in range(5):
# Reshuffle every epoch, then update the weights once per 32-sample mini-batch
for idx in torch.randperm(1000).split(32):
loss = torch.nn.functional.mse_loss(model(x[idx]), y[idx])
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"epoch {epoch}: w = {model.weight.item():.3f}, b = {model.bias.item():.3f}, loss = {loss.item():.4f}")Toplam 64 güncellemeden oluşan iki epok sonunda ağırlık 3,081'e, bias ise 2,012'ye ulaşır. Sonraki üç epok boyunca ağırlık, yerleşmek yerine 2,967 ile 3,003 arasında hareket etmeye devam eder; bunun nedeni her mini yığın gradyanında örnekleme gürültüsü bulunmasıdır. Son yığın kaybı, y'ye eklenen gürültünün varyansı olan 0,01 civarında kalır.
Öğrenme Oranı, Gürültü ve Yığın Boyutu#
Sabit bir öğrenme oranıyla SGD, boyutu öğrenme oranı ve gradyan gürültüsü arttıkça büyüyen bir minimum bölgesinde dalgalanır. Stokastik yaklaşım teorisi, yakınsamayı yalnızca öğrenme oranı sıfıra doğru azalırken garanti eder; bu nedenle uygulamada kısa bir ısınma döneminden sonra adım azaltma veya kosinüs çizelgeleriyle oran zaman içinde düşürülür. Küçük yığınların gradyan gürültüsü de SGD'yi keskin minimumlara kıyasla daha iyi genelleme yapan düz minimumlara yönlendirir; bu, örtük bir düzenlileştirme biçimidir.
Yığın boyutu ve öğrenme oranı etkileşim içindedir. Öğrenme oranını yığın boyutuyla orantılı artırmak ve beş epoch'luk bir ısınma uygulamak, ResNet-50'nin 8.192 görüntülük mini yığınlarla ve doğruluk kaybı olmadan ImageNet üzerinde bir saatte eğitilmesini sağladı.
Momentum ve Nesterov Momentumu#
Kayıp yüzeyindeki uzun ve dar bir vadide gradyan çoğunlukla vadiyi enine işaret eder; bu nedenle yalın SGD, taban boyunca yavaş ilerlerken duvarlar arasında zikzak çizer. Momentum, v ← μ·v + g ile devamlı güncellenen bir hız tutar ve w ← w − η·v ile bu hız doğrultusunda adım atar; böylece tutarlı gradyan yönleri hız kazanırken salınan yönler birbirini götürür. μ = 0,9 katsayısı genellikle varsayılan değerdir. Nesterov momentumu, gradyanı hız doğrultusunda ileriye dönük bir adımdan sonra hesaplayarak aşımı daha da azaltır. PyTorch'un SGD uygulaması her ikisini de destekler ve gradyana λ·w ekleyerek weight_decay uygular; bu, SGD için ağırlıklara uygulanan bir L2 cezasına denktir.
SGD ve Diğer İyileştiriciler#
- Yığın gradyan inişi: Her güncellemede tüm veri kümesi üzerindeki kesin gradyanı hesaplar; bu nedenle her epoch tek bir adım üretir ve bellek gereksinimi veri kümesi büyüdükçe artar.
- Adam: Gradyanlarının ve gradyan karelerinin hareketli ortalamalarından her parametreye özel bir adım boyutu belirler ve momentumlu SGD'nin parametre başına tuttuğu bir durum değerine karşılık iki durum değeri saklar. Adam başlangıçta daha hızlı ilerler ve öğrenme oranına daha az duyarlıdır; buna karşılık iyi ayarlanmış momentumlu SGD, CNN'lerde çoğu zaman son doğruluk bakımından Adam'ı yakalar veya geçer. Ağırlık azalımını ayrıklaştıran AdamW varyantı, Transformer modellerinde standart iyileştiricidir.
- Muon: Her ağırlık matrisinin momentum güncellemesini matrisin bütünü için ortogonalleştirir ve büyük dil modeli eğitimine ölçeklenmiştir.
optimizer="SGD" ayarlandığında Ultralytics YOLO eğitimi, lr0=0.01 ve momentum=0.937 değerlerini varsayılan olarak kullanarak Nesterov momentumlu PyTorch SGD oluşturur. Varsayılan optimizer="auto", lr0 değerini yok sayar ve 10.000 iterasyondan uzun çalıştırmalarda SGD ile Muon güncellemelerini birleştiren bir hibrit olan MuSGD'yi, daha kısa çalıştırmalarda ise AdamW'yi seçer.
SGD Nerelerde Kullanılır?#
Momentumlu SGD, dönüm noktası sayılan ImageNet CNN modellerinin çoğunu eğitti. İlk ResNet modellerinde 0,9 momentum, 0,0001 ağırlık azalımı ve 256 görüntülük mini yığınlar kullanıldı; öğrenme oranı 0,1'den başladı ve hata yatay seyrettiğinde 10'a bölündü. Derin öğrenme dışında scikit-learn'in SGDClassifier ve SGDRegressor araçları, lojistik regresyon ve doğrusal destek vektör makineleri gibi doğrusal modelleri SGD ile uydurur; partial_fit yöntemleri ise belleğe sığmayacak kadar büyük veri kümelerini parça parça eğitir.










