7  Diziler — RNN, LSTM ve Attention

İki hocalı hafta: Yann LeCun (Lecture) yinelemeli ağların (RNN) mimarisini, vanishing/exploding gradient sorununu ve çözümlerini (gating — GRU/LSTM — ve attention) kurar; Alfredo Canziani (Practicum) RNN’in dört tipini, seq2seq encoder-decoder’ı ve PyTorch’ta dizi eğitimini somutlaştırır — sabit boyutlu girdiden değişken uzunluklu diziye geçiş.

NotBölüm bilgisi

7.1 Bu Derste Ne Var?

Hafta 5’in sonunda bıraktığımız soru: girdiler hep sabit boyutluydu (görüntü, vektör) — ama bir cümle, bir ses dalgası, bir zaman serisi değişken uzunlukta bir dizidir. Bu hafta dizileri işleyen mimarilere geçiyoruz: yinelemeli ağlar (RNN), onların hafıza varyantları LSTM/GRU, ve modern dünyayı kuran fikir attention.

Yine iki hocalı. Yann LeCun (Lecture) RNN’in mimarisini ve temel sorununu (vanishing gradient) kurar, sonra çözümleri — GRU/LSTM ve attention — anlatır. Alfredo Canziani (Practicum) RNN’in dört tipini (girdi/çıktı dizi mi vektör mü) ve eğitimini PyTorch’ta somutlaştırır.

Bu haftanın üç ana fikri:

  1. RNN = zaman içinde paylaşılan bir katman. Bir gizli durum (hidden state) geçmişi taşır; aynı ağırlıklar her zaman adımında tekrar kullanılır — recurrence \(z_t = g(W_x x_t + W_z z_{t-1} + b)\).
  2. Naif RNN’ler uzun bağımlılıkta başarısız (vanishing/exploding gradient); çözüm gating + memory cell (GRU, LSTM).
  3. Attention, ağın hangi girdiye odaklanacağını öğrenmesidir — öğrenilen ağırlıklı birleşim \(c = w_1 v_1 + w_2 v_2\) (\(w_2 = 1 - w_1\)), transformer’ların (Hafta 12) çekirdeği.

flowchart TB
    subgraph LeCun["(A) RNN'in mantığı (LeCun)"]
        direction LR
        Seq["Diziler<br/>(değişken uzunluk + sıra)"]
        Rec["Gizli durum / recurrence<br/>zₜ = g(Wₓxₜ + W_z zₜ₋₁ + b)"]
        Unroll["Zamanda açma (unrolling)<br/>+ backprop through time"]
        Vanish["Vanishing / exploding<br/>gradient (uzun bağımlılık)"]
        Fix["Çözüm: gating (LSTM/GRU)<br/>+ attention"]
        Seq --> Rec
        Rec --> Unroll
        Unroll --> Vanish
        Vanish --> Fix
    end

    subgraph Canziani["(B) RNN pratiği (Canziani)"]
        direction LR
        Types["RNN'in 4 tipi<br/>(vec/seq × vec/seq)"]
        S2S["Seq2seq<br/>(encoder-decoder darboğazı)"]
        Train["Next-token eğitimi<br/>(diziyi batch'le, sonrakini tahmin et)"]
        Types --> S2S
        S2S --> Train
    end

    Fix -. "attention seq2seq darboğazını çözer" .-> S2S

İpucuBuilder Notu — Diziler = Değişken Uzunluk

Geriye (önkoşul kurslar):

  • RNN recurrence → Hafta 2 “afin + nonlinearite” (döndür-ez) atomunun zamanda tekrarı; ağırlık paylaşımı Hafta 3 convolution’ın zaman eksenindeki kuzeni.
  • Vanishing gradient → Hafta 2 backprop (Jacobian zinciri) + Hafta 4 (doygun nonlinearite türevi küçültür) + Calculus zincir kuralı.
  • Hidden state → Stat 110 Markov (durum geçmişi özetler).

İleriye (production / research):

  • Attention → transformer (Hafta 12), modern dil modellerinin tamamı.
  • Seq2seq encoder-decoder → makine çevirisi, konuşma tanıma, her dizi-dizi görevi.

Tek cümleyle: RNN, aynı katmanı bir gizli durumla zaman içinde tekrar uygulayarak değişken uzunlukta dizileri işler; ama uzun bağımlılıkta vanishing gradient’e takılır — bu yüzden gating (LSTM/GRU) ve attention icat edildi.

7.2 (LeCun) Diziler Neden Farklı?

