5  Konvolüsyonun Cebiri ve Optimizasyon (SGD, Momentum, Adam)

NYU’nun bu haftaki iki sesi: Alfredo Canziani convolution’a lineer cebir gözüyle döner — convolution aslında özel yapılı (Toeplitz) bir matrisle çarpımdır, yani ‘bir sürü sıfırı olan bir matris çarpımı’; sonra konuk araştırmacı Aaron Defazio (Facebook AI Research) sahneyi devralır ve o matrisleri (ağı) nasıl eğittiğimizin pratik motorunu anlatır — gradient descent’ten SGD’ye, momentum’a, ve modern adaptif yöntemlere (RMSprop, Adam)

NotBölüm bilgisi

5.1 Bu Derste Ne Var?

Bu hafta iki bağımsız ama tamamlayıcı parça var. Önce Alfredo Canziani convolution’a Hafta 3’te bıraktığımız soruyla geri döner: convolution aslında nedir — lineer cebir diliyle? Cevap zarif: convolution, özel yapılı (Toeplitz) bir matrisle çarpmaktır — yani “bir sürü sıfırı olan bir matris çarpımı”. Sonra konuk bir optimizasyon araştırmacısı, Aaron Defazio (Facebook AI Research; PhD Australian National University) sahneyi devralır ve ağları nasıl eğittiğimizin pratik motorunu anlatır: gradient descent’ten SGD’ye, momentum’a, ve modern adaptif yöntemlere (RMSprop, Adam).

⚠️ Atıf notu: Bu haftanın optimizasyon dersi (Lecture) LeCun değil, konuk Aaron Defazio tarafından verilir (transkriptten doğrulandı: “research scientist at Facebook working on optimization, PhD ANU”). Quote’lar bu yüzden — Defazio ile işaretlenir.

Bu haftanın üç ana fikri:

  1. Convolution = Toeplitz matrisiyle çarpım. Tam-bağlı katmanla aynı çatı; tek fark, matrisin paylaşımlı + seyrek (çoğu sıfır) olmasıdır.
  2. SGD + momentum, modern eğitimin belkemiğidir. Tam-batch gradient descent neredeyse hiç kullanılmaz; momentum’u (\(\beta \approx 0.9\)) “neredeyse her zaman” açarsın.
  3. Adaptif yöntemler (Adam) per-weight öğrenme oranı verir — ve en çok kullanılan yöntem olmasına rağmen teorisi tartışmalıdır (“optimization’ı tam anlamıyoruz”).

flowchart TB
    subgraph Cebir["(A) Convolution'ın cebiri (Canziani)"]
        direction LR
        FC["Tam-bağlı matris<br/>(her girdi her çıktıya)"]
        Zorla["'Yerel + paylaşımlı'<br/>olmaya zorla"]
        Toep["Toeplitz matrisi<br/>(seyrek: çoğu eleman sıfır)"]
        Conv["Convolution<br/>= bir sürü sıfırlı çarpım"]
        FC -- "kısıtla" --> Zorla
        Zorla --> Toep
        Toep --> Conv
    end

    subgraph Opt["(B) Optimizasyon merdiveni (Defazio)"]
        direction LR
        GD["Gradient Descent<br/>(κ kötüyse zikzak)"]
        SGD["SGD<br/>(veri artıklığını sömür)"]
        Mom["+ Momentum<br/>(salınımı söndür)"]
        Adapt["+ Adaptif / RMSprop<br/>(per-weight ölçek)"]
        Adam["Adam<br/>= RMSprop + Momentum"]
        Zanaat["'Zanaat, teori değil'<br/>(tam anlamıyoruz)"]
        GD --> SGD
        SGD --> Mom
        Mom --> Adapt
        Adapt --> Adam
        Adam --> Zanaat
    end

    Conv -. "bu matrisi (ağı) nasıl eğitiriz?" .-> GD

İpucuBuilder Notu — İki Yarı: Cebir ve Motor

Geriye (önkoşul kurslar):

  • Convolution = Toeplitz matris → 18.06 matris-vektör çarpımı + Hafta 3 Egzersiz 5 (convolution = kısıtlı lineer katman) + Phase 2 18.065 yapılı matrisler.
  • Condition number \(\kappa = L/\mu\) → 18.06 özdeğer (en büyük/en küçük) + 18.065 koşullanma.
  • Momentum → Calculus ivme (ikinci türev sezgisi) + fizik (Newton).

İleriye (production / research):

  • Toeplitz görüşü → convolution’ın FFT ile hızlı hesabı, structured matrices.
  • SGD+momentum / Adam → her modern eğitim hattının optimizer seçimi; LR schedule, warmup.

Tek cümleyle: Convolution özel yapılı bir matris çarpımıdır; ve o matrisi (ağı) eğitmek, gradient descent’i SGD + momentum + adaptif ölçeklemeyle pratiğe döken — ama teorisi hâlâ tam oturmamış — bir optimizasyon zanaatıdır.

5.2 (Canziani) Lineer Cebir Recap: Matris × Vektör’ün İki Görüşü

Canziani convolution’ı kurmadan önce matris-vektör çarpımını iki farklı gözle okutuyor. Afin dönüşüm \(z = Ax\) (bias’ı matrisin içine gömerek). Bu çarpıma iki türlü bakılır:

  1. Satır görüşü: çıktının her elemanı, \(A\)’nın bir satırı ile girdinin iç çarpımıdır — yani “girdinin o satırla ne kadar hizalı olduğu”. Canziani’nin vurgusu: bir lineer katmanda kernel, matrisin tam bir satırıdır.

