01Kim sorumlu?#
Sinir ağı yazısında gördün: eğitim, kaybı azaltacak yönde her parametreyi biraz oynatmaktır. Ama bunun için her parametrenin kaybı ne kadar etkilediğini, yani kaybın o parametreye göre türevini bilmek gerekir. Bir ağ yanlış tahmin ettiğinde hata tek bir yerden gelmez; ilk katmandaki bir ağırlık, ikinci katmandaki bir ağırlık ve bias’lar birlikte çalıştı. Soru şu: bu hatadan hangi parametre ne kadar sorumlu?
En kaba yöntem, parametreleri tek tek oynatıp kayıp ne oluyor diye bakmaktır: bir ağırlığı çok az artır, ağı yeniden çalıştır, kaybın değişimine bak. Bu sonlu fark yöntemi çalışır, ama her parametre için ağı iki kez daha çalıştırmak gerekir. Bu yazıda kullanacağımız küçük ağda 9 parametre var; bu da 18 ek ileri geçiş demek. Milyarlarca parametreli bir modelde ise bu, eğitimi imkânsız kılar.
Geri yayılım (backpropagation) aynı sayıları çok daha ucuza verir: ağı bir kez ileri çalıştırır, sonra hatayı çıktıdan girdiye doğru tek bir geçişte dağıtır. Bunu mümkün kılan şey zincir kuralıdır.
02Zincir kuralı: sorumluluk çarpılarak taşınır#
Aşağıdaki ağda iki girdi, tanh’lı iki gizli nöron ve doğrusal bir çıktı var. İlk ağırlığın (w₁₁) kayba etkisi bir zincirdir: w₁₁ gizli nöronun z₁ toplamını değiştirir; z₁, tanh’tan geçerek h₁’i değiştirir; h₁ çıktıyı, çıktı da kaybı değiştirir. Zincir kuralına göre toplam etki, halkaların etkilerinin çarpımıdır.
Geri yayılım bu çarpımı sondan başlayarak kurar ve her ara sonucu bir sonraki halkaya devreder. Böylece aynı çarpanlar (örneğin ∂L/∂ŷ) her parametre için yeniden hesaplanmaz. Demoda beş aşamayı sırayla aç.
Hatanın geriye yolculuğu
Aşamaları sırayla aç ve her adımda hangi sayının nereden geldiğine bak. Sonra girdileri ya da hedefi oynat: tüm sayılar yeniden hesaplanır.
Girdiler ve ağırlıklar sabit; her düğümde değer soldan sağa hesaplanır. z₁ = 0,5·1,00 + −0,4·0,50 + 0,1 = 0,400, h₁ = tanh(z₁) = 0,380; ŷ = 0,7·0,380 + −0,6·0,462 + 0,05 = 0,039; kayıp L = ½·(ŷ − t)² = 0,462.
| Parametre | Geri yayılım | Sonlu fark (kontrol) | Fark |
|---|---|---|---|
| w₁₁ | — | — | — |
| w₁₂ | — | — | — |
| w₂₁ | — | — | — |
| w₂₂ | — | — | — |
| b₁ | — | — | — |
| b₂ | — | — | — |
| v₁ | — | — | — |
| v₂ | — | — | — |
| c | — | — | — |
tüm aşamalar açılıncaGeri yayılım: 1 ileri + 1 geri geçiş · Sonlu fark: 18 ek ileri geçişHesabı gör
Zincir kuralı: ∂L/∂w₁₁ = ∂L/∂ŷ · ∂ŷ/∂h₁ · ∂h₁/∂z₁ · ∂z₁/∂w₁₁ = (ŷ − t) · v₁ · (1 − h₁²) · x₁. Tablodaki “sonlu fark” sütunu, her parametreyi ±10⁻⁵ oynatıp kaybın nasıl değiştiğine bakarak bulunur (merkezî fark). İki sütun aynı sayıya yaklaşırsa geri yayılım doğru uygulanmış demektir.
Başlangıç değerleriyle ağın tahmini ŷ = 0,039, hedef ise 1; kayıp 0,462. Geri geçiş şöyle ilerler:
- Kayıptan başlar: ∂L/∂ŷ = ŷ − t = −0,961. Negatif: çıktı artarsa kayıp azalır.
- Çıktı katmanı: v₁ ve v₂’nin gradyanı, çıktı sinyalinin kendi girdileriyle (h₁, h₂) çarpımıdır: −0,365 ve −0,444. Bias c’ninki doğrudan −0,961. Üçü de negatif, yani üçünü de artırmak kaybı azaltır.
- Sinyal geriye akar: ∂L/∂h₁ = ∂L/∂ŷ · v₁ = −0,673; ∂L/∂h₂ = ∂L/∂ŷ · v₂ = +0,577. İşaret farkı önemli: v₂ negatif olduğu için h₂’yi artırmak çıktıyı azaltır ve kaybı büyütür.
- tanh’tan geçerken sinyal (1 − h²) ile çarpılır: ∂L/∂z₁ = −0,576, ∂L/∂z₂ = +0,454. Bu çarpan 0 ile 1 arasındadır; sinyal bu halkada küçülür.
- İlk katman: w₁₁ için −0,576, w₁₂ için −0,288, w₂₁ için +0,454, w₂₂ için +0,227. İkinci nöronun ağırlıklarının işareti pozitif: bunları azaltmak kaybı düşürür.
Gradyanlar elinde olduğuna göre bir adım at: parametreleri gradyanın tersine, öğrenme oranı kadar oynat. η = 0,1 ile kayıp 0,462’den 0,250’ye iner. η = 0,5 çok büyük: çıktı hedefi aşar (ŷ = 1,22) ama kayıp yine de düşer (0,025). Öğrenme oranının neden dikkatle seçildiğini optimizasyon yazısında göreceksin.
03Doğru mu hesapladık? Sayısal kontrol#
Zincir kuralını elle uygulamak hata yapmaya açıktır; bir çarpanı unutmak ya da işareti yanlış almak kolay. Bu yüzden geri geçiş yazanlar gradyan kontrolü denen bir test uygular: her parametreyi çok az (burada ±10⁻⁵) oynat, kaybın değişimini ölç ve geri yayılımın verdiği sayıyla karşılaştır. PyTorch’un gradcheck işlevi de bunu yapar: sayısal türevleri otomatik türevle karşılaştırır. Belgesine göre varsayılanları çift duyarlıklı girdiler için ayarlıdır ve düşük duyarlıkta ya da türevin tanımsız olduğu noktalarda sınama yanlış alarm verebilir. torch.autograd.gradcheck ↗ Demoda son aşamada tabloya bak: dokuz parametrenin hepsinde iki sütun aynı sayıyı veriyor; en büyük fark 10⁻¹⁰’dan küçük. Girdileri ve hedefi oynatsan da bu böyle kalıyor.
Bu kontrol aynı zamanda iki yöntemin maliyet farkını gösterir: geri yayılım bir ileri ve bir geri geçişle dokuz gradyanı birden verdi; sonlu fark yöntemi 18 ek ileri geçiş istedi. Parametre sayısı N olduğunda sonlu fark 2N ek geçiş ister; geri yayılımın geçiş sayısı ise N’e bağlı değildir. Bu yüzden sonlu fark yalnızca doğrulama için kullanılır, eğitim için değil.
04Bedeli: ara değerleri saklamak#
Geri geçişte ∂L/∂w₁₁ için v₁, h₁ ve x₁ gerekti. Bunlar ileri geçişte zaten hesaplanmış sayılardı; geri yayılım onları yeniden hesaplamak yerine saklar. d2l.ai’nin anlatımına göre bu ara değerler geri yayılım bitene kadar tutulmak zorundadır; eğitimin, yalnızca tahmin yapmaktan önemli ölçüde daha çok bellek istemesinin nedenlerinden biri de budur ve bellek ihtiyacı kabaca katman sayısıyla ve parti büyüklüğüyle artar.
Pratikte geri geçişi elle yazmayız. Derin öğrenme kütüphaneleri, ileri hesabı kaydedip türevleri otomatik türev ile üretir. Baydin ve arkadaşlarının tarama makalesi, otomatik türevi “geri yayılıma benzeyen ama ondan daha genel bir teknik ailesi” olarak tanımlar. Automatic differentiation in machine learning: a survey ↗ Bu yazıdaki 2-2-1 ağın geri geçişini elle yazabilmemizin nedeni, tam olarak “o kütüphanelerin içinde ne olduğunu” görmek.
05Aynı mekanizmayla öğrenmek: XOR#
Geri yayılım tek başına öğrenme değildir; yalnızca gradyanı verir. Öğrenme, bu gradyanla yapılan gradyan inişidir. Aşağıda aynı ağ, aynı başlangıç ağırlıklarıyla, dört noktalı XOR problemini öğreniyor: girdiler ±1, hedefler 0 ve 1 (iki girdinin işareti farklıysa 1). Her adımda dört örneğin gradyanı geri yayılımla bulunur, ortalaması alınır ve parametreler güncellenir.
Aynı geri geçiş, dört XOR noktasını öğreniyor
Bir öğrenme oranı seç ve adımı ilerlet. Başta dört tahmin de yanlış; geri yayılımla bulunan gradyanlar her adımda onları hedefe yaklaştırır.
Kırmızı çubuk hedef, mavi nokta ağın tahmini. Sağdaki sayı tahminin değeri.
0,364η 0,05: — · η 0,10: 178 · η 0,20: 90 · η 0,50: 37Hesabı gör
Her adımda dört örneğin gradyanı ayrı ayrı geri yayılımla bulunur, ortalaması alınır ve parametreler p ← p − η·g ile güncellenir. XOR’u doğrusal bir model çözemez: en iyi doğrusal model her yerde 0,5 tahmin eder ve kaybı 0,125’te kalır. Gizli katmanlı bu ağ ise kaybı sıfıra yaklaştırır.
Başlangıçta ortalama kayıp 0,364. Kayıp 0,01’in altına inene kadar gereken adım sayısı öğrenme oranına göre değişiyor: η = 0,05’te 353, 0,1’de 178, 0,2’de 90, 0,5’te 37 adım. Oran büyüdükçe ağ daha hızlı öğreniyor; bu küçük, düzgün problemde büyük oranlar da kararlı kalıyor. Gerçek ağlarda bu garanti değildir.
XOR özel bir örnektir: hiçbir doğrusal model dört noktayı birden öğrenemez. Doğrusal bir model için en iyi çözüm her yerde 0,5 tahmin etmektir ve ortalama kayıp 0,125’te kalır. Gizli katman, sorunu yeniden ifade ederek (bkz. sinir ağı yazısı) kaybı sıfıra yaklaştırır; geri yayılım da bu gizli katmanın ağırlıklarını ayarlayabilmeyi sağlayan şeydir.
06Zincir uzadıkça sinyal küçülür#
Geri yayılımda sinyal her katmanda yerel türevle çarpılır. tanh için bu türev 1 − h² ve en fazla 1’dir (z = 0’da). z = 1 olan bir nöronda 0,42’ye düşer. Sırf bu çarpan on katman boyunca tekrarlansa, sinyal 0,42¹⁰ ≈ 0,00017 katına iner. Bu hesap ağırlıkların çarpanını göz ardı eden yalnızca bir parçadır; gerçek ağlarda ağırlıklar da sinyali büyütebilir ya da küçültebilir. Ama yönü doğru gösterir: derin ağlarda gradyanın ilk katmanlara ulaşırken zayıflaması (kaybolan gradyan) ciddi bir sorundur. Artık bağlantılar ve normalizasyonun bunu nasıl hafiflettiğini normalizasyon yazısında deneyle göreceksin.
Şimdi bu ağları kelimelere uygulayan mimariye geç: Transformer Mimarisi Nasıl Çalışır?
Bu yazıyı bitirdiğinde:
- Geri yayılımın, zincir kuralını çıktıdan girdiye doğru uygulamak olduğunu küçük bir örnekle anlatabilirsin.
- Her parametreyi tek tek oynatmak yerine tek bir geri geçişin neden yeterli olduğunu ve bunun bedelini söyleyebilirsin.
- Hesaplanan bir gradyanın doğruluğunun sayısal farkla nasıl kontrol edildiğini açıklayabilirsin.
Cümlelerden birini kendi sözlerinle anlatamıyorsan, ilgili bölüme dön ve demoyu yeniden dene.
Dizi modelleri: tekrarlı ağlardan Transformer’a
Orta · 10 dk okuma