Şimdiye kadarki ağlar sabit boyutlu girdi alıyordu. Ama gerçek dünyanın çoğu dizidir: metin (kelime dizisi), ses (örnek dizisi), video (kare dizisi). İki zorluk: (1) değişken uzunluk — “film iyiydi” 2 kelime, başka cümle 20 kelime; sabit-girdili bir ağ bunu alamaz. (2) sıra önemlidir — kelimelerin sırası anlamı değiştirir.

LeCun’un çerçevesi: bir diziyi işlemek, onu okurken bir özet (gizli durum) tutmak ve her yeni öğeyle bu özeti güncellemektir. “En olası karakter dizisi nedir?” gibi sorular (dil modelleme, posta kodu okuma) bu yapıyı gerektirir.

İpucuBuilder Notu — Değişken Uzunluk = Hafta 5’in Cevabı

Geriye (Hafta 5): Bu, Hafta 5 Egzersiz 5’in cevabıdır: değişken-uzunluk diziyi sabit-girdili ağa veremezsin; gizli durumlu bir tekrar gerekir. Dinamik hesaplama grafiği (Hafta 5) tam da bunu mümkün kılar.

İleriye: “Diziyi okurken durum tut” fikri; RNN’den transformer’a, durum-uzayı modellerine (Mamba) kadar tüm dizi modellemenin ortak temasıdır.

7.3 (LeCun) RNN Mimarisi: Gizli Durum ve Zamanda Açma

Bir RNN, her zaman adımında aynı yinelemeli katmanı uygular. \(t\) adımında, katman hem o anki girdiyi \(x_t\) hem de bir önceki gizli durumu \(z_{t-1}\) alır ve yeni durumu üretir:

\[ z_t = g\!\left(W_x\, x_t + W_z\, z_{t-1} + b\right) \]

Buradaki \(W_x\), \(W_z\) her adımda paylaşılır (Hafta 3’ün ağırlık paylaşımının zaman eksenindeki hâli). Gizli durum \(z_t\), dizinin o ana kadarki “özetidir”.

LeCun bunu zamanda açma (unrolling) ile görselleştiriyor: yinelemeli ağı, her zaman adımı için bir kopya olacak şekilde düz bir ağa açarsın; sonra normal backprop uygularsın — buna zaman içinde geri yayılım (backprop through time) denir. Şekil 7.1 bu iki bakışı bir arada gösterir: solda geri-besleme döngülü tek hücre, sağ-üstte aynı hücrenin zamanda açılmış (her kutu PAYLAŞILAN \(W_x, W_z\)) hâli, sağ-altta rnn_forward ile hesaplanan gerçek gizli durum dizisi.

“this technique of unrolling and then back propagating [is how you train recurrent nets].” — LeCun, 47:37

Şekil 7.1: RNN özyineleme ve zamanda açma: Sol panelde tek bir RNN hücresi — girdi xₜ ile bir önceki gizli durum zₜ₋₁ afin dönüşüme (Wₓxₜ + W_z zₜ₋₁ + b) girer, tanh ile sıkıştırılır ve yeni gizli durum zₜ üretilir; kesikli geri-besleme döngüsü zₜ çıkışını bir sonraki adımda zₜ₋₁ olarak hücreye geri verir. Sağ-üst panelde aynı hücre zamanda açılır (unrolling): her kutu PAYLAŞILAN aynı Wₓ, W_z ağırlıklarını kullanır — bu, zaman ekseni boyunca ağırlık paylaşımıdır (Hafta 3’teki uzamsal evrişim paylaşımının kuzeni). Sağ-alt panelde rnn_forward ile hesaplanan gerçek beş-adımlık gizli durum dizisi Z[5,3]: üç birimin değerleri tanh sayesinde [−1, 1] aralığında kalır ve adımdan adıma evrilir.
İpucuBuilder Notu — Zamanda Döndür-Ez

Geriye (Hafta 2): Açılmış RNN, sıradan bir derin ağdır; eğitimi Hafta 2’nin backprop’unun (Jacobian zinciri) ta kendisidir — yalnızca ağırlıklar zaman boyunca paylaşılır.

İleriye: Unrolling, değişken-uzunluk için dinamik grafik (Hafta 5) ister; çok uzun dizilerde “truncated backprop through time” ile pencerelenir.

7.4 (LeCun) Vanishing/Exploding Gradient

Naif RNN’in temel sorunu: uzun dizilerde gradient ya kaybolur (vanishing) ya da patlar (exploding). Sebep, backprop through time’da gradient’in aynı yinelemeli matristen defalarca geçmesidir; 50 adım sonra bu çarpımlar ya sıfıra iner ya sonsuza gider. Şekil 7.2 bunu tek bir özdeğer \(\lambda\) üzerinden somutlaştırır: aynı matristen \(n\) kez geçen gradient \(\lambda^n\) olarak ölçeklenir — \(\lambda < 1\) söner, \(\lambda = 1\) sabit kalır, \(\lambda > 1\) patlar.

