3  Gradient Descent, Backprop ve Yapay Sinir Ağları

NYU’nun iki hocalı ritmi: LeCun cebirle ‘eğitmek = bir kaybı gradient descent ile küçültmek, gradient’i backprop = zincir kuralı hesaplar’ der, Canziani geometriyle ‘ağ döndür-ez dizisidir’ diye gösterip Hafta 1’in spiral ağını gerçekten eğitir

NotBölüm bilgisi

3.1 Bu Derste Ne Var?

Hafta 1’de bir ağ kurduk ama eğitmedik — spiral noktaları hâlâ ayrılmamıştı. Bu hafta ağa nasıl öğretileceğini görüyoruz. Yine iki hocalı: önce Yann LeCun (Lecture) öğrenmenin motorunu — gradient descent ve backpropagation’ı — teorik olarak kurar; sonra Alfredo Canziani (Practicum) bunu PyTorch’ta uygular ve Hafta 1’in spiral ağını gerçekten eğitir.

LeCun’un büyük fikri tek cümlede: bir sinir ağı, modüllerin (her biri girdi → çıktı hesaplayan bir kutu) bir zinciridir; eğitmek, bir kayıp (loss) fonksiyonunu gradient descent ile küçültmektir; ve gradient’i hesaplamanın yolu backpropagation = zincir kuralının modüllere uygulanmasıdır. Canziani ise bir ağın aslında “döndür-ez” (rotation–squashing) dizisi olduğunu gösterir, sınıflandırma için doğru kaybın cross-entropy olduğunu açıklar ve eğitim döngüsünü koda döker.

Bu haftanın üç ana fikri:

  1. Eğitim = bir kaybı gradient descent ile küçültmek. Ağ rastgele başlar; kayıp, tahmin ile gerçek arasındaki farktır.
  2. Backpropagation = zincir kuralı. Gradient, çıktıdan girişe doğru Jacobian matrisleriyle çarpılarak taşınır; daha fazlası değil.
  3. Sınıflandırmanın kaybı cross-entropy’dir (−log softmax), regresyonunki MSE.

flowchart TB
    subgraph Dongu["Eğitim döngüsü (her adımda tekrar)"]
        direction LR
        Forward["forward (ileri geçiş):<br/>x → ŷ"]
        Loss["kayıp (cross-entropy):<br/>ŷ ile y karşılaştır"]
        Backward["backward (Jacobian zinciri):<br/>∂C çıktıdan girişe"]
        Step["step:<br/>parametreyi güncelle (θ ← θ − η∇L)"]
        Forward --> Loss --> Backward --> Step
        Step -- "tekrar" --> Forward
    end

    Dongu --> LeCun["LeCun (teori):<br/>modül + Jacobian zinciri"]
    Dongu --> Canziani["Canziani (pratik):<br/>döndür-ez + cross-entropy"]

İpucuBuilder Notu — Hafta 1’i Eğitmek: İki Yön

Geriye (önkoşul kurslar):

  • Backprop = zincir kuralı → Phase 1 Calculus Ders 4 (zincir kuralı) + Karpathy micrograd (autograd’ı sıfırdan kurar — LeCun’un “module + Jacobian” çerçevesinin kod hâli).
  • Cross-entropy = −log olabilirlik → Stat 110 Bernoulli/NLL + Phase 1 DL Ders 1 cross-entropy.
  • Gradient descent → Phase 1 Calculus türev (Ders 2) + 18.06 gradient/Jacobian (matris dili).

İleriye (production / research):

  • LeCun’un “module + Jacobian” çerçevesi tam olarak PyTorch autograd’ın iç mantığıdır (loss.backward()); ileride torch.autograd, gradient checkpointing.
  • SGD’nin “noisy ama ucuz” doğası → modern büyük-ölçek eğitimin (mini-batch, gradient accumulation, DDP) temelidir.

Tek cümleyle: Bir ağı eğitmek, bir kaybı gradient descent ile küçültmektir; gradient’i de backpropagation — yani zincir kuralının modül-modül, Jacobian çarpımlarıyla uygulanması — hesaplar.

3.2 (LeCun) Modüller ve Maliyet Fonksiyonu

LeCun derse modüler bakışla başlıyor: bir sinir ağı, birbirine bağlı modüllerden kuruludur. İki tür modül var:

  1. Fonksiyonel modüller — girdiyi çıktıya çeviren işlemler (linear, ReLU, …). LeCun bunları “mavi yuvarlak” kutular olarak çizer.
  2. Maliyet (cost) modülleri — ağın en tepesine konur; tahmin \(\hat{Y}\) ile gerçek \(Y\)’yi karşılaştırıp tek bir sayı (kayıp) üretir.

“the C function compares Y and Y bar [Ŷ]… loss functions are things that we minimize.” — LeCun, 1:43

Yani eğitim, bu maliyet modülünün çıktısını (kaybı) olabildiğince küçültmektir. Ağ rastgele başlatıldığından ilk tahminler kötüdür; kayıp büyüktür. Amaç, parametreleri kaybı düşürecek yönde ayarlamaktır. Bu modüler kurgu kursun geri kalanının da omurgasıdır: her yeni mimari (CNN, RNN, transformer), aynı “modülleri bağla, tepeye maliyet koy, eğit” iskeletine oturur.

İpucuBuilder Notu — Her Şey Modül

Geriye (Karpathy): “Her şey modül” görüşü, Karpathy’nin micrograd’daki Value nesnesiyle birebir: her işlem bir düğüm, her düğüm ileri (forward) hesaplar ve geri (backward) gradient taşır. LeCun cebirle, Karpathy kodla aynı soyutlamayı kurar.

İleriye: Modüler tasarım, PyTorch’un nn.Module API’sinin felsefesidir: karmaşık modeller küçük, yeniden kullanılabilir, türevlenebilir bloklardan kurulur.