“whenever you have a linear layer, your kernel is going to be the whole row of the matrix.” — Canziani, 13:31

  1. Sütun görüşü: çıktı, \(A\)’nın sütunlarının girdi katsayılarıyla ağırlıklı toplamıdır:

\[ A\mathbf{x} = \sum_{j} x_j\, \mathbf{a}_j \]

Bu iki görüş aynı işlemin iki yüzü; convolution’ı anlamak için birincisi (satır = kernel) kritiktir. Şekil 5.1 aynı 3×3 sayısal \(A\mathbf{x}\) çarpımını iki panelde yan yana koyar: solda satır·girdi iç çarpımı (vurgulu satır = kernel), sağda sütunların \(\mathbf{x}\) katsayılarıyla ağırlıklı toplamı.

Şekil 5.1: Aynı \(A\mathbf{x}\) çarpımının iki yüzü. SOL (satır görüşü): çıktının her elemanı \(b_i\), \(A\)’nın \(i.\) satırı ile \(\mathbf{x}\)’in iç çarpımıdır; vurgulu satır convolution’daki “kernel” rolündedir — bir filtre tam olarak bir satıra karşılık gelir. SAĞ (sütun görüşü): \(A\mathbf{x}=\sum_j x_j\,\mathbf{a}_j\), yani \(A\)’nın sütunlarının \(\mathbf{x}\) ağırlıklarıyla toplamıdır; sütunlar uzaydaki yön vektörleridir. Aynı sonuç (\(b=[0,10,1]\)), iki farklı okuma — convolution sezgisi için “kernel = satır” yorumu kritiktir.
İpucuBuilder Notu — Satır = Kernel

Geriye (18.06): Bu, 18.06’nın “matris çarpımının satır vs sütun yorumu” dersidir. Satır görüşü = iç çarpım/projeksiyon; sütun görüşü = sütun uzayı (column space). İkisi de aynı \(A\mathbf{x}\).

İleriye: “Kernel = satır” görüşü, convolution’ı tam-bağlı katmanın özel bir hâli olarak görmenin anahtarıdır (Bölüm 3).

5.3 (Canziani) Convolution = Toeplitz Matrisi

Şimdi convolution’ı bir matrise çeviriyoruz. Diyelim küçük bir kernel (boyut 3) ile çok uzun bir sinyali convolve edeceğiz. Bunu bir matris çarpımı olarak yazmak istersek, kernel’i her satırda bir konum kaydırarak yerleştiririz; geri kalan her yer sıfırdır. Ortaya çıkan matrisin özel bir adı var:

“this is going to be called a Toeplitz matrix.” — Canziani, 23:36

Toeplitz matrisi: her köşegeni sabit olan, kernel’in kaydırılarak tekrarlandığı matris. İki temel özelliği:

  • Seyrek (sparse): her satırda yalnızca kernel boyutu kadar sıfır-olmayan eleman var (gerisi sıfır) — bu, locality (Hafta 3) demektir.
  • Paylaşımlı: her satır aynı kernel’i içerir, sadece kaydırılmış — bu, stationarity / parameter sharing demektir.

Yani convolution’ı icat etmemize gerek yok: tam-bağlı bir katman alıp matrisini “yerel + paylaşımlı” olmaya zorlarsan, kendiliğinden convolution’ı yeniden keşfedersin. Şekil 5.2 bu fikri somutlaştırır: solda kernel \([1, 0, -1]\)’in \(7 \times 9\) Toeplitz matrisi (elemanların çoğu sıfır = beyaz), sağda \(T\mathbf{x}\) ile doğrudan conv1d’nin birebir aynı kenar/fark çıktısını verdiği doğrulama.

Şekil 5.2: 1B convolution’ın Toeplitz matrisi olarak yazılışı. Solda kernel [1, 0, −1]’in n=9 girdi için ürettiği 7×9 Toeplitz matrisi: her satır kernel’i bir kaydırılmış kopyasıdır (violet +1, gold −1), 63 elemanın 49’u sıfır (beyaz). Bu seyreklik (locality, yereldelik) ve satır-paylaşımı (stationarity, durağanlık) convolution’ı çok sayıda sıfır içeren bir matris çarpımına indirger. Sağda doğrulama: T·x ile conv1d(x, kernel) birebir aynı kenar/fark çıktısını ([−2]×7) verir.
İpucuBuilder Notu — Toeplitz = Kısıtlı Matris

Geriye (Hafta 3 + 18.06): Bu, Hafta 3 Egzersiz 5’in cevabıdır: convolution = Toeplitz (yapısı kısıtlanmış) matris. Hafta 3’ün “locality → sparsity, stationarity → parameter sharing” eşlemesi, Toeplitz matrisin sıfır deseni + tekrar deseni olarak somutlaşır.

İleriye: Toeplitz/dolaşım (circulant) matrisler Fourier dönüşümüyle köşegenleşir — convolution’ın FFT ile \(O(n \log n)\) hesabının temeli budur (18.065 spectral köprüsü, Hafta 13).

5.4 (Canziani) “Bir Sürü Sıfırlı Matris Çarpımı”

Canziani’nin özlü kapanışı:

“a convolution is just a matrix multiplication with a lot of zeros — that’s it.” — Canziani, 27:55

Tam-bağlı katman ile convolution katmanı aynı çatıdadır (ikisi de \(A\mathbf{x}\)). Tek fark:

  • Tam-bağlı: kernel = matrisin tam satırı (her girdiye bağlı, paylaşım yok) → çok parametre.
  • Convolution: kernel = küçük, kaydırılan pencere (Toeplitz) → seyrek + paylaşımlı → az parametre.