“by the time you get to the 50th time step… [you hit] the vanishing gradient problem.” — LeCun, 49:15

Sonuç: gizli durum \(z_t\) teoride bilgiyi uzun süre saklayabilmeli, ama vanishing gradient yüzünden naif RNN bunu pratikte yapamaz — uzun bağımlılıkları öğrenemez.

Şekil 7.2: Sönen/patlayan gradient: aynı matristen n kez geçen gradient λⁿ olarak ölçeklenir. Log-y ekseninde λ=0.5 (violet) sönerek 50. adımda 0.5⁵⁰ ≈ 8.9e-16’ya iner (vanishing), λ=1.0 (gri kesikli) sabit kalır, λ=1.5 (gold) patlayarak 1.5⁵⁰ ≈ 6.4e8’e çıkar (exploding). Naif RNN, aynı geçiş matrisinden birçok kez geçtiği için uzun bağımlılığı öğrenemez.
İpucuBuilder Notu — Vanishing = Uzun Zincir

Geriye (Hafta 2 + 4): Vanishing gradient, Hafta 2’nin zincir kuralının ve Hafta 4’ün “doygun nonlinearite türevi gradient’i küçültür” gözleminin uzun-zincir hâlidir; aynı matrisin tekrar tekrar çarpılması özdeğerleri 1’den uzaksa patlama/sönme yaratır (18.06).

İleriye: Çözümler: gating (bu hafta GRU/LSTM), gradient clipping (exploding için), residual bağlantılar, ve nihayetinde attention (uzun bağımlılığı tek adımda kurar).

7.5 (LeCun) Attention: Hangi Girdiye Odaklan?

LeCun attention’ı bir ağırlıklı birleşim olarak tanıtıyor: ağ, birkaç girdiyi sabit ağırlıklarla değil, kendi seçtiği ağırlıklarla birleştirir. En basit hâlde iki girdi için ağırlıklar toplamı 1’dir:

\[ c = w_1 v_1 + w_2 v_2, \qquad w_2 = 1 - w_1 \]

Bu ağırlıkları başka bir ağ üretir; böylece model bir girdiye odaklanıp ötekileri görmezden gelebilir. Şekil 7.3 bunu somutlaştırır: ham hizalama skorları softmax’tan geçirilir, toplamı 1 olan bir odak dağılımı çıkar, ve çıktı \(c = \sum_i w_i v_i\) ağırlıklı toplamıdır — ağ en yüksek ağırlığı vererek hangi girdiye odaklanacağını seçer.

“[attention] allows a neural net to basically focus its attention on a particular input and ignoring the others.” — LeCun, 57:53

LeCun’un kritik notu: transformer mimarileri ve her tür attention, bu basit “öğrenilen ağırlıklı birleşim” trick’ini kullanır. Yani Hafta 12’nin transformer’ı, bu çekirdeğin ölçeklenmiş hâlidir.

Şekil 7.3: Attention öğrenilen ağırlıklı birleşim olarak. Ham hizalama skorları softmax’tan geçirilir → ağırlıklar wᵢ (toplam 1, bir olasılık/odak dağılımı). Çıktı, girdi vektörlerinin ağırlıklı toplamıdır: c = Σ wᵢvᵢ. Ağ, en yüksek ağırlığı vererek hangi girdiye ODAKLANACAĞINI seçer (burada v₁, w=0.59); bu mekanizma transformer’ın çekirdeğidir (Hafta 12).
İpucuBuilder Notu — Attention = Softmax Odak

Geriye (Hafta 1): Attention ağırlıkları toplamı 1 olan bir olasılık dağılımıdır (softmax) — Stat 110 + Hafta 1 softmax. “Odaklan” = yüksek ağırlık ver.

İleriye: Attention, RNN’in sıralı darboğazını aşar (her konum her konuma doğrudan bakar); transformer (Hafta 12), self-attention’ın çok-başlı, ölçekli hâlidir.

7.6 (LeCun) GRU ve LSTM: Gating ve Memory Cell

Vanishing gradient’i çözmenin ana yolu gating’dir. GRU (Cho, 2014) ve LSTM (Hochreiter & Schmidhuber, 1997), gizli duruma bir memory cell (hafıza hücresi) ve bunu kontrol eden kapılar (gates) ekler. Bir gating vektörü \(z_t\), durumu ne kadar güncelleyeceğini belirler: uçta \(z_t = 1\) ise eski durumu olduğu gibi kopyalar, girdiyi yok sayar — yani bir hafıza gibi davranır. Şekil 7.4 bu kararı bir gradient otoyolu olarak çizer: kopyala yolu (gold) eski durumu sönmeden taşır, güncelle yolu (violet) gizli durumu yeni girdiyle değiştirir.

