flowchart TB
A["İki fonksiyon: g, h"] --> T["Toplam: g + h<br/>(g' + h')"]
A --> C["Çarpım: g · h<br/>(g·h' + h·g')"]
A --> B["Bileşke: g(h(x))<br/>(g'(h)·h')"]
T -.->|"residual: 1 + f'"| R["Gradient highway<br/>(ResNet)"]
C -.->|"kapı, attention"| K["Gate / Attention<br/>(LSTM, Transformer)"]
B -.->|"katman zinciri"| BP["🔥 Backprop<br/>(reverse-mode autodiff)"]
style B fill:#fce4ec,stroke:#c2185b,stroke-width:2px
style BP fill:#fff3e0,stroke:#f57c00,stroke-width:3px
5 Zincir Kuralı ve Çarpım Kuralı
Toplam + çarpım + bileşke — backprop’un matematiksel kalbi
- Grant’ın videosu: YouTube — Chapter 4: Visualizing the chain rule and product rule (≈16 dk)
- Kaynak: 3Blue1Brown — Essence of Calculus
- Okuma süresi: ≈24 dk
5.1 Bu Derste Ne Var?
Ders 3’te tek tek fonksiyonların (\(x^2\), \(x^3\), \(1/x\), \(\sin\)) türevlerini öğrendik. Ama gerçek dünyayı modelleyen fonksiyonlar genelde bunların bir karışımıdır. Bu derste fonksiyonları birleştirmenin üç temel yolunu ve her birinin türev kuralını — yine küçük dürtmelerle, geometrik olarak — görüyoruz. En önemlisi zincir kuralı: makine öğrenmesindeki backprop’un tam kalbi.
Üç ana fikir:
- Toplam kuralı: \(d(g + h) = g' + h'\) (en kolayı).
- Çarpım kuralı: \(d(g \cdot h) = g \cdot h' + h \cdot g'\) (ayarlanabilir kutunun alanı).
- Zincir kuralı: \(d(g(h(x))) = g'(h(x)) \cdot h'(x)\) (üç sayı doğrusu; dış türev çarpı iç türev).
“these are natural patterns, things that you too could have discovered just by patiently thinking through what a derivative actually means.” — Grant, 15:31
- Zincir kuralı = backprop. Bir sinir ağı = iç içe fonksiyonlar (katmanlar); gradyan, zincir kuralıyla çıkıştan girdiye doğru geriye akar. Bu dersin en kritik ML bağlantısı — derin öğrenme bu kural üzerine kuruludur.
- Toplam kuralı → çoklu kayıpların (multi-task loss = \(\sum L_i\)) gradyanı toplanır; residual bağlantı \(d(x + f(x)) = 1 + f'\) — “gradient highway” (ResNet’in derin ağları eğitebilmesinin nedeni).
- Çarpım kuralı → kapı (gate) mekanizmaları (LSTM/GRU’da \(h \cdot g\)), attention’ın ağırlıklı toplamı, element-wise çarpım gradyanları.
- “Katmanları soy” → computational graph: her düğüm bir primitif işlem; autodiff bu grafi ters yönde gezerek gradyanı toplar.
- \(dh\)’lerin sadeleşmesi → reverse-mode autodiff: ara türevler (Jacobian’lar) çarpılarak zincirlenir; “sadece notasyon hilesi değil”, küçük dürtmelerin gerçek aktarımı.
5.2 Üç Birleştirme Yolu: Topla, Çarp, Bileşke
Türevini bildiğimiz basit fonksiyonlardan karmaşık fonksiyonlar kurmanın aslında yalnızca üç temel yolu vardır:
- Toplama: \(g(x) + h(x)\)
- Çarpma: \(g(x) \cdot h(x)\)
- Bileşke (composition): birini diğerinin içine koymak, \(g(h(x))\)
Çıkarma aslında “ikinciyi \(-1\) ile çarpıp toplamak”tır; bölme ise “\(1/x\) ile bileşke alıp çarpmak”. Yani ne kadar canavarsı görünürse görünsün, karşılaştığın fonksiyonların çoğu bu üç birleştirmenin katman katman istiflenmesidir. Türevin bu üç türle nasıl oynadığını bilirsen, en karmaşık ifadeyi bile adım adım katmanlarını soyarak türetebilirsin.
“Karmaşık bir ifadeyi üç temel birleştirmeye ayırıp katman katman soymak”, bir computational graph’ın tanımıdır. PyTorch/JAX bir modeli tam olarak böyle temsil eder: her düğüm bir toplama, çarpma veya bir primitif fonksiyon (exp, sin, matmul); autodiff bu grafi kurar, sonra zincir + çarpım + toplam kurallarını mekanik olarak uygular. Yani bu üç kural, tüm otomatik türevin tam kümesidir — başka kurala gerek yok.
5.3 Toplam Kuralı: \(d(g + h) = g' + h'\)
En kolayı: iki fonksiyonun toplamının türevi, türevlerinin toplamıdır. Yine de küçük dürtmelerle düşünmeye değer, çünkü çarpım ve bileşke o kadar düz olmayacak.
Örnek: \(f(x) = \sin(x) + x^2\). Her girdide \(\sin(x)\) ile \(x^2\)’nin değerlerini toplarsın.
Girdiyi \(dx\) kadar ittiğinde, toplam yükseklikteki değişim \(df\), \(\sin\) grafiğindeki değişim ile \(x^2\) grafiğindeki değişimin toplamıdır:
\[ df = d(\sin x) + d(x^2) \approx (\cos x \cdot dx) + (2x \cdot dx) \]
\(dx\)’e bölersek:
\[ \frac{d}{dx}\left(\sin x + x^2\right) = \cos x + 2x \]
Toplam kuralı ML’de iki yerde her gün karşına çıkar. Birincisi çoklu kayıp: toplam kayıp \(L = L_1 + L_2 + \ldots\) ise gradyan da \(\nabla L = \nabla L_1 + \nabla L_2 + \ldots\) — her terimi ayrı geri yayıp toplarsın. İkincisi residual bağlantı: \(d/dx (x + f(x)) = 1 + f'(x)\). Buradaki “\(+1\)”, gradyanın kimlik yoluyla hiç sönmeden geçebildiği bir “gradient highway” yaratır; ResNet’lerin çok derin ağları eğitebilmesinin matematiksel nedeni budur.
5.4 Çarpım Kuralı: Ayarlanabilir Kutu
Çarpım için grafik değil, alan en iyi görseldir. \(f(x) = \sin(x) \cdot x^2\)’yi, kenarları \(\sin(x)\) ve \(x^2\) olan bir kutunun alanı olarak düşün. Bu kenarlar \(x\) ile değişir: \(x\)’i 0’dan artırınca üst kenar (\(\sin x\)) önce 1’e kadar büyür, sonra azalır; yan kenar (\(x^2\)) sürekli büyür. \(f(x)\), bu kutunun alanıdır.
\(x\)’i \(dx\) kadar ittiğinde alan nasıl değişir? Üç yeni parça belirir: alttaki ince dikdörtgen (genişliği \(\sin x\), yüksekliği \(d(x^2)\)), sağdaki ince dikdörtgen (yüksekliği \(x^2\), genişliği \(d(\sin x)\)) ve köşedeki minik parça — son ikisinin çarpımı \((dx)^2\) ile orantılı olduğundan ihmal edilir.
\(d(x^2) \approx 2x \cdot dx\) ve \(d(\sin x) \approx \cos x \cdot dx\) koyup \(dx\)’e bölersek:
\[ \frac{d}{dx}\left(\sin x \cdot x^2\right) = \sin x \cdot 2x + x^2 \cdot \cos x \]
Burada \(\sin\) ve \(x^2\)’ye özgü hiçbir şey yok; aynı muhakeme herhangi iki \(g\) ve \(h\) için geçerli:
\[ (g \cdot h)' = g \cdot h' + h \cdot g' \]
Akılda tutma tekerlemesi: “sol d sağ + sağ d sol” — sol fonksiyon çarpı sağın türevi, artı sağ fonksiyon çarpı solun türevi.
Çarpım kuralı, iki sinyalin çarpıldığı her yerde devrededir. Kapı (gate) mekanizmaları: LSTM/GRU’da “unut kapısı çarpı hücre durumu” (\(g \cdot h\)) biçiminde; geri yayılımda her iki faktöre de gradyan akar (\(g \cdot h' + h \cdot g'\)). Attention da bir ağırlık (softmax çıktısı) çarpı değer toplamıdır; ağırlık ve değerin ikisi de öğrenilir, ikisine de çarpım kuralıyla gradyan gider.
5.5 Zincir Kuralı: Üç Sayı Doğrusu
Üçüncü ve ML’de en sık karşımıza çıkan birleştirme: birini diğerinin içine koymak (bileşke). Örneğin \(x^2\)’yi \(\sin\)’in içine sokup \(\sin(x^2)\) elde et. Türevi ne?
Bunu görselleştirmek için üç sayı doğrusu kullanalım: birincisi \(x\) değerini, ikincisi \(x^2\) değerini, üçüncüsü \(\sin(x^2)\) değerini tutsun. \(x^2\) fonksiyonu seni 1. doğrudan 2.’ye, \(\sin\) fonksiyonu 2.’den 3.’ye taşır.
\(x\)’i 3’e götürürsen 2. değer 9’a, 3. değer \(\sin(9)\)’a sabitlenir. Türev için \(x\)’i \(dx\) kadar dürt. Ortadaki değerin değişimi (\(x^2\)’nin değişimi) \(d(x^2)\)’dir; buna kısaca \(dh\) diyelim (\(h = x^2\)). O zaman alttaki değer \(\sin(h)\)’nin değişimi, \(d(\sin h) = \cos(h) \cdot dh\) olur (\(\sin\)’in türevi \(\cos\) olduğundan). Şimdi katmanları geri açalım: \(h\) yerine \(x^2\) koy, \(dh\) yerine \(2x \cdot dx\) koy:
\[ \frac{d}{dx}\,\sin(x^2) = \cos(x^2) \cdot 2x \]
Dikkat: dış fonksiyonun türevi, hâlâ değiştirilmemiş iç fonksiyona uygulanıyor (\(\cos(x^2)\), \(\cos(x)\) değil), sonra iç fonksiyonun türeviyle (\(2x\)) çarpılıyor. \(\sin\) ve \(x^2\)’ye özgü bir şey yok; herhangi iki \(g, h\) için:
\[ \frac{d}{dx}\,g(h(x)) = g'(h(x)) \cdot h'(x) \]
Buna zincir kuralı denir. Leibniz gösterimiyle:
\[ \frac{dg}{dx} = \frac{dg}{dh} \cdot \frac{dh}{dx} \]
“this pattern right here is what we usually call the chain rule.” — Grant, 12:49
Zincir kuralı tek bir bileşke için “dış türev × iç türev”dir. Derin ağda bu, onlarca katman boyunca tekrarlanır — ve işte tam burada backprop doğar (sonraki bölüm). \(dg/dh\) notasyonu, gradyanın “hangi ara değere göre” alındığını izlemek demektir; reverse-mode autodiff’te bu ara değerler (aktivasyonlar) ileri geçişte saklanır, geri geçişte kullanılır.
5.6 Zincir Kuralı = Backprop’un Kalbi
Grant’ın altını çizdiği incelik: \(dg/dx = (dg/dh) \cdot (dh/dx)\) ifadesinde \(dh\)’ler sadeleşir — ve bu sadece bir notasyon hilesi değil, küçük dürtmelerin gerçekten nasıl aktarıldığının yansımasıdır. Üçüncü doğrudaki dürtme, ikinci doğrudaki dürtme üzerinden, o da birinci doğrudaki dürtme (\(dx\)) üzerinden meydana geldi.
“that cancellation of dh is not just a notational trick, that is a genuine reflection of what’s going on with the tiny nudges.” — Grant, 14:14
Bir sinir ağı tam olarak iç içe fonksiyonlardan oluşur: girdi \(x\), ağırlıklar \(w\), katmanlar \(a_1, a_2, \ldots, a_n\) ve en sonda kayıp \(L\).
flowchart LR
X[x, w] --> A1[a₁ = f₁]
A1 --> A2[a₂ = f₂]
A2 --> A3[…]
A3 --> An[aₙ]
An --> L[Kayıp L]
L -.dL/daₙ.-> An
An -.daₙ/daₙ₋₁.-> A3
A3 -.…\.-> A2
A2 -.da₂/da₁.-> A1
A1 -.da₁/dw.-> X
style L fill:#fce4ec,stroke:#c2185b,stroke-width:2px
style X fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
Bir ağırlığın kaybı nasıl etkilediğini bulmak için zincir kuralını tüm katmanlar boyunca uygularsın:
\[ \frac{dL}{dw} = \frac{dL}{da_n} \cdot \frac{da_n}{da_{n-1}} \cdots \frac{da_1}{dw} \]
Her çarpan, bir katmanın yerel türevidir (çok değişkenli hâlinde bir Jacobian). Backpropagation, bu çarpımı çıktıdan (\(L\)) girdiye doğru, sağdan sola hesaplar; ara sonuçları yeniden kullanır, bu yüzden milyonlarca parametrenin gradyanını tek bir geri geçişte verimli çıkarır. Yani Grant’ın “\(dh\) sadeleşmesi”, derin öğrenmenin tüm eğitim mekanizmasının çekirdeğidir.
Neden “ileri” değil de “geri”? Çarpımı soldan (\(dL/da_n\)’den) başlatmak, her adımda bir vektör-Jacobian çarpımı yapmana izin verir — bu, tam Jacobian matrislerini kurmaktan çok daha ucuzdur (reverse-mode autodiff). Skaler bir kayıptan milyonlarca parametreye gradyan akıtmak istediğinde geri mod kazanır; tersi durumda (tek girdiden çok çıktıya) ileri mod. Modern derin öğrenme çerçeveleri ikisini de yapar ama eğitim neredeyse hep reverse-mode’dur.
5.7 Katmanları Soymak: Bileşik İfadeler
Üç kuralı (toplam, çarpım, zincir) elinde tutunca, ne kadar canavarsı olursa olsun her ifadeyi adım adım soyabilirsin. Örneğin \(f(x) = \sin(x^2) \cdot \cos(x)\). En dıştaki yapı bir çarpım (\(\sin(x^2)\) çarpı \(\cos x\)), o yüzden önce çarpım kuralı:
\[ f' = \sin(x^2) \cdot \frac{d(\cos x)}{dx} + \cos x \cdot \frac{d(\sin(x^2))}{dx} \]
Şimdi parçaları doldur: \(d(\cos x)/dx = -\sin x\) (basit kural), ve \(d(\sin(x^2))/dx\) zincir kuralıyla \(\cos(x^2) \cdot 2x\). Birleştirince:
\[ \frac{d}{dx}\left(\sin(x^2) \cdot \cos x\right) = \sin(x^2) \cdot (-\sin x) + \cos x \cdot \cos(x^2) \cdot 2x \]
İşin yöntemi bu: en dış birleştirmeyi tanı, ilgili kuralı uygula, ortaya çıkan alt-türevleri aynı yöntemle çöz.
“En dıştan başla, içe doğru soy” stratejisi, reverse-mode autodiff’in computational graph’ı geriye gezme sırasının ta kendisidir. Bir framework \(f(x) = \sin(x^2) \cdot \cos(x)\)’i bir grafa çevirir (çarpım düğümü, içinde \(\sin \circ\) kare ve \(\cos\) dalları), ileri geçişte değerleri saklar, geri geçişte her düğümde yerel türevi uygular ve zincirler. Sen elle yaptığında yorulursun; framework bunu hatasız ve milyonlarca parametre için yapar.
5.8 Bu Dersin Özeti
- Fonksiyonları birleştirmenin üç temel yolu: toplam, çarpım, bileşke. (Çıkarma ve bölme bunlardan türer.)
- Toplam kuralı: \(d(g + h) = g' + h'\). Yükseklikleri istiflersin, değişimler toplanır.
- Çarpım kuralı: \(d(g \cdot h) = g \cdot h' + h \cdot g'\). Ayarlanabilir kutunun iki ince dikdörtgeni; “sol d sağ + sağ d sol”.
- Zincir kuralı: \(d(g(h(x))) = g'(h(x)) \cdot h'(x)\). Dış fonksiyonun türevi (değiştirilmemiş iç fonksiyonda) çarpı iç fonksiyonun türevi.
- Leibniz gösteriminde \(dg/dx = (dg/dh) \cdot (dh/dx)\) — \(dh\)’ler sadeleşir; bu, dürtmelerin gerçek aktarımının yansımasıdır.
- Zincir kuralı tüm katmanlar boyunca uygulanınca backprop olur: gradyan, kayıptan girdiye doğru geriye akar.
- Karmaşık bir ifadeyi, en dış birleştirmeden başlayıp katman katman soyarak türetirsin; akıcılık pratik gerektirir.
Toplam, çarpım ve zincir kuralları küçük dürtmelerden doğal olarak çıkar; bunların en derini olan zincir kuralı (dış türev × iç türev), iç içe fonksiyonlardan oluşan bir sinir ağında gradyanı geriye akıtan backprop’un ta kendisidir.
5.9 Kontrol Soruları
Cevap: Toplam kuralıyla terimleri ayrı ayrı türevle: \(d(x^3)/dx = 3x^2\), \(d(\cos x)/dx = -\sin x\). Toplam: \(3x^2 - \sin x\). Toplam kuralı her terimi bağımsız ele almanı sağlar.
Cevap: “Sol d sağ + sağ d sol”: \(x^2 \cdot (\sin x)' + \sin x \cdot (x^2)' = x^2 \cdot \cos x + \sin x \cdot 2x = x^2 \cos x + 2x \sin x\). Ayarlanabilir kutuda alttaki ve sağdaki ince dikdörtgenlerin alanları.
Cevap: Dış fonksiyon \(\cos\) (türevi \(-\sin\)), iç fonksiyon \(x^3\) (türevi \(3x^2\)). Zincir kuralı: dış türev (değiştirilmemiş içte) × iç türev = \(-\sin(x^3) \cdot 3x^2\). Yaygın hata, iç türevle (\(3x^2\)) çarpmayı unutmaktır.
Cevap: Zincir kuralı: \(dL/dw = (dL/da_2) \cdot (da_2/dw)\). \(dL/da_2 = 2a_2\); \(da_2/dw = a_1 = x\). Yani \(dL/dw = 2a_2 \cdot x = 2(wx) \cdot x = 2wx^2\). Backprop bu çarpımı sağdan sola hesaplar: önce \(dL/da_2 = 2a_2\) (ileri geçişte saklanan \(a_2\) ile), sonra yerel türev \(x\) ile çarpar. Gerçek ağlarda her katman böyle bir yerel türev ekler ve zincir uzar.
5.10 Egzersizler
Egzersiz 1. \(d/dx [3x^2 + 5\sin x - 1/x]\) türevini bul (toplam + sabit katsayı + \(1/x\) kuralı birlikte).
Egzersiz 2. \(d/dx [x^3 \cdot \cos x]\) türevini çarpım kuralıyla bul; “sol d sağ + sağ d sol” tekerlemesini uygula.
Egzersiz 3. \(d/dx [\sin(\cos x)]\) türevini zincir kuralıyla bul. (İki katlı bileşke: dış \(\sin\), iç \(\cos\).)
Egzersiz 4. (Python — sembolik doğrulama) \(\sin(x^2) \cdot \cos(x)\) türevini SymPy ile al; elle bulduğun (bölüm 6’daki) sonuçla karşılaştır.
Egzersiz 5. (Sonraki dersin habercisi) \(e^x\) fonksiyonu çok özeldir: türevi kendisidir, \(d(e^x)/dx = e^x\). Bunu zincir kuralıyla birleştir: \(d(e^{3x})/dx\) nedir? Ya da \(d(e^{x^2})/dx\)? Ders 5, \(e\) sayısının neden bu kadar özel olduğunu anlatacak.
5.11 Anahtar Kavramlar (Cheat Sheet)
| Kavram | Tanım | Grant’ta |
|---|---|---|
| Toplam kuralı | \(d(g + h) = g' + h'\); değişimler istiflenir | 1m49 |
| Çarpım kuralı | \(d(g \cdot h) = g \cdot h' + h \cdot g'\) (“sol d sağ + sağ d sol”) | 4m13 |
| Ayarlanabilir kutu | Çarpım = alan; iki ince dikdörtgen (köşe atılır) | 4m54 |
| Sabit katsayı | \(d(c \cdot f) = c \cdot f'\); sabit dışarı çıkar | 8m21 |
| Zincir kuralı | \(d(g(h(x))) = g'(h(x)) \cdot h'(x)\); dış türev × iç türev | 12m49 |
| Üç sayı doğrusu | Bileşkeyi katmanlı görselleştirme (\(x \to h \to g\)) | 9m13 |
| \(dh\) sadeleşmesi | \(dg/dx = (dg/dh)(dh/dx)\); dürtmenin gerçek aktarımı | 14m14 |
| Katmanları soymak | Karmaşık ifade = üç kuralın istiflenmesi | 1m28 |
5.12 ML Bağlantıları Özeti
- Zincir kuralı → backprop: gradyan kayıptan girdiye geriye akar; reverse-mode autodiff bu çarpımı sağdan sola yapar. Bu dersin en kritik bağlantısı.
- Toplam kuralı → multi-task loss gradyanı toplanır (\(\nabla \sum L_i = \sum \nabla L_i\)); residual \(d(x+f(x)) = 1+f'\) → gradient highway (ResNet).
- Çarpım kuralı → kapı mekanizmaları (LSTM/GRU), attention’ın ağırlık × değer toplamı, element-wise çarpım gradyanları.
- Sabit katsayı → gradyan ölçekleme; learning rate, gradyanı sabitle çarpar.
- Üç kural = tam autodiff kümesi → bir computational graph (toplam, çarpım, primitif düğümler) her modeli temsil eder; başka kurala gerek yok.
- \(dh\) sadeleşmesi → ara aktivasyonlar ileri geçişte saklanır, geri geçişte yerel türevlerle çarpılır.
- Reverse vs forward mode → tek skaler kayıptan milyonlarca parametreye gradyan: reverse mode (backprop) kazanır; tersi durumda forward mode.
Karmaşık türevler ezber değil — üç doğal kuralla (topla, çarp, bileşke) her ifadenin katmanlarını soyarsın. Bunların en derini zincir kuralıdır: dış türev çarpı iç türev. Onu üst üste binmiş katmanlara uyguladığında elde ettiğin şey backprop’tur — derin öğrenmenin tüm öğrenme motoru.