Canziani “listening to convolutions” demosunda bir ses sinyalini bir kernel’le convolve edip sonucu dinletir — convolution’ın somut, işitilebilir etkisini gösterir. Özet: compositionality + locality + stationarity sayesinde matris-vektör çarpımını seyrek, yerel, paylaşımlı bir Toeplitz matrise indirgeyerek convolution operatörünü yeniden keşfederiz.

İpucuBuilder Notu — Sıfırlı Matris Çarpımı

Geriye (Hafta 2-3): Convolution bir modül olduğundan (Hafta 2), backprop onun için de otomatik çalışır; Toeplitz görüşü, convolution’ın geri geçişinin de yine bir convolution (transpoze kernel) olduğunu açıklar — “forward \(W\), backward \(W^\top\)” (Hafta 2) convolution’a taşınır.

İleriye: “Convolution = yapılı matris” görüşü, donanımda neden convolution’ın özel kernel’lerle (im2col + GEMM, ya da Winograd/FFT) hızlandırıldığını açıklar.

5.5 Geçiş: Canziani’den Defazio’ya (Konuk Optimizasyon Dersi)

Convolution’ın ne olduğunu (yapılı matris) gördük. Şimdi konu değişiyor: bu matrisleri (ağı) nasıl eğitiriz? Bu haftanın ikinci yarısı, konuk bir optimizasyon araştırmacısı Aaron Defazio’ya ait. Hafta 2’de SGD’yi tanımıştık; Defazio onu derinleştirip pratikte gerçekten kullandığımız yöntemlere (momentum, Adam) götürüyor. Üslubu açıkça pratik:

“optimization is at the heart of machine learning… I’m going to focus on the application of these methods rather than the theory, part of the reason is that we don’t fully understand all of these methods.” — Defazio, 0:45

5.6 (Defazio) Gradient Descent ve Condition Number

Defazio gradient descent’i hatırlatıp asıl sorunu gösteriyor: yakınsama hızı, problemin koşullanmasına (conditioning) bağlıdır. Kuadratik bir problemde bu, Hessian’ın en büyük (\(L\)) ve en küçük (\(\mu\)) özdeğerlerinin oranıyla ölçülür — condition number:

\[ \kappa = \frac{L}{\mu} \]

\(\kappa\) büyükse (\(\kappa = \frac{L}{\mu}\) kötü koşullanmış) gradient descent zikzak çizer ve yavaşlar. Learning rate seçimi de bir gerilimdir: mümkün olduğunca büyük istersin (hızlı öğrenme) ama çok büyükse ıraksar — yani sürekli “ıraksamanın eşiğinde” çalışırsın.

“we want to use learning rates as large as possible to get as quick learning as possible, so we’re always at the edge of divergence.” — Defazio, 13:42

İlginç bir gözlem: “güzel davranan” (salınmayan) düşük bir learning rate, çoğu zaman çözümden daha uzakta bırakır; iyi sonuç için rahatsız edici derecede yüksek oranlarla yaşamak gerekir. Şekil 5.3 iki uçta aynı GD’yi gösterir: solda \(\kappa=1\) (yuvarlak çukur, düz iniş), sağda \(\kappa=20\) (uzun ince vadi, zikzak).

Şekil 5.3: Condition number κ = L/μ ve gradient descent davranışı. SOL panel (κ=1, iyi koşullanmış): kayıp yüzeyi yuvarlak bir çukurdur; GD yörüngesi başlangıçtan (2,5, 2,0) minimuma (0,0) neredeyse düz iner — her adım doğru yöne bakar. SAĞ panel (κ=20, kötü koşullanmış): aynı kayıp uzun ve ince bir vadiye dönüşür; GD vadinin dik duvarları arasında zikzak çizerek minimuma yavaş yaklaşır. Mesaj: κ büyüdükçe (öz değerlerin oranı bozuldukça) düz gradient descent zikzaklaşır ve yavaşlar — Defazio’nun momentum/adaptif yöntemleri motive eden temel gözlemi.
İpucuBuilder Notu — κ = Koşullanma

Geriye (18.06 + 18.065): Condition number \(\kappa = L/\mu\) doğrudan 18.06 özdeğer dünyasıdır; kötü koşullanma, özdeğerlerin çok farklı ölçeklerde olması demektir (uzun, ince vadi). 18.065 (Matrix Methods) bunu ML bağlamında ele alır.

İleriye: Learning rate, en kritik hyperparameter’dır; warmup + decay schedule, “ıraksama eşiği”nde güvenli kalmanın pratiğidir.

5.7 (Defazio) SGD: “Gradient Descent Kullanma”

Hafta 2’de SGD’yi tanımıştık; Defazio çok daha keskin: pratikte tam-batch gradient descent neredeyse hiç kullanılmaz.

“it’s hard to come up with a compelling reason to use gradient descent given the success of stochastic gradient descent… if you need to do full batch optimization, do not use gradient descent — I can’t emphasize it enough.” — Defazio, 19:03 / 21:48