“if Z equals 1, it just copies its previous state and ignores the input, so it acts like a memory essentially.” — LeCun, 1:01:55

Bu “kopyala” yolu, gradient’in uzun mesafede bozulmadan akmasını sağlar (vanishing gradient’i hafifletir). LSTM (1997) aynı sorunu daha erken çözmüştü; GRU daha sade bir varyanttır.

Şekil 7.4: GRU/LSTM kapısının (gating) şematik gösterimi. Önceki gizli durum \(z_{t-1}\) ve girdi \(x_t\) merkezdeki KAPI’ya (kontrol, \(z_t=\sigma(\cdots)\)) girer. Kapı iki yol arasında karar verir: \(z_t=1\) ise KOPYALA yolu (gold otoyol) eski durumu aynen taşır, girdiyi yoksayar — bu kestirme/kimlik bağlantısı sayesinde gradient \(\times 1\) ile sönmeden geriye akar; \(z_t=0\) ise GÜNCELLE yolu (violet) gizli durumu yeni girdiyle değiştirir. Kopyala yolu, residual/kimlik bağlantısının zaman-atasıdır ve LSTM hücre belleğindeki uzun-vadeli hafızayı mümkün kılarak vanishing gradient’i hafifletir.
İpucuBuilder Notu — Memory Cell = Residual’in Atası

Geriye (Hafta 2): Memory cell’in “kopyala” yolu, bir tür residual/kimlik bağlantısıdır — gradient’i 1 ile çarparak (sönmeden) taşır; bu, derin ağlardaki residual bağlantının (Hafta 2 ileriye notu) zaman eksenindeki atasıdır.

İleriye: LSTM/GRU 2010’larda NLP/konuşmanın standardıydı; transformer’lar (Hafta 12) çoğu görevde onları geçti, ama uzun-bağlam ve verimlilik için RNN-benzeri fikirler (SSM, Mamba) geri dönüyor.

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

LeCun RNN’in nedenini ve sorunlarını (vanishing gradient → gating, attention) kurdu. Şimdi Canziani RNN’i pratiğe indiriyor: bir RNN’in girdi/çıktısı dizi mi vektör mü olduğuna göre dört farklı tipi, ve PyTorch’ta nasıl eğitildiğini gösteriyor. LeCun teoriyi, Canziani şekli ve kodu veriyor.

7.8 (Canziani) RNN’in Dört Tipi

Canziani RNN’leri girdi ve çıktının dizi mi vektör mü olduğuna göre dörde ayırıyor:

  1. Vektör → Dizi: tek girdi, dizi çıktı (örn. görüntü → altyazı/caption).
  2. Dizi → Vektör: dizi girdi, tek çıktı (örn. cümle → duygu sınıfı; ara çıktıları umursamaz, yalnızca sondaki).
  3. Dizi → Dizi (eşzamanlı): her girdiye bir çıktı (örn. etiketleme).
  4. Dizi → Vektör → Dizi: dizi önce tek bir vektöre sıkışır, sonra yeni bir dizi üretir (örn. çeviri — birazdan).

Bu dört kalıp, “değişken-uzunluk girdi/çıktıyı nasıl kurarsın?” sorusunun tüm yanıtlarını kapsar. Şekil 7.5 dördünü tek bir 2×2 panelde, NYU violet girdi ve gold çıktı renk anahtarıyla yan yana koyar.

Şekil 7.5: Canziani’nin dört tekrarlayan ağ (RNN) tipi: (1) Vektör→Dizi (görüntü→altyazı), (2) Dizi→Vektör (cümle→duygu), (3) Dizi→Dizi hizalı etiketleme, (4) Dizi→Vektör→Dizi çeviri (darboğaz). NYU violet girdi, gold çıktı, açık gizli durum.
İpucuBuilder Notu — 4 Tip Taksonomi

Geriye (Hafta 5): Her tip, değişken-uzunluk diziyi işlemek için dinamik grafik (Hafta 5) ister; gizli durum, Hafta 2’nin “döndür-ez” katmanının zamanda tekrarıdır.

İleriye: Bu taksonomi (vec/seq giriş × vec/seq çıkış) bugün de geçerli; transformer’lar aynı dört kalıbı encoder/decoder kombinasyonlarıyla kurar.

7.9 (Canziani) Seq2Seq: Encoder-Decoder ve Çeviri

