Weight Decay
Ağırlık azaltma, model ağırlıklarını sıfıra doğru küçülten bir düzenlileştirme tekniğidir; sinir ağlarının aşırı öğrenmeyi azaltmasına ve yeni verilere genelleme yapmasına yardımcı olur.
Ağırlık azaltma, eğitim sırasında modelin öğrenilmiş ağırlıklarını sıfıra doğru çeken bir düzenlileştirme tekniğidir. Bu tekrarlanan küçültme, gereksiz yere büyük parametre değerlerini önler ve bir sinir ağının görülmemiş örneklere genelleme yapmasına yardımcı olur. Modelin eğitim verilerindeki gürültüyü ezberleyecek kadar kapasitesi olduğunda özellikle yararlıdır.
Geoffrey Hinton, ağırlık azaltmayı 1986 tarihli Kavramların Dağıtılmış Temsillerini Öğrenme makalesinde tanıttı. Aile ağacı deneyinde, öğrenilen bağlantıların yorumlanmasını kolaylaştırmak için her güncellemeden sonra ağırlık büyüklüklerini %0,2 azalttı. Ağırlık azaltma daha sonra aşırı öğrenmeyi kontrol etmek için yaygın biçimde kullanılmaya başlandı.
Ağırlık Azaltma Nasıl Çalışır#
Gradyan inişi sırasında optimize edici, her parametrenin kayıp fonksiyonunu nasıl etkilediğini açıklayan türevleri, yani gradyanları kullanarak parametreleri değiştirir. Ağırlık azaltma, sıfıra doğru bir çekim kuvveti ekler. Pek çok optimize edicide kullanılan öğrenme oranıyla ölçeklenmiş yaklaşıma göre, momentum içermeyen yalın bir SGD güncellemesi şöyledir: new weight = (1 - learning rate × decay) × old weight - learning rate × gradient. Bu işlem, tahmin hatalarından öğrenmeyi orantılı küçültmeyle birleştirir.
Azaltma katsayısı, bu çekim kuvvetinin gücünü belirler. Sıfır bu kuvveti devre dışı bırakır; daha büyük pozitif değerler, sabit bir öğrenme oranında küçültmeyi artırır. Tahminleri iyileştirdiğinde görev gradyanı yine de bir ağırlığı artırabilir. Öğrenme oranı azaltma, optimize edicinin adım boyutunu giderek küçültür; ağırlık azaltma ise parametre değerlerini etkiler.
Ağırlık Azaltma ve L2 Düzenlileştirmesi#
L2 düzenlileştirmesi, eğitim amaç fonksiyonuna karelenmiş ağırlıkların ölçeklenmiş toplamını ekler. Yalın stokastik gradyan inişi kullanıldığında, bu cezanın türevi uygun katsayılar eşleştirildiğinde aynı orantılı küçültmeyi sağlar. Doğrusal regresyonda, bu kareli ağırlık cezasıyla yapılan uyarlamaya ridge regresyonu denir.
Adam optimize edici ile L2 cezası eklemek, ceza gradyanını Adam'ın hareketli ortalamalarından ve parametreye özgü ölçeklendirmesinden geçirir. AdamW ise küçültmeyi bu uyarlamalı gradyan hesabından ayrı uygular. Ilya Loshchilov ve Frank Hutter, AdamW'yi 2017 tarihli Ayrıştırılmış Ağırlık Azaltma Düzenlileştirmesi makalelerinde tanıttı; makale ICLR 2019'da yayımlandı. Bu ayrım, azaltma gücünü Adam'ın gradyan geçmişi ölçeklendirmesinden bağımsız kılar.
Azaltma Gücünü Seçme#
Ağırlık azaltma, doğrulama verileri kullanılarak seçilen bir hiperparametredir. Çok düşük olması aşırı öğrenmeyi yeterince sınırlamaz. Aşırı azaltma ise yetersiz öğrenmeye yol açar: model yararlı örüntüleri öğrenemez ve eğitim ile doğrulama örneklerinde yüksek hatalar verir. Farklı azaltma ayarlarının doğrulama puanlarını karşılaştırmak, belirli bir model ve veri kümesi için uygun gücü ortaya çıkarır.
Biriken etki, öğrenme oranı çizelgesine ve optimize edici güncellemelerinin sayısına da bağlıdır. Yığın boyutunu veya eğitim dönemlerinin sayısını değiştirmek, azaltmanın uygulanma sayısını değiştirebilir; gradyan biriktirme, bir güncellemeden önce birden fazla yığını birleştirir. Dropout katmanı, aktivasyonları rastgele sıfırlayarak düzenlileştirme yaparken erken durdurma eğitim süresini sınırlar.
Ultralytics YOLO, YOLO26 gibi modelleri eğitirken düzenlileştirmeyi kontrol etmek için varsayılan değeri 0.0005 olan bir weight_decay eğitim ayarını kullanıma sunar. Optimize edici parametre grupları, bias'ları ve normalleştirme katmanı parametrelerini ağırlık azaltmanın dışında tutar.
PyTorch'ta Ağırlık Azaltma#
torch.optim.AdamW optimize edicisi, PyTorch içinde ayrıştırılmış ağırlık azaltma sağlar. Paketi pip install torch ile yükle; bu örnek, yazdırılan güncellemenin yalnızca ağırlık azaltma etkisini göstermesi için sıfır görev gradyanı oluşturur:
import torch
weight = torch.nn.Parameter(torch.tensor([2.0]))
optimizer = torch.optim.AdamW([weight], lr=0.1, weight_decay=0.1)
before = weight.item()
# Create a zero gradient while keeping the parameter in the computation.
optimizer.zero_grad()
loss = (weight * 0).sum()
loss.backward()
optimizer.step()
print(f"Weight: {before:.2f} -> {weight.item():.2f}")Çıktı Weight: 2.00 -> 1.98 olur: tek bir güncelleme, ağırlığı 1 - 0.1 × 0.1 ile, yani 0.99 ile çarpar ve büyüklüğünü %1 azaltır.