Neden? Çünkü makine öğrenmesi kaybı, çok sayıda benzer terimin toplamıdır (her veri noktası bir terim). Bu yapıda veri artıklığı (redundancy) vardır — yüzlerce benzer örnek aynı yönü gösterir; hepsini taramak israftır. SGD bu artıklığı sömürür: küçük bir mini-batch zaten iyi bir yön verir, ve aynı bütçeyle çok daha fazla adım atarsın. Defazio’nun inceliği: SGD “gürültülü gradient descent” değildir; gürültünün kendine has bir dinamiği vardır (vadi tabanında “zıplama”). Şekil 5.4 bunu görselleştirir: solda çok sayıda benzer örnek-gradyanı ve ortalaması, sağda aynı bütçenin GD’de 1 adıma karşı SGD’de ~N adıma dönüşmesi.

Şekil 5.4: Stokastik gradyan inişinin sezgisi: veri artıklığı. Sol panelde tek-veri örnek-gradyanları (soluk violet oklar) birbirine yakın yönleri gösterir; bunların ortalaması tam gradyandır (kalın gold ok), birkaç okun ortalaması olan mini-batch ise zaten neredeyse aynı yönü verir (orta violet ok). Sağ panel aynı örnek-okuma bütçesinin GD’de tek bir adıma karşılık SGD/mini-batch’te ~N adıma dönüştüğünü gösterir. Defazio: kayıp benzer terimlerin toplamı olduğundan mini-batch erkenden iyi yön verir — aynı bütçeyle çok daha fazla adım atılır.
İpucuBuilder Notu — Artıklık → SGD

Geriye (Hafta 2 + Stat 110): Bu, Hafta 2’deki “SGD = gradient’in tarafsız tahmincisi” fikrinin pratik sonucudur. Veri artıklığı = örneklerin istatistiksel benzerliği (Stat 110).

İleriye: “Kayıp = benzer terimlerin toplamı” yapısı, SGD’nin neden ML’e özgü kadar iyi çalıştığını açıklar; bu yapı yoksa (örn. tek bir karmaşık fonksiyon) L-BFGS gibi yöntemler daha uygun olabilir.

5.8 (Defazio) Momentum: “Neredeyse Her Zaman Kullan”

Defazio momentum’u SGD’nin üstüne eklenen, “neredeyse her zaman açman gereken” bir trick olarak sunuyor.

“momentum is a trick that you should pretty much always be using when you’re using stochastic gradient descent.” — Defazio, 27:52

Fizikten gelen sezgi: momentum, bir nesnenin gittiği yönde gitmeye devam etme eğilimidir (Newton). Pratikte bir hız tamponu (heavy ball) tutarsın: gradient’leri biriktirip adımı bu birikmiş hızla atarsın.

\[ p \leftarrow \beta p + \nabla \mathcal{L}(\theta), \qquad \theta \leftarrow \theta - \eta\, p \]

Tipik \(\beta = 0.9\). Momentum neden işe yarar? Defazio iki sebep veriyor: (1) salınım sönümleme / acceleration — gradient descent’in vadi duvarlarındaki zikzakını bastırır; (2) noise smoothing — gradient’lerin hareketli ortalamasını alarak SGD gürültüsünü yumuşatır, böylece son nokta çözümün iyi bir tahmini olur (saf SGD’de bir sürü son noktayı ortalaman gerekirdi). Heavy-ball kuralı \(p\leftarrow\beta p+\nabla\mathcal{L}(\theta)\), geçmiş gradyanları üstel sönümle biriktirir.

“momentum adds smoothing to the optimization, so the last point you visit is still a good approximation to the solution.” — Defazio, 42:09

(Bir uyarı: Nesterov acceleration teorik olarak convex problemlerde yakınsamayı hızlandırır ama sinir ağlarında ve gürültüde bu etki büyük ölçüde kaybolur — pratikte momentum’un asıl faydası noise smoothing’dir.) Şekil 5.5 aynı \(\kappa=20\) vadide GD’nin zikzakı ile momentum’un yumuşak inişini yan yana koyar.

Şekil 5.5: Momentum salınımı söndürür. Aynı κ=20 koşullanmalı dar kuadratik vadide (soluk Purples kontur) iki optimizer karşılaştırılır. SOL panel — GD (η=0.095): yörünge vadinin dik duvarları arasında zikzak çizerek minimuma yaklaşır; her adım eğimin tersine sıçrayıp salınır (Defazio’nun “koşullanma kötüyse gradient descent zikzak çizer” gözlemi). SAĞ panel — Momentum/heavy-ball (η=0.010, β=0.9): p←β·p+∇L birikimli hız, dik yönlerdeki zıt-işaretli gradyanları birbirine söndürür; yörünge düz/yumuşak bir eğri olarak vadinin dibini takip eder. Mesaj: momentum salınımı sönümler ve gürültüyü yumuşatır.

Üç optimizer’ı tek bir kayıp eğrisinde de görmek aydınlatıcıdır: Şekil 5.6 GD, SGD+Momentum ve Adam’ı aynı \(\kappa=20\) vadide logaritmik ölçekte karşılaştırır — Defazio’nun “zikzak / sönümleme / adaptif” üçlü anlatısının doğrudan görsel özeti.

Şekil 5.6: Üç optimizer aynı eğik kuadratik vadide (κ = 20, θ₀ = [2.5, 2.0], 60 adım) karşılaştırılır; kayıp logaritmik ölçekte gösterilir. Gradient Descent (lr = 0.095, mor) düz bir doğru boyunca tek-yönlü iner; SGD + Momentum (lr = 0.010, β = 0.9, altın) heavy-ball ataletiyle salınarak ilerler; Adam (lr = 0.15, mor-orta) adaptif öğrenme hızıyla her boyutu ayrı ölçekler. Eğrilerin biçimi Defazio’nun “zikzak / sönümleme / adaptif” üçlü anlatısını görselleştirir.
İpucuBuilder Notu — Heavy Ball Sönümleme