Dördüncü tip — dizi → vektör → dizi — makine çevirisinin klasik kalıbıdır (seq2seq). Bir encoder RNN, girdi cümlesini (örn. “bugün çok mutluyum”) tek bir gizli vektöre sıkıştırır (H); bir decoder RNN bu vektörden hedef dildeki diziyi (İngilizce çeviri) üretir. Şekil 7.6 bu mimariyi ve bağlam-vektörü darboğazını çizer: tüm cümlenin tek H’ye sıkışması, decoder’ın her adımda tüm encoder durumlarına bakmasını sağlayan attention’ı doğurdu.

Canziani’nin gizli temsil tanımı, Hafta 2’nin atomunun tekrarıdır: gizli katman = girdinin afin dönüşümü + önceki gizlinin afin dönüşümü, sonra nonlinearite (“döndür-ez”, ama bu kez iki kaynaktan).

Şekil 7.6: Seq2seq encoder–decoder mimarisi ve bağlam-vektörü darboğazı: girdi cümlesi (‘bugün’, ‘çok’, ‘mutluyum’) encoder RNN zincirinden geçip tek bir H bağlam vektörüne sıkıştırılır, decoder RNN zinciri bu H’den çıktı dizisini (‘I’, ‘am’, ‘very’, ‘happy’) üretir. Tüm cümlenin tek vektöre sıkışması bir darboğaz oluşturur ve bu sınırlama, decoder’ın her adımda tüm encoder durumlarına bakmasını sağlayan attention mekanizmasını doğurdu.
İpucuBuilder Notu — Encoder-Decoder Darboğazı

Geriye (Hafta 2): RNN gizli durumu = nonlinear(afin(girdi) + afin(önceki durum)) — Hafta 2’nin “döndür-ez” atomunun iki-girişli, zamanda-tekrarlı hâli.

İleriye: Encoder-decoder darboğazı (tüm cümleyi tek vektöre sıkıştırmak) attention’ı doğurdu (decoder her adımda tüm encoder durumlarına bakar); bu, transformer’a giden yoldur.

7.10 (Canziani) RNN Eğitimi: Diziyi Batch’lere Bölmek

Canziani RNN eğitimini PyTorch’ta gösteriyor. Çok uzun bir diziyi (örn. bir metin) tek seferde işlemek pratik değildir; bu yüzden uzun dizi parçalara (batch) bölünür. Model bir parçayı görür ve bir sonraki karakter/sembol dizisini tahmin etmeye zorlanır (örn. “ABC” verilince “BCD” üret).

Bu, dil modellemenin çekirdeğidir: bir diziyi oku, bir sonrakini tahmin et — Hafta 1’in “next token” sezgisinin RNN hâli. Eğitim yine Hafta 2’nin döngüsüdür (forward → loss → backward → step); tek fark, backward’ın zamanda açılmış ağ boyunca akmasıdır (backprop through time). Şekil 7.7 bu “bir kaydır” hedefini (girdi A B C D → hedef B C D E) ve altındaki Hafta 2 eğitim döngüsünü (forward → kayıp → backward → adım) bir arada gösterir.

Şekil 7.7: Sonraki-sembol eğitimi, dil modellemenin çekirdeğidir. Üstte hizalanmış iki satır: alt satır girdi (A B C D), üst satır hedef — girdinin bir sembol kaydırılmış hâli (B C D E); oklar her konumda “bir sonrakini tahmin et” eşlemesini gösterir. Altta Hafta 2 eğitim döngüsü forward → kayıp (cross-entropy) → backward → adım (SGD), zaman içinde geri yayılım (BPTT) ile her batch için tekrarlanır. Diziyi batch’le ve her konumda bir sonraki sembolü tahmin et — bu, büyük dil modellerinin (LLM) çalışma ilkesidir.
İpucuBuilder Notu — Next-Token = LLM İlkesi

Geriye (Hafta 2 + 5): Eğitim döngüsü Hafta 2’nin aynısı; loss.backward() (Hafta 5 autograd), açılmış RNN’in zaman-zincirini otomatik yürütür.

İleriye: “Bir sonrakini tahmin et” hedefi (next-token prediction), bugünkü tüm büyük dil modellerinin eğitim ilkesidir; RNN’den transformer’a değişen mimari, ilke değil.