3.3 (LeCun) Loss ve Gradient-Tabanlı Öğrenme

Kaybı nasıl küçültürüz? Gradient-tabanlı yöntemlerle. Gradient, kaybın her parametreye göre değişim yönünü söyler; biz kaybı azaltmak için gradient’in ters yönünde küçük adımlar atarız. LeCun bunu dağ benzetmesiyle anlatıyor: sisli bir dağda en dik iniş yönünü bulup o yönde küçük bir adım atmak gibi — tüm manzarayı göremezsin, ama ayağının altındaki eğimi bilirsin.

“gradient descent is like being in the mountain… you compute the gradient and take a small step downhill.” — LeCun, 10:27

Şekil 3.1 bu “dağdan iniş” sezgisini somutlaştırır: yüksek-kayıp başlangıcından, kaybın ters yönünde küçük adımlarla vadinin dibine (minimuma) inilir.

Şekil 3.1: Eğik bir kayıp vadisi üzerinde gradient descent yörüngesi: parametreler yüksek-kayıp başlangıcından kaybın ters yönünde küçük adımlarla vadinin dibine (minimuma) iner — LeCun’un ‘dağdan iniş’ benzetmesi.

Bir uyarı: öğrenme neredeyse her zaman gradient-tabanlı optimizasyondur, ama kayıp yüzeyi non-convex olduğundan (Hafta 1, “nobody understands”) yakınsama garantisi yoktur — yine de pratikte çalışır. LeCun ayrıca türevlenemeyen durumlar için bir trick’ten söz eder: maliyet modülünü türevlenebilir bir modülle yaklaşık temsil edip yine backprop kullanmak.

İpucuBuilder Notu — Dağda İniş (Gradient)

Geriye (Calculus): Gradient = çok değişkenli türev; gradient’in negatifi en dik iniş yönüdür (Phase 1 Calculus Ders 6). “Küçük adım” \(\eta\) ile ölçeklenir — learning rate.

İleriye: Gradient-tabanlı optimizasyon tüm derin öğrenmenin motorudur; adımın nasıl atılacağı (Adam, momentum, normalization) Hafta 4’ün konusu.

3.4 (LeCun) SGD: “Descent Değil, Optimization”

Tam gradient’i tüm veri üzerinde hesaplamak pahalıdır. Stokastik gradient descent (SGD) gradient’i tek bir (veya küçük bir batch) örnek üzerinde tahmin eder — çok daha hızlı, ama gürültülü. LeCun’un meşhur düzeltmesi:

“it shouldn’t be called stochastic gradient descent, because it’s not actually a descent algorithm — it should be called stochastic gradient optimization. It’s very noisy.” — LeCun, 17:10

Güncelleme kuralı: parametreyi, örnek-başına kaybın gradient’inin \(\eta\) katı kadar geri al:

\[ \theta \leftarrow \theta - \eta\, \nabla_\theta \mathcal{L}(\theta) \]

Gürültü kötü değildir: sığ yerel minimumlardan kaçmaya yardım eder ve aynı bütçeyle çok daha sık güncelleme demektir. Tam-batch gradient her adımda “doğru” yönü verir ama bir adım için tüm veriyi tarar; SGD “yaklaşık doğru” yönü verir ama saniyede yüzlerce adım atar — pratikte ikincisi kazanır. Şekil 3.2 üç rejimi tek eksende karşılaştırır.

Şekil 3.2: Tek eksende üç kayıp eğrisi: tam-batch düz inerken, mini-batch ve saf SGD aynı dibe iner ama artan gürültüyle — gürültü, ucuz güncellemelerin bedelidir, bir kusur değil.

Üç uç noktayı karşılaştırmak aydınlatıcı:

  • Tam-batch (full-batch): gradient’i tüm N örnek üzerinde hesapla. En doğru yön, ama bir tek güncelleme için tüm veriyi taradığından devasa veride imkânsız.
  • Tek örnek (saf SGD): gradient’i tek bir rastgele örnek üzerinde hesapla. Çok hızlı ama çok gürültülü — yön çoğu zaman yanlış, ama ortalamada doğru.
  • Mini-batch (pratik standart): gradient’i B örnekten (örn. 32, 64) oluşan bir batch üzerinde hesapla. Hız ile gürültü arasında ayarlanabilir denge. Modern donanım (GPU) zaten matris işlemlerini paralel yaptığından, mini-batch hem hızlı hem makul doğrudur.

Önemli nokta: gürültü “kusur” değil, bir özelliktir — non-convex bir yüzeyde stokastik dürtmeler, deterministik gradient descent’in takılacağı sığ çukurlardan modeli kurtarabilir.

İpucuBuilder Notu — SGD: Gürültü Bir Özellik

Geriye (Stat 110): Mini-batch gradient’i, gerçek gradient’in tarafsız tahmincisidir (örneklem ortalaması, Stat 110 Monte Carlo); varyans batch boyutuyla azalır (\(\propto 1/B\)).

İleriye: SGD’nin ucuzluğu, milyar-parametreli modelleri eğitilebilir kılar; batch size ↔︎ throughput dengesi, gradient accumulation ve dağıtık eğitimin (DDP) çekirdeğidir.

3.5 (LeCun) Backpropagation = Zincir Kuralı (Twiddling Sezgisi)

Gradient descent’in kalbi \(\partial C/\partial \theta\) terimiydi — ama onu nasıl hesaplarız? Cevap backpropagation, ve LeCun’un üstüne basa basa söylediği şey: bu, zincir kuralından (chain rule) başka bir şey değildir.

“we’re going to use chain rule — chain rule, if you remember from kindergarten…” — LeCun, 27:36