Geriye (Calculus + fizik): Momentum = ivme (Calculus ikinci türev) + Newton’un birinci yasası; “heavy ball” fiziksel benzetmesi. Hareketli ortalama = geçmiş gradient’lerin üstel ağırlıklı toplamı.

İleriye: SGD + momentum (\(\beta=0.9\)) hâlâ pek çok görü probleminde state-of-the-art; üstüne LR schedule biner.

5.9 (Defazio) Adaptif Yöntemler: Her Ağırlığa Ayrı Öğrenme Oranı

Kötü koşullanmış problemler için Defazio adaptif yöntemleri tanıtıyor. Buradaki “adaptif”, her ağırlık için ayrı (individual) bir öğrenme oranı demektir — global tek bir \(\eta\) yerine.

“for adaptive methods, we want to adapt a learning rate for every weight individually, using information we get from gradients for each weight.” — Defazio, 44:36

Neden gerekli? Çünkü ağın farklı kısımları çok farklı yapıdadır: erken katmanlar büyük görüntülerde sığ convolution’lar yapar; geç katmanlar küçük görüntülerde çok kanallı convolution’lar. Bir kısım için iyi olan learning rate, diğeri için kötü olabilir. Özellikle çıktıya doğrudan etki eden son katman ağırlıkları küçük learning rate ister. Defazio’nun dürüstlüğü: “neden gerektiğini tam bilmiyoruz; iyi koşullanmış bir ağda gerekmeyebilir bile.”

İpucuBuilder Notu — Per-Weight LR

Geriye (18.06): Per-weight learning rate, kötü koşullanmayı (özdeğer ölçek farkı) ağırlık bazında telafi etme girişimidir — bir tür diyagonal ön-koşullama (preconditioning).

İleriye: Per-parameter ölçekleme, büyük modellerde (transformer) eğitim kararlılığının anahtarıdır; LAMB, Adafactor gibi yöntemler bunu bellek-verimli yapar.

5.10 (Defazio) RMSprop ve Adam

RMSprop (root mean squared propagation, Hinton’ın ders slaytlarından): kare gradient’in üstel hareketli ortalamasını (\(v\) tamponu) tutar; sonra gradient’i bu ortalamanın kareköküne böler (eleman-bazlı). Böylece büyük-gradient’li yönlerde adım küçülür, küçük-gradient’li yönlerde büyür — otomatik per-weight ölçekleme. Sıfıra bölmeyi önlemek için bir \(\epsilon\) (\(\approx 10^{-7}\)) eklenir.

\[ \theta \leftarrow \theta - \frac{\eta}{\sqrt{v} + \epsilon}\, g \]

Adam (adaptive moment estimation) = RMSprop + momentum. Hem gradient’in (birinci moment) hem kare gradient’in (ikinci moment) üstel hareketli ortalamasını tutar; momentum’lu gradient’i RMSprop ölçeklemesiyle (\(\theta\leftarrow\theta-\frac{\eta}{\sqrt{v}+\epsilon}\,g\)) böler.

“Adam is RMSprop with momentum… I’d generally recommend using either SGD with momentum or Adam as your go-to methods.” — Defazio, 54:54 / 59:09

Adam’ın bir ek detayı bias correction: tamponlar sıfırdan başladığı için ilk adımlarda küçük kalırlar; bias correction bunu düzeltir (erken adımları ölçekler). Şekil 5.7 üstte kavramsal şemayı (Momentum + RMSprop → Adam), altta motor kanıtını (aynı vadide GD/Momentum/Adam yörüngeleri) verir.

Şekil 5.7: RMSprop ve Adam — adaptif per-weight öğrenme oranı. Üst panel kavramsal şema: iki kaynak modül — Momentum (1. moment, gradyan EMA, violet) ve RMSprop (2. moment, kare-grad EMA, θ←θ−η/(√v+ε)·g, gold) — birleşim oklarıyla Adam = RMSprop + Momentum + bias correction kutusunda birleşir. Annotation: büyük-grad yönünde adım küçülür, küçük-grad yönünde büyür → otomatik per-weight ölçek. Alt panel motor kanıtı: κ=20 eğik kuadratik vadide GD sabit-η ile zikzak çizip aşar, Momentum sönümlü salınır, Adam ise per-weight ölçekle koşullanmayı düzeltip minimuma düzgün iner (optimize_quad).
İpucuBuilder Notu — Adam = RMSprop + Momentum

Geriye (Stat 110): Üstel hareketli ortalama = geçmişi üstel sönümleyen ağırlıklı ortalama; ikinci moment = kare beklentisi (Stat 110 varyans/moment). Bias correction = tarafsız tahminci kurma (beklenti = gradient).

İleriye: AdamW (weight decay düzeltmeli Adam) bugün LLM eğitiminin varsayılan optimizer’ıdır; \(\epsilon\), \(\beta_1\), \(\beta_2\) ayarları pratik kararlardır.

5.11 (Defazio) “Optimization’ın Ölümü”: En Çok Kullanılan Yöntemin Teorisi Yanlış

Defazio bir optimizasyon araştırmacısı olarak çarpıcı bir itirafta bulunuyor — bu, LeCun’un Hafta 1’deki “kimse anlamıyor” temasının optimizasyon versiyonudur:

“I hate Adam because I’m an optimization researcher and the theory in their paper is wrong — this has been shown recently; the method in fact does not converge, and you can show this on very simple test problems.” — Defazio, 59:14