7.11 Bu Dersin Özeti

  1. Diziler değişken uzunlukta + sıralıdır; sabit-girdili ağ yetmez. RNN, bir gizli durumla diziyi okur.
  2. RNN recurrence: \(z_t = g(W_x x_t + W_z z_{t-1} + b)\); ağırlıklar zaman boyunca paylaşılır. Eğitim = unrolling + backprop through time.
  3. Vanishing/exploding gradient: naif RNN uzun bağımlılığı öğrenemez (aynı matristen tekrar tekrar geçen gradient söner/patlar).
  4. GRU/LSTM: gating + memory cell; \(z_t = 1\) ile durumu kopyala → gradient bozulmadan akar.
  5. Attention: öğrenilen ağırlıklı birleşim (\(w_2 = 1 - w_1\)); ağ hangi girdiye odaklanacağını seçer → transformer’ın çekirdeği.
  6. Canziani: RNN’in 4 tipi (vec/seq × vec/seq); seq2seq encoder-decoder (çeviri); eğitim = diziyi batch’le, bir sonrakini tahmin et.
ÖnemliTek Bir Cümle

RNN, aynı “döndür-ez” katmanını bir gizli durumla zaman içinde tekrar uygulayarak değişken-uzunluk dizileri işler; naif hâli vanishing gradient’e takılır, bu yüzden gating (LSTM/GRU, “kopyala” yolu) ve attention (“hangi girdiye odaklan”) icat edildi — ve attention, Hafta 12’nin transformer’ının çekirdeğidir.

7.12 Kontrol Soruları

Cevap: Yineleme:

\[ z_t = g\!\left(W_x\, x_t + W_z\, z_{t-1} + b\right) \]

\(z_t\) = gizli durum (dizinin o ana kadarki özeti), \(x_t\) = o anki girdi, \(z_{t-1}\) = önceki durum. Ağırlık paylaşımı: \(W_x\) ve \(W_z\) her zaman adımında aynıdır — tıpkı Hafta 3’te convolution kernel’inin her uzamsal konumda paylaşılması gibi, ama bu kez zaman ekseninde. Bu, hem parametreyi sınırlar hem de modelin her konumda aynı işlemi yapmasını sağlar.

Cevap: Backprop through time’da gradient, aynı yinelemeli matristen (\(W_z\)) ve nonlinearite türevinden defalarca geçer. Bu matrisin özdeğerleri 1’den küçükse gradient katlanarak söner (vanishing), büyükse patlar (exploding) — 50 adım sonra pratik olarak sıfır/sonsuz olur (LeCun 49:15). Sonuç: gizli durum teoride bilgiyi uzun süre tutabilmeli, ama gradient ulaşamadığı için naif RNN uzun bağımlılıkları öğrenemez. (Hafta 2 zincir kuralı + Hafta 4 doygun türev’in uzun-zincir hâli.)

Cevap: GRU/LSTM, gizli duruma bir memory cell ve onu kontrol eden kapılar (gates) ekler. Bir gating vektörü \(z_t\), durumu ne kadar güncelleyeceğini belirler. Uçta \(z_t = 1\) ise model eski durumu olduğu gibi kopyalar, girdiyi yok sayar (LeCun 1:01:55) — yani bir hafıza gibi davranır. Bu “kopyala” yolu, gradient’i 1 ile çarparak (sönmeden) uzun mesafede taşır — residual/kimlik bağlantısının zaman eksenindeki atası. Böylece uzun bağımlılıklar öğrenilebilir.

Cevap: En basit attention, öğrenilen ağırlıklarla bir birleşimdir:

\[ c = w_1 v_1 + w_2 v_2, \qquad w_2 = 1 - w_1 \]

Ağırlıkları (\(w_1\)) başka bir ağ üretir ve toplamları 1’dir (softmax → olasılık dağılımı). “Odaklanma” = bir girdiye yüksek ağırlık verip ötekileri görmezden gelmek (LeCun 57:53). Bu trick, transformer’ın (Hafta 12) çekirdeğidir: self-attention, her token’ın tüm token’lara öğrenilen ağırlıklarla bakmasıdır — RNN’in sıralı darboğazını aşar.

7.13 Egzersizler

Egzersiz 1 (RNN elle). Bir RNN hücresini NumPy ile yaz: \(z_t = \tanh(W_x x_t + W_z z_{t-1} + b)\). 3 zaman adımlı kısa bir dizi için \(z_0 = 0\)’dan başlayıp \(z_1, z_2, z_3\)’ü elle hesapla. Aynı \(W_x, W_z\)’nin her adımda kullanıldığını gözlemle (ağırlık paylaşımı).

import numpy as np

Wx = np.array([[0.5, -0.3], [0.2, 0.4]])    # girdi -> gizli (2x2)
Wz = np.array([[0.1, 0.6], [-0.2, 0.3]])    # gizli -> gizli (2x2, PAYLASILAN)
b = np.array([0.0, 0.0])
X_seq = np.array([[1.0, 0.0], [0.5, 1.0], [-1.0, 0.5]])   # 3 zaman adimi

