Backpropagation
Geri yayılım, her ağırlığın gradyanını tek geçişte hesaplamak için zincir kuralını sinir ağı boyunca geriye doğru uygular. Matematiği, maliyeti ve kodu.
"Hataların geriye yayılımı" ifadesinin kısaltması olan geri yayılım, bir tahminin hatasına her bir ağırlığın ne ölçüde katkıda bulunduğunu hesaplayan sinir ağı algoritmasıdır. Kayıp fonksiyonundan başlayıp zincir kuralını katman katman girdiye doğru uygular ve her ara sonucu yeniden kullanır. Böylece tek bir geriye doğru geçiş, modelin binlerce veya milyarlarca parametresi olmasına bakılmaksızın her ağırlığın gradyanını verir. Eniyileyici daha sonra ağırlıkları güncellemek için bu gradyanları kullanır; bu nedenle geri yayılım, neredeyse tüm derin öğrenme modellerinin ardındaki öğrenme adımıdır. Rumelhart, Hinton ve Williams, 1986'da Nature'da yayımlanan Learning representations by back-propagating errors makalesiyle bu yöntemi sinir ağlarında yaygınlaştırdı.
Geri Yayılım Nasıl Çalışır#
Bir grup üzerinde eğitim iki geçişten oluşur. İleri geçiş, girdileri her katmandan geçirir, ara etkinleşmeleri saklar ve kayıpla sona erer. Geri geçiş kayıptan başlar ve katmanları ters sırayla ziyaret eder. Her katman, yukarı akış gradyanı adı verilen, kaybın kendi çıktısına göre gradyanını alır ve bunu kendi yerel türevleriyle çarparak iki sonuç üretir: eniyileyici için saklanan katman ağırlıklarının gradyanı ve katmanın girdisine göre gradyan. İkincisi, altındaki katmanın yukarı akış gradyanı olur.
Her katmanın yalnızca üst katmandan gelen gradyana ve saklanan aktivasyonlarına ihtiyacı olduğundan hiçbir türev iki kez hesaplanmaz. Otomatik türev alma açısından geri yayılım, ağın hesaplama grafiği üzerinde ters kipli türev alma işlemidir; PyTorch hesaplama grafiğini ileri geçiş sırasında oluşturur ve loss.backward() çağrıldığında hesaplama grafiğinde geriye doğru ilerler. İki ağırlıklı bir ağda, PyTorch'un autograd sonucu elle yazılmış zincir kuralıyla karşılaştırılarak doğrulanabilir:
import torch
# A two-weight network: prediction = w2 * tanh(w1 * x)
x, target = torch.tensor(1.5), torch.tensor(0.5)
w1 = torch.tensor(0.8, requires_grad=True)
w2 = torch.tensor(-1.2, requires_grad=True)
# Forward pass, keeping the hidden activation h for the backward pass
h = torch.tanh(w1 * x)
loss = (w2 * h - target) ** 2
# Backward pass: autograd applies the chain rule from the loss back to each weight
loss.backward()
# The same chain rule by hand, reusing the upstream gradient dL/dy for both weights
dL_dy = 2 * (w2 * h - target)
dL_dw2 = dL_dy * h
dL_dw1 = dL_dy * w2 * (1 - h**2) * x
print(f"autograd: dL/dw1 = {w1.grad:.4f}, dL/dw2 = {w2.grad:.4f}")
print(f"by hand: dL/dw1 = {dL_dw1:.4f}, dL/dw2 = {dL_dw2:.4f}")Her iki satır da dL/dw1 = 1.6475, dL/dw2 = -2.5016 değerini yazdırır. Elle yazılan sürüm, dL_dy ifadesini bir kez hesaplayıp iki ağırlık için yeniden kullanır; autograd'ın milyarlarca ağırlığı olan ağları işlemesini sağlayan da aynı yeniden kullanımdır. Zaman içinde geri yayılım (BPTT), aynı algoritmanın zaman adımlarına açılmış bir yinelemeli sinir ağına uygulanmasıdır.
Geri Yayılım ve Eniyileyici Karşılaştırması#
Geri yayılım yalnızca gradyanları hesaplar, ağırlıkları değiştirmez. Stokastik gradyan inişi (SGD) veya Adam gibi bir eniyileme algoritması, öğrenme oranıyla ölçeklendirilmiş bu gradyanları ağırlık güncellemelerine dönüştürür. PyTorch, her geri geçişin sonucunu ağırlıklarda zaten kayıtlı olan gradyanlara ekler; böylece tek bir eniyileyici adımı birkaç grubu birleştirebilir:
Ultralytics YOLO eğitimi, nominal grup boyutunu 64 görüntüye (nbs=64) çıkarmak için bu gradyan biriktirme yöntemini kullanır: ısınma sonrasında batch=16 çalıştırması her grup için geri yayılım yapar, ancak birleştirilmiş gradyanı 10 norma göre kırptıktan sonra eniyileyici adımını her dördüncü grupta uygular.
Kaybolan ve Patlayan Gradyanlar#
Geriye yayılım geçişinde yerel türevler katman katman çarpılır; bu nedenle gradyanın büyüklüğü derinlikle geometrik olarak küçülebilir veya büyüyebilir. Doygun sigmoid birimlerinde olduğu gibi çarpanların çoğu 1'in altındaysa, ilk katmanlara neredeyse hiç sinyal ulaşmaz; buna kaybolan gradyan problemi denir. Çarpanların çoğu 1'in üzerindeyse, patlayan gradyan problemi çok büyük güncellemelere ve NaN kayıplarına yol açar. ReLU ailesi aktivasyonlar, ölçeklenmiş ağırlık başlatma, yığın normalizasyonu ve artık ağların atlama bağlantıları, yüzlerce katman boyunca gradyan büyüklüklerini kararlı tutar.
Hesaplama ve Bellek Maliyeti#
Yerel bir türevin ihtiyaç duyduğu her aktivasyon, ileri geçişten geriye yayılım geçişi o aktivasyona ulaşana kadar bellekte tutulmalıdır; bu nedenle eğitim belleği yığın boyutuyla, girdi çözünürlüğüyle ve derinlikle artar ve eğitim, çıkarımdan çok daha fazla bellek gerektirir. Gradyan kontrol noktası yalnızca bazı aktivasyonları saklar, geri kalanını geriye yayılım geçişinde yeniden hesaplar; böylece daha az bellek karşılığında ek hesaplama maliyetini göze alır. Karma hassasiyet ise çoğu aktivasyonu, 32 bit kayan noktalı sayıların yarısı kadar yer kaplayan 16 bit biçimlerde tutar. Hesaplama açısından geriye yayılım geçişi, ileri geçişin yaklaşık iki katı maliyetlidir; çünkü her katman hem ağırlıkları hem de girdileri için gradyanları hesaplar. Bu nedenle ölçekleme yasası tahminlerinde, eğitim belirteci başına parametre başına yaklaşık 6 kayan nokta işlemi sayılır: ileri geçişte 2, geriye yayılım geçişinde 4.