Yani modern ML’in en yoğun kullanılan yöntemlerinden biri, basit test problemlerinde bile yakınsamayabilir. Üstelik Adam, özellikle görüntü problemlerinde SGD’den daha kötü genelleme (generalization) verebilir — belki o “küçük, kötü yerel minimumlara” daha kolay düştüğü için. Yine de dil modelleri için Adam zorunludur (SGD ile eğitilemiyorlar). Defazio’nun pratik tavsiyesi nettir: SGD+momentum veya Adam dene; görüde genelde SGD+momentum, dilde Adam.

Bu bölüm dersin omurgasını özetler: optimizasyon bir teori değil, bir zanaattir — işe yarayanı biliyoruz, neden yaradığını tam bilmiyoruz. Şekil 5.8 bu zanaat kararını (görü → SGD+Momentum, dil → Adam) ve Defazio’nun dürüst uyarısını tek figürde toplar.

Şekil 5.8: Optimizasyon bir zanaattır, kapalı bir teori değil (Bölüm 9 — Defazio). Sol panel karar şeması: görü problemleri (CNN, sınıflandırma) için SGD + Momentum daha iyi genelleme verir; dil modelleri (Transformer, RNN) için Adam pratikte zorunludur. Sağ panel kötü koşullu kuadratik vadide (κ = 20) kanıt sunar: saf SGD vadinin dik ekseninde zikzak çizerken Adam adaptif adımıyla minimuma (★) daha düzgün ilerler. Defazio’nun dürüst uyarısı altta: Adam basit test problemlerinde yakınsamayabilir ve görüde daha kötü genelleyebilir — yine de büyük dil modelleri onsuz eğitilemez. ‘İşleyeni biliriz, neden yaradığını tam bilmeyiz’ (Hafta 1 ‘kimse tam anlamıyor’ yankısı).
İpucuBuilder Notu — Zanaat, Teori Değil

Geriye (Hafta 1): Bu, LeCun’un “it’s important to understand that nobody understands” (Hafta 1) cümlesinin optimizasyondaki tam karşılığıdır. Alan, kanıttan çok ampirik başarıyla ilerler.

İleriye: Adam’ın yakınsama sorunu → AMSGrad, AdamW gibi düzeltmeler; generalization farkı → “flat vs sharp minima” araştırması. Bunlar hâlâ açık problemler.

5.12 Bu Dersin Özeti

  1. Convolution = Toeplitz matrisiyle çarpım (Canziani): kernel kaydırılarak tekrarlanır, gerisi sıfır — seyrek (locality) + paylaşımlı (stationarity). “Bir sürü sıfırlı matris çarpımı.”
  2. Tam-bağlı vs convolution: ikisi de \(A\mathbf{x}\); FC’de kernel = tam satır, conv’da kernel = kaydırılan küçük pencere.
  3. Condition number \(\kappa = L/\mu\) (Defazio) yakınsama hızını belirler; learning rate “ıraksamanın eşiğinde” seçilir.
  4. SGD’yi kullan, gradient descent’i değil — veri artıklığını sömürür.
  5. Momentum’u neredeyse her zaman aç (\(\beta \approx 0.9\)): salınım sönümleme + noise smoothing.
  6. Adaptif yöntemler per-weight learning rate verir; RMSprop (kare-grad EMA ile böl) → Adam = RMSprop + momentum (+ bias correction).
  7. Pratik tavsiye: SGD+momentum veya Adam. Ama Adam’ın teorisi tartışmalı (yakınsama + generalization) — “optimization’ı tam anlamıyoruz”.
ÖnemliTek Bir Cümle

Convolution, yerel ve paylaşımlı bir Toeplitz matrisiyle çarpımdan ibarettir (Canziani); ve o ağı eğitmek, gradient descent’i veri artıklığı için SGD’ye, salınım+gürültü için momentum’a, kötü koşullanma için adaptif ölçeklemeye (RMSprop/Adam) çeviren — teorisi hâlâ eksik ama pratikte çalışan — bir zanaattir (Defazio).

5.13 Kontrol Soruları

Cevap: Kernel’i her satırda bir konum kaydırarak, geri kalanı sıfır bırakarak bir Toeplitz matrisi kurarsın; convolution = bu matrisle çarpım (“a matrix multiplication with a lot of zeros”, Canziani 27:55). İki özelliği: seyrek (her satırda yalnızca kernel kadar sıfır-olmayan eleman = locality) ve paylaşımlı (her satır aynı kaydırılmış kernel = stationarity/parameter sharing). Tam-bağlı katmanda kernel matrisin tam bir satırıdır (her girdiye bağlı, paylaşım yok); convolution’da kernel küçük, kaydırılan, paylaşılan bir penceredir — yani convolution, yapısı kısıtlanmış bir lineer katmandır.

Cevap: Condition number, kuadratik bir problemde Hessian’ın en büyük (\(L\)) ve en küçük (\(\mu\)) özdeğerlerinin oranıdır:

\[ \kappa = \frac{L}{\mu} \]

\(\kappa\) büyükse problem kötü koşullanmıştır (uzun ince vadi); gradient descent zikzak çizer, yavaşlar. Defazio “gradient descent kullanma” der çünkü ML kaybı çok sayıda benzer terimin toplamıdır (her veri noktası bir terim) ve bu yapıda artıklık (redundancy) vardır — küçük bir mini-batch zaten iyi bir yön verir, ve SGD aynı bütçeyle çok daha fazla adım atar. Tam-batch gradient descent bu artıklığı israf eder.