z = np.zeros(2)                              # z0 = 0
for t, x in enumerate(X_seq):
    z = np.tanh(Wx @ x + Wz @ z + b)         # ayni Wx, Wz her adimda
    print(f"z{t+1} =", np.round(z, 3))       # z1, z2, z3

Egzersiz 2 (Vanishing gradient). \(W_z = 0.5 \cdot I\) (özdeğer 0.5) ile 50 adım çarp: \(0.5^{50} \approx ?\) Sonra \(W_z = 1.5 \cdot I\) ile: \(1.5^{50} \approx ?\) Birincisi neden vanishing, ikincisi neden exploding gradient’i temsil eder, açıkla.

# Ayni matristen 50 kez gecen gradient: lambda^50
print(0.5 ** 50)     # ~8.9e-16 -> sifira iner (VANISHING)
print(1.0 ** 50)     # 1.0      -> sabit
print(1.5 ** 50)     # ~6.4e8   -> patlar  (EXPLODING)
# lambda<1: gradient soner -> uzak gecmis ogrenilemez
# lambda>1: gradient patlar -> egitim kararsiz (gradient clipping gerekir)

Egzersiz 3 (4 tip). Şu görevleri RNN’in 4 tipinden hangisine eşle: (a) film yorumu → yıldız sayısı, (b) görüntü → altyazı, (c) İngilizce cümle → Türkçe cümle, (d) her kelimeye kelime-türü etiketi. Hangisi seq2vec, vec2seq, seq2seq, seq2vec2seq?

# (a) film yorumu -> yildiz sayisi   : DIZI -> VEKTOR   (seq2vec)
# (b) goruntu -> altyazi             : VEKTOR -> DIZI   (vec2seq)
# (c) Ing. cumle -> Tr. cumle        : DIZI -> VEKTOR -> DIZI (seq2vec2seq, ceviri)
# (d) her kelimeye tur etiketi       : DIZI -> DIZI     (seq2seq, hizali)
gorevler = {
    "a_yorum_yildiz": "seq2vec",
    "b_goruntu_altyazi": "vec2seq",
    "c_ceviri": "seq2vec2seq",
    "d_etiketleme": "seq2seq",
}
for k, v in gorevler.items():
    print(k, "->", v)

Egzersiz 4 (PyTorch RNN). nn.RNN ve nn.LSTM ile küçük bir dizi modeli kur; rastgele bir dizi ver, çıktı ve gizli durum şekillerini incele. nn.RNN vs nn.LSTM parametre sayısını karşılaştır — neden LSTM daha çok?

import torch
import torch.nn as nn

x = torch.randn(1, 5, 3)                      # (batch, dizi_uzunlugu, ozellik)
rnn = nn.RNN(input_size=3, hidden_size=8, batch_first=True)
lstm = nn.LSTM(input_size=3, hidden_size=8, batch_first=True)

out_r, h_r = rnn(x)
out_l, (h_l, c_l) = lstm(x)
print(out_r.shape, h_r.shape)                 # (1,5,8) (1,1,8)
print(out_l.shape, h_l.shape, c_l.shape)      # (1,5,8) (1,1,8) (1,1,8) -> +cell state
print(sum(p.numel() for p in rnn.parameters()))   # RNN parametre sayisi
print(sum(p.numel() for p in lstm.parameters()))  # ~4x: LSTM 4 kapi/transform
# LSTM daha cok: girdi+unut+cikti kapisi + aday hucre = 4 ayri afin donusum

Egzersiz 5 (Hafta 7 habercisi — EBM). Şimdiye kadar ağ bir girdiye tek çıktı verdi (Hafta 1). Ama bazı problemlerde bir girdiye birden çok geçerli cevap vardır (örn. bir cümlenin birçok çevirisi). (a) Tek-çıktılı bir ağ bunu neden temsil edemez? (b) Hafta 1’de LeCun’un kısaca değindiği enerji-tabanlı model (EBM) fikrini hatırla: cevapları bir enerji fonksiyonunun minimumları yapmak. Bu, Hafta 7’de kursun teorik omurgasına (EBM) girişi motive eder — neden?

# (a) tek-ciktili ag: bir girdi -> bir cevap (fonksiyon y=f(x))
#     ama bir cumlenin BIRDEN COK gecerli cevirisi var -> tek fonksiyon yetmez
# (b) EBM: cevaplari bir enerji fonksiyonu F(x, y) ile puanla;
#     dusuk enerji = uyumlu cevap. COKLU minimum = coklu gecerli cevap.
#     cikarim = enerji minimizasyonu (tek f(x) degil) -> Hafta 7 omurgasi
import numpy as np
y = np.linspace(-3, 3, 200)
F = -np.exp(-(y - 1.2) ** 2) - 0.9 * np.exp(-(y + 1.4) ** 2)   # 2 kuyu = 2 cevap
print("yerel minimum sayisi:", 2)        # iki gecerli cevap (cok-modlu)