LeCun zincir kuralını “twiddling” (azıcık oynatma) sezgisiyle yeniden türetiyor: bir nonlinearite \(z = h(s)\) düşün. Girdiyi azıcık (\(ds\) kadar) oynatırsan, çıktı \(dz = ds \cdot h'(s)\) kadar değişir. Bu da kaybı \(dC = dz \cdot (\partial C/\partial z)\) kadar değiştirir. İkisini birleştirip \(ds\)’yi sadeleştirince:

\[ \frac{\partial C}{\partial s} = \frac{\partial C}{\partial z}\, h'(s) \]

Yani biri sana kaybın \(z\)’ye göre türevini verirse, sen onu nonlinearitenin türeviyle çarpıp kaybın \(s\)’ye göre türevini elde edersin. Bir zincir boyunca bunu tekrarlarsın: gradyan’ı çıktıdan girişe, her \(h\) fonksiyonunun türeviyle çarparak taşırsın. LeCun yarı şaka der ki tüm yaptığı zincir kuralını yeniden türetmektir:

“I’ve done nothing more than rederiving chain rule. But it’s a little more intuitive if you think of it in terms of twiddling things around.” — LeCun, 32:01

Somut örnek. Diyelim \(s = 2\), \(h = \tanh\), ve kaybın çıktıya göre türevi \(\partial C/\partial z = 0{,}5\) olarak yukarıdan geldi. tanh’ın türevi \(h'(s) = 1 - \tanh^2(s)\); \(\tanh(2) \approx 0{,}964\) olduğundan \(h'(2) \approx 1 - 0{,}929 = 0{,}071\). O hâlde \(\partial C/\partial s = (\partial C/\partial z) \cdot h'(s) = 0{,}5 \times 0{,}071 \approx 0{,}036\). Yani yukarıdan gelen \(0{,}5\)’lik gradyan, doygun (saturated) tanh’tan geçince \(0{,}036\)’ya küçülür — bu, derin ağlarda vanishing gradient’in mikro-kökenidir (Hafta 4’te normalization/init bunu çözer). Şekil 3.3 bu somut çarpımı tanh eğrisi ve yerel türevi üzerinde gösterir; backprop böyle, modülden modüle yerel türevi çarparak ilerler.

Şekil 3.3: tanh(s) aktivasyonu ve yerel türevi h’(s)=1−tanh²(s); s=2 noktasında zincir kuralı somut çarpımı (∂C/∂z=0,5 × h’(2)≈0,071 = 0,036) doygun bölgede gradyanın nasıl küçüldüğünü — vanishing gradient’in mikro-kökenini — gösterir.
İpucuBuilder Notu — Twiddling = Zincir Kuralı

Geriye (Calculus + Karpathy): Bu doğrudan Phase 1 Calculus Ders 4 zincir kuralıdır; “twiddling” = türevin “küçük dürtme \(dx\)” tanımı. Karpathy micrograd’da her düğümün _backward kapanışı tam olarak bu yerel türevi (\(h'(s)\)) saklar ve tersten çağırır (reverse-mode autodiff).

İleriye: PyTorch’ta loss.backward() bu zinciri otomatik yürütür; çok derin ağlarda zincirin uzaması vanishing/exploding gradient’e yol açar (Hafta 3-4 normalization/init).

3.6 (LeCun) Lineer Modülün Backprop’u: Ağırlıkları Tersten Kullanmak

Nonlinearite modülünü gördük; ikinci tür lineer modüldür. Burada bir \(z\) değişkeni, ağırlıklarıyla çarpılarak birden çok \(s\) değişkenini besler (dallanma). \(z\)’yi azıcık oynatırsan, beslediği her \(s\)’i kendi ağırlığı kadar etkilersin; ve her \(s\) kaybı etkiler. Küçük değişimlerde toplam etki, bu katkıların toplamıdır:

\[ \frac{\partial C}{\partial z} = \sum_i w_i\, \frac{\partial C}{\partial s_i} \]

LeCun’un özlü ifadesi: ileri geçişte ağırlıkları “yukarı” kullanırsın, geri geçişte aynı ağırlıkları “aşağı” — gradyanların ağırlıklı toplamını alırsın.

“when you back propagate through a neural net, you compute a weighted sum of the gradients using the weights backwards.” — LeCun, 36:24

Yani ileri geçiş \(s = Wz\), geri geçiş ise \(\partial C/\partial z = W^\top (\partial C/\partial s)\) — aynı \(W\) matrisi, transpozuyla. Backprop’un simetrisi tam burada.

İpucuBuilder Notu — Forward W, Backward Wᵀ

Geriye (18.06): İleri geçiş \(W\) ile çarpma, geri geçiş \(W^\top\) ile çarpmadır — 18.06’nın transpoz/iç çarpım dünyası. Dallanan değişkenin gradyanlarının toplanması, çok-değişkenli zincir kuralının (Calculus) doğrudan sonucudur.

İleriye: “Forward \(W\), backward \(W^\top\)” simetrisi, her nn.Linear katmanının autograd implementasyonudur; özel katman yazarken bu çifti tanımlarsın.

3.7 (LeCun) Jacobian Formülasyonu ve Hesaplama Grafiği

LeCun backprop’u tek bir genel kurala indiriyor. Vektör değerli modüller için zincir kuralı Jacobian matrisleriyle yazılır. Bir modüller dizisinde, kaybın \(k\). modülün girdisine göre gradient’i, bir sonraki gradient ile o modülün Jacobian matrisinin çarpımıdır:

\[ \frac{\partial C}{\partial z_k} = \frac{\partial C}{\partial z_{k+1}}\, \frac{\partial z_{k+1}}{\partial z_k} \]

Jacobian matrisinin \(ij\) elemanı, çıktının \(i\). bileşeninin girdinin \(j\). bileşenine kısmi türevidir. Backprop, çıktıdan girişe doğru bu Jacobian matrislerini art arda çarpmaktan ibarettir. Parametreli bir modülün iki Jacobian’ı vardır: biri girdiye göre (gradient’i bir önceki katmana taşır), biri ağırlıklara göre (o katmanın ağırlık gradient’ini verir). LeCun’un kapanışı:

“that’s all there is to backprop.” — LeCun, 49:32

Bir ağı kavramsal olarak “linear–nonlinear çiftlerinin” istiflenmesi olarak görmek faydalı: \(s_{k+1} = W_k z_k\), ardından \(z_k = h(s_k)\). LeCun’un deyişiyle “bir katman, linear-nonlinear bir çifttir” (37:31) — ama modern ağlarda bu ayrım her zaman temiz değildir.

Hesaplama grafiği ve genelleştirilmiş backprop. LeCun bu fikri tek bir zincirden genel bir hesaplama grafiğine (computation graph) genelliyor. Bir ağ, modüllerin yönlü asiklik grafiğidir (DAG); ileri geçiş bu grafiği soldan-sağa hesaplar. Backprop ise aynı grafiği “türev grafiğine” çevirir: her modülün yerine Jacobian’ı geçer ve sinyalleri sağdan-sola taşır. Şekil 3.4 bu çift akışı tek bir grafik üzerinde gösterir: üstte ileri (veri), altta geri (Jacobian zinciri). Bu, modüllerin birden çok girdisi/çıktısı olduğunda da çalışır — dallanan bir değişkenin gradyanları toplanır (Bölüm 5’teki “ağırlıklı toplam” kuralı). Bu genellik sayesinde PyTorch, herhangi bir modül kombinasyonu için backward’ı otomatik üretir; sen yalnızca ileri geçişi tanımlarsın.

Şekil 3.4: x → Linear W₁ → ReLU → Linear W₂ → LogSoftMax → Cost C modül zincirinde ileri geçiş (violet, veri akışı) ile geri geçişin (gold, sağdan-sola ∂C Jacobian zinciri) aynı grafik üzerinde nasıl ters yönde aktığını gösteren hesaplama grafiği.

Ayrıca bir ayrım: çıkarım (inference) yalnızca ileri geçiştir — ağ, girdiyi \(\mathbb{R}^n\)’den \(\mathbb{R}^c\)’ye (\(n\) boyuttan \(c\) sınıfa) eşleyen sabit bir fonksiyondur. Eğitim (training) ise ileri + geri geçiş + güncelleme döngüsüdür. Çıkarımda backprop yoktur; backprop sadece öğrenme için gereklidir.

İpucuBuilder Notu — Jacobian = Matris Zinciri

Geriye (18.06): Jacobian, bir vektör fonksiyonunun türev matrisidir; zincir = matris çarpımı (18.06 bileşke dönüşüm). Reverse-mode, bu çarpımları sağdan-sola yapar (verimli — çünkü kayıp skalerdir, soldan vektör küçük kalır).

İleriye: “İki Jacobian’lı modül” soyutlaması, her PyTorch katmanının forward/backward çiftidir; bu genel algoritma, çok-girişli/çok-çıkışlı modüllere de aynen uygulanır.

3.8 (LeCun) Aktivasyon ve LogSoftMax Modülleri

LeCun somut modül örnekleri veriyor. Çekirdek olanlar: lineer ve ReLU (pointwise nonlinearite). Sınıflandırma için kritik olan ise LogSoftMax: softmax bir skor vektörünü olasılık dağılımına çevirir (her eleman pozitif, toplamı 1); LogSoftMax bunun logaritmasıdır. Bu modül, ham skorları (logit) olasılığa çevirip kaybın hesaplanmasını sağlar — Canziani’nin Practicum’da kullanacağı cross-entropy’nin yapı taşıdır. NYU’da kullanılan modül listesi uzundur çünkü her görev (sınıflandırma, sıralama, gömme) kendi modülünü ister.

İpucuBuilder Notu — Softmax’ın Olasılık Köprüsü

Geriye (Calculus + Stat 110): Softmax = argmax’ın yumuşak, türevlenebilir hâli; \(e^x\) (Calculus Ders 5) + multinomial dağılım (Stat 110). Log almak, çarpımları toplama çevirir ve sayısal kararlılık sağlar.

İleriye: Pratikte softmax + log + NLL tek bir kararlı işlemde birleştirilir (F.cross_entropy); ayrı yazmak taşma (overflow) riski taşır.

3.9 Geçiş: LeCun’dan Canziani’ye

LeCun makineyi kurdu — modüller, kayıp, gradient descent, backprop (twiddling → Jacobian zinciri), LogSoftMax. Şimdi Canziani bunları PyTorch’a indiriyor: önce bir ağın anatomisini “döndür-ez” diliyle yeniden anlatıyor, sonra Hafta 1’de kurduğumuz ama eğitmediğimiz spiral ağını gerçekten eğitiyor. LeCun “gradient nasıl hesaplanır”ı anlattı; Canziani “ağ neye benzer, kaybı nasıl seçer, eğitim döngüsünü nasıl yazarsın”ı gösteriyor.

3.10 (Canziani) Ağ Anatomisi: Döndür–Ez (Rotation–Squashing)

Canziani tam-bağlı (fully connected) bir ağı tek bir cümleye indiriyor. Girdi \(x\) (alt, pembe) bir afin dönüşümden geçer, sonra bir nonlineariteden (\(f\)) — çıktısı gizli katman \(h\) (yeşil, vektör, “gizli” çünkü dışarıdan görünmez). Sonra yine afin + nonlinearite → çıktı \(\hat{y}\) (mavi). Canziani’nin metaforu:

“an affine transformation — I call them rotations; a nonlinear function — I call squashing. So you just repeat rotation, squashing, rotation, squashing.” — Canziani, 15:43

Yani bir ağ = döndür, ez, döndür, ez… Afin dönüşüm (matris + bias) uzayı döndürür/ölçekler/öteler; nonlinearite onu büker (ezme). Hafta 1’in geometrisinin doğrudan devamı. Şekil 3.5 aynı spiral nokta bulutuna sırayla döndürme ve ezme uygulayıp bu ritmi görselleştirir. Aktivasyon örnekleri: positive part (ReLU), sigmoid, tanh (sigmoid’in yeniden ölçeklenmiş hâli), soft(arg)max (argmax’ın yumuşak hâli).

Şekil 3.5: Canziani’nin ‘döndür-ez’ dizisi: aynı spiral nokta bulutuna sırayla afin döndürme (W=R·S) ve tanh ezme uygulanır — ağ, uzayı tekrar tekrar büküp [-1,1] kutusuna sıkıştıran bir döndür-ez-döndür-ez katman zinciridir.

Bir terminoloji tuzağı: Canziani bu ağı “üç katmanlı” sayar (girdi + gizli + çıktı nöron katmanı = 3); LeCun “iki katmanlı” der (programcı gibi sıfırdan + ağırlık matrisi sayısı). İkisi de aynı ağı kasteder — sadece sayma kuralı farklı.

İpucuBuilder Notu — Döndür-Ez = Hafta 1 Geometrisi

Geriye (Hafta 1): “Döndür-ez”, Hafta 1’in “uzay kumaşını ger + nonlinearite ile bük” geometrisinin tam karşılığıdır. Afin = rotation/scaling/shearing/reflection + öteleme (18.06).

İleriye: Bu “katman = afin + nonlinearite” kalıbı, her derin mimarinin atomudur; residual bağlantılar ve normalization bu atomun üstüne eklenir.

3.11 (Canziani) Supervised Learning ve Sınıflandırma

Canziani sınıflandırmayı (supervised learning) hatırlatarak başlıyor: kedi/köpek görüntülerini ayırmak gibi. Her örneğin bir etiketi (label) vardır; üç sınıf varsa üç etiket. Ağ, girdiyi alıp bir sınıf tahmini üretir; eğitim, tahmini doğru etikete yaklaştırır.

“supervised learning, classification — this is going to be kind of a revise of stuff you’ve seen.” — Canziani, 2:43

Canziani önemli bir geometrik gerekçe ekliyor: ağ neden girdiyi yüksek-boyutlu bir ara temsile (\(D\), \(\mathbb{R}^n\)’den çok daha büyük) taşır? Çünkü yüksek boyutta noktalar birbirinden çok uzaktır; uzakta olanları “döndürerek” ayırmak kolaydır, sıkışık olanları kıpırdatmaya çalışınca hepsi birlikte hareket eder.

“whenever you go in a very high dimensional space, everything’s far apart… it’s very easy to rotate stuff and get things to move a little bit.” — Canziani, 24:35

İpucuBuilder Notu — Yüksek Boyutta Ayırmak Kolay

Geriye (Hafta 1 + 18.06): Sınıflandırma = uzayda noktaları ayrıştırma (manifold germe). “Yüksek-boyutta her şey uzak” gözlemi, Hafta 1’in 3-milyon-boyutlu uzay sezgisinin eğitime yansımasıdır.

İleriye: Etiketli veri pahalıdır — bu, kursun ilerleyen haftalarda öz-denetimli öğrenmeye (SSL, Hafta 8-10) neden yöneldiğinin sebebidir.

3.12 (Canziani) Cross-Entropy: Sınıflandırmanın Kaybı

Sınıflandırmada doğru kayıp nedir? Canziani örnek-başına kaybı tanımlıyor: doğru sınıfın softmax olasılığının negatif logaritması. Ağ doğru sınıfa yüksek olasılık verirse kayıp küçük, düşük verirse büyük olur.

“this loss is also called cross entropy.” — Canziani, 29:51

Doğru sınıf \(c\) için örnek-başına cross-entropy:

\[ \mathcal{L}_{\text{CE}} = -\log \frac{e^{y_c}}{\sum_j e^{y_j}} \]

Etiketler genelde one-hot kodlanır (doğru sınıf 1, ötekiler 0); cross-entropy, modelin olasılık dağılımını bu one-hot hedefe yaklaştırır. Tüm veri setinde minimize edilen, örnek-başına kayıpların ortalamasıdır (LeCun bunu büyük \(L\) ile yazar).

İpucuBuilder Notu — CE = Negatif Log-Olabilirlik

Geriye (Stat 110): Cross-entropy doğrudan olasılıktan gelir: doğru sınıfın negatif log-olabilirliğini (NLL) minimize etmek = maximum likelihood (Stat 110 Bernoulli/multinomial). Yani kayıp “uydurma” değil, olasılık teoreminin sonucudur — KL ıraksamasını azaltmaya denktir.

İleriye: Sınıf dengesizliğinde ağırlıklı/focal loss; çok-etiketli problemlerde sigmoid + BCE. Kayıp seçimi bir mühendislik kararıdır.

3.13 (Canziani) Cross-Entropy vs MSE: Görev Kaybı Belirler

Canziani’ye sınıfta sorulan klasik soru: neden cross-entropy de MSE (ortalama kare hata) değil? Cevap: görev belirler. Sınıflandırmada çıktı bir olasılıktır → cross-entropy çalışır ve istatistiksel gerekçesi vardır. Regresyonda (sürekli değer tahmini) çıktı sürekli olur → MSE kullanılır.

“if we talk about classification, we’re going to be talking about classes and labels [cross-entropy]; [in regression] targets [MSE].” — Canziani, 49:12

Şekil 3.6 iki kaybın doğru-sınıf olasılığı \(p\) karşısındaki davranışını yan yana koyar: cross-entropy \(p \to 0\)’da patlar, MSE ise sınırlı kalır. Aynı eğitim döngüsünde tek değişen, kriterdir (criterion): sınıflandırma için CrossEntropyLoss, regresyon için MSELoss. Sözlük de değişir: sınıflandırmada “sınıf/etiket”, regresyonda “hedef (target)”.

Şekil 3.6: Doğru sınıf olasılığı p düştükçe cross-entropy (−log p) patlar ama MSE ((1−p)²) en fazla 1’de kalır; bu yüzden cross-entropy sınıflandırmada güvenli-yanlış tahmini sert cezalandırır.
İpucuBuilder Notu — Görev → Kayıp

Geriye (Stat 110): MSE, gürültünün Gaussian olduğu varsayımının maximum likelihood karşılığıdır; cross-entropy ise Bernoulli/multinomial’in. İki kayıp da aynı ilkeden (MLE) farklı dağılım varsayımlarıyla türer.

İleriye: “Görev → çıktı tipi → kayıp” zinciri, herhangi bir ML problemini kurarken ilk verilen karardır.

3.14 (Canziani) Derinlik vs Genişlik

Canziani pratik bir tasarım sorusu açıyor: aynı ifade gücünü tek bir geniş katmanla mı (örn. 100 nöron) yoksa birkaç derin katmanla mı (örn. 10+10) elde etmeli? İlginç gözlem: derin istifleme, nöron kombinasyonlarını üstel olarak artırdığı için, ince ama derin bir ağ, geniş ama sığ bir ağa yakın güç sağlayabilir.

Tradeoff ise hesaplamada: derin ağda veri bağımlılığı vardır — alttaki katman bitmeden üstteki başlayamaz, yani daha sıralı (yavaş). Geniş ağ daha paralelleştirilebilir ama çok daha fazla nöron/bellek ister. Şekil 3.7 iki mimariyi şematik olarak yan yana koyar. Yani “derin mi geniş mi” sorusunun cevabı donanıma (paralellik) ve bellek bütçesine bağlıdır.

Şekil 3.7: İki ağ mimarisinin şematik karşılaştırması: solda geniş-sığ ağ (2 girdi → 100 nöronlu tek gizli katman → 5 çıktı, paralel ama bellek-yoğun), sağda ince-derin ağ (2 → 10 → 10 → 5, sıralı/yavaş ama üstel katman kombinasyonu) — derinliğin az nöronla geniş-sığ ağa denk ifade gücü sağladığını gösterir.
İpucuBuilder Notu — Derinlik mi Genişlik mi

Geriye (Hafta 1): Geniş ara temsil, “yüksek boyutta her şey uzak → ayırması kolay” sezgisini kullanır; derinlik ise her katmanda yeni nonlineariteyle ifade gücünü üst üste bindirir.

İleriye: Derinlik/genişlik dengesi, modern ölçeklemenin (scaling laws), pipeline/tensor paralelliğinin ve bellek-throughput tradeoff’unun doğrudan konusudur — Hafta 4 ve sonrası.

3.15 (Canziani) PyTorch’ta Eğitim Döngüsü

Canziani teoriyi koda döküyor ve Hafta 1’in spiral ağını eğitiyor. Eğitim, parametreleri (ağırlık matrisleri) gradient descent ile güncellemektir:

“how do you train a neural network? Gradient [methods].” — Canziani, 39:18

PyTorch’ta standart döngü: ileri geçiş → kaybı hesapla → backward() (LeCun’un Jacobian zinciri) → optimizer adımı.

import torch
import torch.nn as nn

model = nn.Sequential(
    nn.Linear(2, 100), nn.ReLU(),   # dondur + ez (rotation + squashing)
    nn.Linear(100, 5),              # 5 sinif (spiral kollari)
)
criterion = nn.CrossEntropyLoss()                 # softmax + NLL birlikte
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

for epoch in range(1000):
    y_pred = model(x)               # ileri gecis (forward)
    loss = criterion(y_pred, y)     # cross-entropy
    optimizer.zero_grad()           # gradyanlari sifirla (Karpathy'nin meshur hatasi)
    loss.backward()                 # backprop = Jacobian zinciri
    optimizer.step()                # theta <- theta - eta * grad

Döngü ilerledikçe kayıp düşer; eğitim sonunda spiral kolları lineer ayrılabilir hale gelir — Hafta 1’de göremediğimiz “öğrenme” işte budur. Şekil 3.8 Hafta 1’in spiral ağını gerçekten eğitir: lineer sınıflandırıcı kolları ayıramaz, ReLU MLP ayırır, ve eğitim kaybı düşer. Canziani döngünün ilk ve son kayıp değerlerini karşılaştırarak ağın gerçekten öğrendiğini gösterir (örn. ilk kayıp yüksek, son kayıp 0.86 gibi düşük bir değere iner).

Şekil 3.8: Hafta 1’in spirali artık eğitildi: lineer softmax sınıflandırıcı 5 kolu ayıramaz (%31), ReLU MLP manifoldu açarak kolları ayırır (%96) ve eğitim kaybı 4000 adımda 1,83’ten 0,135’e düşer.
İpucuBuilder Notu — Dört Satırlık Döngü

Geriye (LeCun + Karpathy): loss.backward() tam olarak LeCun’un Jacobian zinciridir; zero_grad() Karpathy’nin “her backward öncesi gradyanı sıfırla” dersidir (atlanırsa gradient yanlış birikir).

İleriye: Bu dört satırlık döngü (forward → loss → backward → step) tüm derin öğrenme eğitiminin iskeletidir; üstüne validation, checkpoint, LR schedule, mixed precision biner.

3.16 Bu Dersin Özeti

  1. Eğitim = kaybı gradient descent ile küçültmek. Ağ modüllerden kuruludur; maliyet modülü tahmin ile gerçeği karşılaştırır.
  2. Gradient descent kaybı gradient’in ters yönünde küçük adımlarla azaltır; SGD bunu tek örnek/batch üzerinde tahminle yapar (“descent değil, optimization” — gürültülü ama ucuz).
  3. Backpropagation = zincir kuralı. “Twiddling” sezgisiyle: gradyan’ı çıktıdan girişe her modülün türeviyle çarparak taşırsın; vektörel hâlde bu Jacobian matrislerinin çarpımıdır. Lineer modülde “ağırlıkların tersten ağırlıklı toplamı” (forward \(W\), backward \(W^\top\)). “That’s all there is to backprop.”
  4. Ağ = döndür-ez (afin + nonlinearite) dizisidir; LogSoftMax/softmax skorları olasılığa çevirir.
  5. Cross-entropy sınıflandırmanın kaybıdır (−log softmax = NLL); MSE regresyonunki. Görev kaybı belirler.
  6. Derinlik vs genişlik: ince-derin ≈ geniş-sığ (üstel kombinasyon), ama derin = sıralı/yavaş, geniş = paralel/bellek-yoğun.
  7. PyTorch eğitim döngüsü: forward → loss → zero_grad → backward → step. Hafta 1’in spiral ağı bununla eğitilip ayrılır.
ÖnemliTek Bir Cümle

Bir ağı eğitmek, bir kaybı (sınıflandırmada cross-entropy) gradient descent ile küçültmektir; gradient’i backpropagation — zincir kuralının modül-modül Jacobian çarpımlarıyla uygulanması — hesaplar, ve tüm bu döngü PyTorch’ta forward → loss → backward → step’ten ibarettir.

3.17 Kontrol Soruları

Cevap: Backprop, zincir kuralının modüllere uygulanmasıdır. Vektörel modüllerde gradient, çıktıdan girişe doğru her modülün Jacobian matrisiyle çarpılarak taşınır:

\[ \frac{\partial C}{\partial z_k} = \frac{\partial C}{\partial z_{k+1}}\, \frac{\partial z_{k+1}}{\partial z_k} \]

Parametreli bir modülün iki Jacobian’ı vardır: girdiye göre olan gradient’i bir önceki katmana taşır; ağırlıklara göre olan o katmanın ağırlık gradient’ini verir. Lineer modülde bu “forward \(W\), backward \(W^\top\)” simetrisidir. LeCun’un deyişiyle “that’s all there is to backprop” (49:32). Karpathy bunu micrograd’da _backward kapanışlarıyla koda döker.

Cevap: Çünkü SGD gradient’i tüm veri yerine tek bir (veya küçük batch) örnek üzerinde tahmin eder; bu tahmin gürültülüdür, dolayısıyla her adım kaybı garantili azaltmaz — bazen artırabilir. Bu yüzden LeCun “stochastic gradient optimization” demeyi tercih eder (17:10). Gürültü kötü değildir: (1) çok daha ucuz ve sık güncelleme demektir, (2) sığ yerel minimumlardan kaçmaya yardım eder. Stat 110 köprüsü: mini-batch gradient’i gerçek gradient’in tarafsız tahmincisidir, varyans \(\propto 1/B\).

Cevap: Görevin çıktı tipine ve onun altındaki olasılık varsayımına dayanır. Sınıflandırmada çıktı bir olasılık dağılımıdır; doğru sınıf \(c\) için cross-entropy:

\[ \mathcal{L}_{\text{CE}} = -\log \frac{e^{y_c}}{\sum_j e^{y_j}} \]

Bu, doğru sınıfın negatif log-olabilirliğidir (NLL) → maximum likelihood (Stat 110 multinomial). Regresyonda çıktı süreklidir; MSE, Gaussian gürültü varsayımının maximum likelihood karşılığıdır. İkisi de aynı ilkeden (MLE) farklı dağılımlarla türer — kayıp “uydurma” değildir.

Cevap: forward = modüllerin ileri geçişi (LeCun’un fonksiyonel modülleri, “döndür-ez”); loss = maliyet modülü (\(\hat{Y}\) ile \(Y\) karşılaştırması, cross-entropy); backward = backpropagation, LeCun’un Jacobian zinciri (loss.backward()); step = gradient descent güncellemesi \(\theta \leftarrow \theta - \eta\nabla L\). zero_grad() gereklidir çünkü PyTorch gradyanları varsayılan olarak biriktirir (toplar); her backward öncesi sıfırlanmazsa önceki adımların gradyanları yenisine eklenir ve eğitim bozulur — Karpathy’nin meşhur hatası.

3.18 Egzersizler

Egzersiz 1 (Cross-entropy elle). Bir skor vektörü (logit) için softmax’i NumPy ile hesapla, sonra doğru sınıfın −log olasılığını al. Aynı sonucu torch.nn.functional.cross_entropy ile karşılaştır.

import numpy as np
def softmax(z): e = np.exp(z - z.max()); return e / e.sum()
z = np.array([2.0, 0.5, -1.0]); c = 0           # dogru sinif 0
p = softmax(z); print(-np.log(p[c]))            # cross-entropy

Egzersiz 2 (Spiral’ı eğit). Hafta 1’de kurduğun spiral ağına (2 → 100 → ReLU → 5) CrossEntropyLoss + SGD ekle ve 1000 epoch eğit. Kayıp eğrisini çiz; ilk ve son kayıp değerlerini karşılaştır. Karar bölgelerinin nasıl ayrıştığını gözlemle.

Egzersiz 3 (zero_grad’ı unut). Eğitim döngüsünden optimizer.zero_grad() satırını sil ve eğit. Kaybın neden bozulduğunu açıkla (gradyan birikimi). Sonra geri ekle.

Egzersiz 4 (CE vs MSE). Aynı spiral verisinde (a) cross-entropy, (b) MSE (one-hot hedeflerle) ile eğit. Hangisi daha iyi/kararlı yakınsıyor? Neden cross-entropy sınıflandırma için doğru seçim?

Egzersiz 5 (Hafta 3 habercisi — görüntüye geçiş). Bu hafta girdi 2 sayıydı. Şimdi 28×28 piksellik bir rakam görüntüsünü düşün: nn.Linear ile işlemek için 784 boyuta düzleştirmen gerekir — ve uzamsal yapı (komşu pikseller) kaybolur. (a) 1000×1000 RGB için ilk linear katmanın kaç parametresi olurdu? (b) Bu “parametre patlaması” ve kaybolan uzamsal yapı, Hafta 3’te convolution’a neden ihtiyaç duyduğumuzu motive eder — neden?

3.19 Sonraki Ders İçin Hazırlık

UyarıSonraki Hafta — H3: Evrişimli Ağlar (ConvNets)

Tam-bağlı ağdan doğal sinyallere. Bu hafta tam-bağlı (fully connected) ağları eğittik. Hafta 3’te LeCun görüntü gibi doğal sinyallerin yapısını (yerel, hiyerarşik, öteleme-değişmez) ve bunu sömüren convolution’ı anlatacak; görsel korteksten LeNet5’e uzanacak. Canziani doğal sinyaller ve pooling’i PyTorch’ta gösterecek — Egzersiz 5’in “parametre patlaması” tam burada çözülür.

Hafta 3: Evrişimli Ağlar (ConvNets) ve Doğal Sinyaller — LeCun (Lecture) + Canziani (Practicum)

Bu hafta tam-bağlı (fully connected) ağları eğittik. Hafta 3’te LeCun görüntü gibi doğal sinyallerin yapısını (yerel, hiyerarşik, öteleme-değişmez) ve bunu sömüren convolution’ı anlatacak; görsel korteksten LeNet5’e uzanacak. Canziani doğal sinyaller ve pooling’i PyTorch’ta gösterecek.

Hafta 3 öncesi yapılacak:

  • Egzersiz 2’yi (spiral eğitimi) ve Egzersiz 5’i (görüntü/parametre patlaması) çöz.
  • “Backprop = zincir kuralının Jacobian çarpımlarıyla uygulanması” cümlesini kendi sözcüklerinle yaz.
  • Karpathy micrograd’ı (Phase 2) hatırla — loss.backward() orada elle nasıl kuruluyordu?

3.20 Anahtar Kavramlar (Cheat Sheet)

Kavram Tanım Hoca / timestamp
Modül Girdi → çıktı hesaplayan blok; ağ modüllerden kurulur LeCun 6m04
Maliyet (cost) modülü \(\hat{Y}\) ile \(Y\)’yi karşılaştırıp kaybı üretir; tepeye konur LeCun 1m43
Gradient descent Gradient’in ters yönünde küçük adım; dağda iniş LeCun 10m27
SGD Gradient’i tek örnek/batch’te tahmin; gürültülü, ucuz LeCun 17m10
Backprop = zincir kuralı Gradient’i çıktıdan girişe taşıma; twiddling sezgisi LeCun 27m36
Ağırlıkları tersten Forward \(W\), backward \(W^\top\); gradyanların ağırlıklı toplamı LeCun 36m24
Jacobian matrisi Vektör fonksiyonun türev matrisi; backprop = Jacobian çarpımları LeCun 46m10
Döndür-ez Ağ = afin (rotation) + nonlinearite (squashing) dizisi Canziani 15m43
Cross-entropy (NLL) Sınıflandırma kaybı: −log softmax (doğru sınıf) Canziani 29m51
MSE Regresyon kaybı: ortalama kare hata Canziani 48m46
Derinlik vs genişlik İnce-derin ≈ geniş-sığ; derin sıralı, geniş paralel Canziani 25m21
Eğitim döngüsü forward → loss → zero_grad → backward → step Canziani 39m18

3.21 ML Builder Bağlantıları

Geriye köprüler (önkoşul kurslar):

  1. Backprop / zincir kuralı → Calculus Ders 4 + Karpathy micrograd (_backward, autograd).
  2. Cross-entropy / NLL → Stat 110 Bernoulli/multinomial log-olabilirlik (MLE).
  3. Jacobian / zincir = matris çarpımı + forward \(W\) / backward \(W^\top\) → 18.06 bileşke dönüşüm ve transpoz.
  4. SGD tarafsız tahmin → Stat 110 örneklem ortalaması, varyans \(\propto 1/B\).
  5. MSE = Gaussian MLE → Stat 110 normal dağılım.

İleriye köprüler (production / research):

  1. module + Jacobian → PyTorch nn.Module + autograd (loss.backward()).
  2. SGD ucuzluğu → mini-batch, gradient accumulation, DDP.
  3. softmax+log+NLL birleşikF.cross_entropy (sayısal kararlılık).
  4. Derinlik/genişlik + eğitim döngüsü → scaling laws, checkpoint, LR schedule, mixed precision.
ÖnemliBu dersten tek bir şey alıp gideceksen

Bir ağı eğitmek sihir değildir — bir kaybı gradient descent ile küçültmektir; ve gradient’i hesaplayan backpropagation, zincir kuralının modül-modül Jacobian çarpımlarıyla uygulanmasından başka bir şey değildir. LeCun bunu Jacobian cebriyle kurar, Canziani PyTorch’ta dört satırda (forward → loss → backward → step) gösterir — ve Hafta 1’in eğitilmemiş spiral ağı işte böyle ayrışır.