Cevap: İki sebep: (1) salınım sönümleme / acceleration — vadi duvarlarındaki zikzakı bastırır; (2) noise smoothing — gradient’lerin hareketli ortalamasını alıp SGD gürültüsünü yumuşatır, böylece son nokta çözümün iyi bir tahmini olur. Heavy-ball güncellemesi:

\[ p \leftarrow \beta p + \nabla \mathcal{L}(\theta), \qquad \theta \leftarrow \theta - \eta\, p \]

Tipik \(\beta = 0.9\). Defazio: “momentum’u neredeyse her zaman kullan” (27:52). (Nesterov acceleration teorik olarak convex problemlerde hızlandırır ama gürültü onu büyük ölçüde öldürür; pratikte asıl fayda noise smoothing’dir.)

Cevap: Adam (adaptive moment estimation) = RMSprop + momentum. RMSprop, kare gradient’in üstel hareketli ortalamasının kareköküne bölerek (eleman-bazlı, \(+\epsilon\)) per-weight ölçekleme yapar:

\[ \theta \leftarrow \theta - \frac{\eta}{\sqrt{v} + \epsilon}\, g \]

Adam buna gradient’in hareketli ortalamasını (momentum) ve bias correction’ı ekler. Defazio önerir çünkü pratikte çok iyi çalışır ve bazı ağlar (dil modelleri) onsuz eğitilemez; ama eleştirir çünkü orijinal yakınsama teoremi yanlıştır (“does not converge”, 59:14) ve görü problemlerinde SGD’den daha kötü genelleme verebilir. Pratik tavsiye: SGD+momentum (görü) veya Adam (dil) — “optimization’ı tam anlamıyoruz”.

5.14 Egzersizler

Egzersiz 1 (Convolution = Toeplitz). 1B kernel \(w = [1, 0, -1]\) ve girdi \(x = [1, 2, 3, 4, 5]\) için convolution’ı, uygun bir Toeplitz matrisi \(T\) kurup \(T \cdot x\) ile hesapla. Sonucu torch.nn.functional.conv1d ile karşılaştır. Matrisin kaç sıfır içerdiğini say (sparsity).

import torch
import torch.nn.functional as F
import numpy as np

w = [1, 0, -1]
x = np.array([1., 2., 3., 4., 5.])
k, n = len(w), len(x)
oh = n - k + 1
T = np.zeros((oh, n))                       # Toeplitz matrisi
for i in range(oh):
    T[i, i:i + k] = w
y_toeplitz = T @ x                          # -> [-2, -2, -2]

xt = torch.tensor(x, dtype=torch.float).view(1, 1, -1)
wt = torch.tensor(w, dtype=torch.float).view(1, 1, -1)
y_conv = F.conv1d(xt, wt).flatten()         # -> [-2, -2, -2]
print(y_toeplitz, y_conv, int((T == 0).sum()))   # eşit + sıfır sayısı

Egzersiz 2 (İki görüş). Bir 3×2 matris \(A\) ve vektör \(x\) için \(Ax\)’i (a) satır·\(x\) iç çarpımları, (b) sütunların ağırlıklı toplamı (\(A\mathbf{x}=\sum_j x_j\mathbf{a}_j\)) olarak ayrı ayrı hesapla; ikisinin aynı çıktığını doğrula.

import numpy as np
A = np.array([[2., -1.], [1., 3.], [0., 2.]])   # 3x2
x = np.array([4., -1.])
row_view = np.array([A[i] @ x for i in range(A.shape[0])])   # satır·x
col_view = x[0] * A[:, 0] + x[1] * A[:, 1]                   # sütun toplamı
print(row_view, col_view, np.allclose(row_view, col_view))

Egzersiz 3 (Learning rate süpürmesi). Basit bir kuadratik \(L(w) = (w-3)^2\) üzerinde gradient descent’i \(\eta \in \{0.01, 0.1, 0.5, 1.0, 1.01\}\) için koştur (Hafta 2 Egz 5). Hangi \(\eta\) ıraksıyor? “Edge of divergence” gözlemini Defazio’nun yorumuyla ilişkilendir.

import numpy as np
def run(lr, steps=50, w0=10.0):
    w = w0
    for _ in range(steps):
        w = w - lr * 2 * (w - 3)            # ∇L = 2(w-3)
    return w
for lr in [0.01, 0.1, 0.5, 1.0, 1.01]:
    print(lr, run(lr))                       # lr=1.01 -> ıraksar (|1-2lr|>1)

Egzersiz 4 (Optimizer karşılaştırması). Hafta 2’nin spiral ağını üç optimizer ile eğit: (a) SGD, (b) SGD+momentum(0.9), (c) Adam. Kayıp eğrilerini karşılaştır. Hangisi en hızlı, hangisi en kararlı? Momentum’un salınımı nasıl etkilediğini gözlemle.

import torch
import torch.nn as nn

net = nn.Sequential(nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 5))
opts = {
    "sgd": torch.optim.SGD(net.parameters(), lr=0.1),
    "momentum": torch.optim.SGD(net.parameters(), lr=0.1, momentum=0.9),
    "adam": torch.optim.Adam(net.parameters(), lr=1e-3),
}
# her opt icin: forward -> loss -> backward -> step (Hafta 2 dongusu)
# loss egrilerini kaydet ve karsilastir