7.14 Sonraki Ders İçin Hazırlık

UyarıSonraki Hafta — H7: Enerji-Tabanlı Modeller (EBM) ve Autoencoder

Tek çıktıdan enerji manzarasına. Bu haftaya kadar ağ bir girdiye tek çıktı verdi; Hafta 7, kursun teorik omurgasına giriyor: LeCun’un en sevdiği konu, enerji-tabanlı modeller (EBM). Hafta 1’de kısaca değinilen “cevaplar = enerji fonksiyonunun minimumları” fikri burada açılıyor (çoklu minimum = çoklu geçerli cevap); Canziani autoencoder’ları gösterecek. Egzersiz 5 (EBM sezgisi) ve Egzersiz 2 (vanishing gradient) tam bu derse hazırlar.

Hafta 7: Enerji-Tabanlı Modeller (EBM) ve Autoencoder — LeCun (Lecture) + Canziani (Practicum)

Hafta 7, kursun teorik omurgasına giriyor: LeCun’un en sevdiği konu, enerji-tabanlı modeller (EBM). Hafta 1’de kısaca değinilen “cevaplar = enerji fonksiyonunun minimumları” fikri burada açılıyor; Canziani autoencoder’ları gösterecek.

Hafta 7 öncesi yapılacak:

  • Egzersiz 2 (vanishing gradient) ve Egzersiz 5 (EBM sezgisi) çöz.
  • “Attention = öğrenilen ağırlıklı birleşim, hangi girdiye odaklan” cümlesini kendi sözcüklerinle yaz.
  • Hafta 1’in EBM teaser’ını (çıkarım = enerji minimizasyonu) tekrar oku.

7.15 Anahtar Kavramlar (Cheat Sheet)

Kavram Tanım Hoca / timestamp
Gizli durum (hidden state) Dizinin o ana kadarki özeti; zaman içinde taşınır LeCun 44m43
RNN recurrence \(z_t = g(W_x x_t + W_z z_{t-1} + b)\); ağırlık zamanda paylaşılır LeCun 48m05
Unrolling / BPTT Zamanda açıp normal backprop = backprop through time LeCun 47m37
Vanishing/exploding gradient Uzun dizide gradient söner/patlar; naif RNN’i sınırlar LeCun 49m15
Attention Öğrenilen ağırlıklı birleşim; hangi girdiye odaklan LeCun 57m53
GRU / LSTM Gating + memory cell; \(z_t = 1\) → kopyala (gradient akışı) LeCun 1h01m55
RNN 4 tipi vec→seq, seq→vec, seq→seq, seq→vec→seq Canziani 0m26
Seq2Seq Encoder diziyi vektöre sıkıştırır, decoder dizi üretir Canziani 9m00
RNN gizli temsil nonlinear(afin(girdi) + afin(önceki durum)) Canziani 14m59
RNN eğitimi Diziyi batch’le; bir sonraki sembolü tahmin et Canziani 18m21

7.16 ML Builder Bağlantıları

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

  1. RNN recurrence = döndür-ez (zamanda) → Hafta 2 afin+nonlinearite + Hafta 3 ağırlık paylaşımı.
  2. Vanishing gradient → Hafta 2 zincir kuralı + Hafta 4 doygun türev + 18.06 özdeğer.
  3. Hidden state = durum özeti → Stat 110 Markov.
  4. Attention = softmax ağırlık → Hafta 1 softmax + Stat 110 olasılık dağılımı.
  5. BPTT → Hafta 5 autograd (açılmış ağda otomatik backward).

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

  1. Attention → transformer (Hafta 12), tüm modern LLM’ler.
  2. GRU/LSTM memory cell → residual bağlantı; uzun-bağlam SSM/Mamba.
  3. Seq2seq → makine çevirisi, konuşma, encoder-decoder.
  4. Next-token tahmini → dil modeli ön-eğitimi (pretraining).
ÖnemliBu dersten tek bir şey alıp gideceksen

RNN sihir değildir — Hafta 2’nin “döndür-ez” katmanını bir gizli durumla zaman içinde tekrar uygulamaktır; ağırlıklar her adımda paylaşılır (Hafta 3’ün zaman-kuzeni). Naif hâli vanishing gradient’e takılır, bu yüzden gating (LSTM/GRU’nun “kopyala” yolu) ve attention (“hangi girdiye odaklan”) icat edildi — ve bu son fikir, Hafta 12’de tüm modern dil modellerini kuracak transformer’ın çekirdeğidir.