Egzersiz 5 (Hafta 5 habercisi). Hafta 5 yalnızca Canziani’nin Practicum’u olacak: 1D/2D convolution’ın PyTorch’ta uygulanması ve otomatik türev (autograd). (a) torch.nn.functional.conv2d ile küçük bir görüntüye bir kenar dedektörü kernel’i uygula. (b) Bir tensöre requires_grad=True verip basit bir fonksiyonun .backward()’ını çağır; .grad’ı elle hesapladığınla karşılaştır. Bu, Hafta 2’nin backprop’unun PyTorch’taki otomatik hâlidir — neden “autograd” Hafta 2’nin doğal devamı?

import torch
x = torch.tensor(2.0, requires_grad=True)
y = x ** 3 + 2 * x                          # f(x) = x^3 + 2x
y.backward()                                # otomatik turev
print(x.grad)                               # 3x^2 + 2 = 14 (elle ile karsilastir)

5.15 Sonraki Ders İçin Hazırlık

UyarıSonraki Hafta — H5: 1D/2D Convolution ve Otomatik Türev (autograd) — yalnız Canziani

Convolution’dan autograd’a. Bu hafta convolution’ın cebirini (Toeplitz) ve ağı eğiten optimizasyon motorunu (SGD/momentum/Adam) gördük. Hafta 5’te lecture yok; yalnızca Canziani’nin Practicum’u convolution’ı PyTorch’ta somutlaştırır (conv1d/conv2d, boyutlar) ve autograd’ı gösterir — Hafta 2’de LeCun’un elle kurduğu Jacobian zincirinin PyTorch’taki otomatik karşılığı. Egzersiz 1 (Toeplitz) ve Egzersiz 5 (conv2d + autograd) tam bu derse hazırlar.

Hafta 5: 1D/2D Convolution ve Otomatik Türev (autograd) — yalnızca Canziani (Practicum)

Hafta 5’te lecture yok; Canziani convolution’ı PyTorch’ta somutlaştırır (conv1d/conv2d, boyutlar) ve autograd’ı gösterir — Hafta 2’de LeCun’un elle kurduğu Jacobian zincirinin PyTorch’taki otomatik karşılığı.

Hafta 5 öncesi yapılacak:

  • Egzersiz 1 (Toeplitz) ve Egzersiz 5 (conv2d + autograd) çöz.
  • “Convolution = bir sürü sıfırlı matris çarpımı” cümlesini kendi sözcüklerinle yaz.
  • Hafta 2’nin loss.backward()’ını hatırla — Hafta 5’te onun nasıl çalıştığını PyTorch içinden göreceğiz.

5.16 Anahtar Kavramlar (Cheat Sheet)

Kavram Tanım Hoca / timestamp
Matris × vektör — satır görüşü Çıktı elemanı = satır·girdi; kernel = matris satırı Canziani 13m31
Matris × vektör — sütun görüşü Çıktı = sütunların ağırlıklı toplamı Canziani 16m22
Toeplitz matrisi Kernel kaydırılarak tekrarlanmış seyrek matris Canziani 23m36
Convolution = matris çarpımı “Bir sürü sıfırlı matris çarpımı”; seyrek + paylaşımlı Canziani 27m55
Condition number κ L/μ (en büyük/en küçük özdeğer); yakınsama hızı Defazio 11m36
Edge of divergence En büyük güvenli learning rate; hız için ıraksama eşiği Defazio 13m42
SGD vs full-batch Veri artıklığını sömür; “gradient descent kullanma” Defazio 19m03
Momentum (heavy ball) Hız tamponu; salınım sönümleme + noise smoothing; β=0.9 Defazio 27m52
Adaptif yöntem Her ağırlığa ayrı learning rate Defazio 44m36
RMSprop Kare-grad EMA’nın köküne böl (+ε); per-weight ölçek Defazio 50m43
Adam RMSprop + momentum + bias correction Defazio 54m54
Optimization’ı anlamıyoruz Adam teorisi yanlış (yakınsamıyor); ama pratikte çalışır Defazio 59m14

5.17 ML Builder Bağlantıları

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

  1. Convolution = Toeplitz matris → 18.06 matris-vektör + Hafta 3 (locality/stationarity) + 18.065 yapılı matrisler.
  2. Condition number \(\kappa = L/\mu\) → 18.06 özdeğer + 18.065 koşullanma.
  3. Momentum = ivme → Calculus ikinci türev + fizik (Newton).
  4. EMA / ikinci moment → Stat 110 ağırlıklı ortalama, varyans/moment.
  5. SGD artıklık → Hafta 2 tarafsız tahminci + Stat 110 örneklem.

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

  1. Toeplitz/circulant → FFT ile hızlı convolution; im2col+GEMM, Winograd.
  2. SGD+momentum / Adam → AdamW (LLM varsayılanı), LAMB, Adafactor.
  3. Edge of divergence → LR warmup + cosine decay schedule.
  4. Adam yakınsama/generalization sorunu → AMSGrad, flat vs sharp minima araştırması.
ÖnemliBu dersten tek bir şey alıp gideceksen

Convolution gizemli bir işlem değil — yerel ve paylaşımlı bir Toeplitz matrisiyle çarpımdır (Canziani: “bir sürü sıfırlı matris çarpımı”); ve o ağı eğitmek, gradient descent’i veri artıklığı için SGD’ye, salınım ve gürültü için momentum’a, kötü koşullanma için adaptif ölçeklemeye (Adam) çeviren bir zanaattir — işe yarayanı biliriz, ama Defazio’nun dürüstçe itiraf ettiği gibi, neden yaradığını hâlâ tam anlamıyoruz.