Kısım III · Merak · Bölüm 57
Dikkat ve Transformer
Uzun metinde kime bakacağına model karar verir: bugünkü dil modellerinin kalbi (Attention and the Transformer)
Neden burada: Bölüm 56'da bağlamı 1 harften 3 harfe çıkardık: model her tahminde sabit boyutlu bir pencerenin harflerinin gömmelerini yan yana dizip bir MLP'ye veriyordu. Pencerenin her yuvasının ağın içinde kendi ağırlık bloğu vardı. Bu bölümün sorusu: model, hangi önceki harfe ya da kelimeye ne kadar bakacağını, girdinin kendisine bakarak her seferinde yeniden hesaplayabilir mi? Cevap dikkattir (attention). Dikkati 56'daki parçalarla (gömme, MLP) birleştirince Transformer bloğu çıkar: bugünkü dil modellerinin ortak iskeleti.
Neye dayanıyor: Bölüm 56: bağlam penceresi (56.1), gömme (56.2), MLP dil modeli. Bölüm 55: softmax (55.2), matris çarpımı (55.3), GPU (55.4). Bölüm 51: nöron, MLP. Bölüm 50.2: toplama düğümünde gradyan. Bölüm 46.6: agent'ın bağlam sınırı.
- Kat 10Uygulama: yapay zekâ (Kısım III)Yapay zekâ, bizim uygulamamızla aynı katta, "uygulama" olarak yaşar.
- Kat 5Programlama dilleriBölümdeki model Python ve PyTorch ile yazılmış kısa bir koddur (Bölüm 52.5).
- Kat 3İşlemci ve bellek; GPUDikkat matris çarpımıdır; ağır işi GPU üstlenir (Bölüm 6.5, 55.4).
- Kat 0Elektrik ve bitHarf sayıya, sayı bitlere dönüşür (Bölüm 2).
Bölümün sonunda şunları bileceksin: dikkat nedir ve 56'daki sabit pencereli MLP'den nerede ayrılır; sorgu, anahtar, değer nasıl hesaplanır; maske ve konum bilgisi neden gerekir; Transformer bloğunun parçaları ne yapar; "Attention Is All You Need" (2017) ne önerdi ve GPT tarzı, yalnızca kod çözücülü modeller ondan nasıl ayrılır.
57.1 Dikkat sezgisi: her kelime diğerlerine soru sorar
Bir sözcüğün anlamı çoğu zaman metnin başka bir yerindedir. Hukuktan bir örnek: "Kiracı ev sahibine ihtarname gönderdi; o teslim almadı." "O" tek başına bir şey söylemez; kimden söz ettiğini öbür kelimelere bakarak bulursun. Karar metinlerindeki "anılan", "yukarıda belirtilen" gibi sözcükler de aynı işi görür. Jay Alammar'ın yazısı aynı sorunu "The animal didn't cross the street because it was too tired" cümlesiyle kurar: it hayvan mı, sokak mı? Öz-dikkat, modele "it"i işlerken öbür konumlara bakıp ipucu toplama imkânı verir.5
Dikkat (attention)'in yaptığı tek cümleyle şudur: dizideki her konum, öbür konumlara (ve kendine) "bana şu an hangileri yararlı?" diye soru sorar, her birine bir ağırlık verir (ağırlıkların toplamı 1'dir) ve öbürlerinden ağırlıklarıyla orantılı bilgiyi kendi vektörüne karıştırır. Kritik nokta ağırlıkların nereden geldiğidir: sabit parametrelerden değil, o anki girdinin içeriğinden hesaplanır. Makale, bir dizinin kendi konumlarını birbirine bağlayan bu türe öz-dikkat (self-attention) der.1
56'daki sabit pencereyle karşılaştırma
Bölüm 56'nın son köprüsünde sabit pencerenin sınırını konuşmuştuk. Önce bir yanlış anlamayı önleyelim: 56'daki MLP içeriğe bağlı hesap yapar: tanh doğrusal olmayan bir dönüşüm uygular, çıktı girdiye göre değişir. Pencereyi 256 harfe çıkarmak da bir çöküş değildir: W1 256 × 10 × 200 = 512.000 parametre olur (3 harfte 6.000'di; çarpmayı kendimiz yaptık).7 Çalışır. Fark, konumlar arası karışımın nereden geldiğindedir.
MLP'de her yuvanın ağın içinde kendi ağırlık bloğu vardır; bunlar eğitimde öğrenilir ve girdi değişince değişmez; pencere büyüyünce giriş ve W1 doğrusal büyür. Dikkatte ise her konum çifti için bir ağırlık, o anki girdilerden hesaplanır; Q/K/V matrislerinin boyutu uzunluktan bağımsızdır, hesap ise konum çiftleriyle, yani karesiyle büyür.
Tek cümlede: dikkat, açık ve içeriğe bağlı bir konumlar arası karıştırmadır. MLP içeriğe bakamaz demek yanlış olur; dikkatin ayırt edici yanı, karışım ağırlıklarını içerikten çıkarmasıdır.
Bağlam sınırsız değildir
T konumlu dizide her konum her konumla uyum hesapladığı için T × T skor çıkar. Makalenin Tablo 1'ine göre öz-dikkat katmanının hesabı O(n² · d)'dir; ama bütün konumları sabit sayıda ardışık işlemle bağlar, sıralı çalışan döngüsel ağlar ise n ardışık adım ister.1 Dikkat paralelleşmeye çok uygundur (GPU'nun işi, Bölüm 55.4) ama maliyeti uzunluğun karesiyle artar: T = 3 için 9 skor, 256 için 65.536, 1.024 için 1.048.576.7 Bu yüzden modeller üst sınır koyar: Karpathy'nin ders kodunda block_size = 256; üretirken girdi son block_size simgeye kırpılır.4 Dikkat bağlamı uzatır, sınırsız yapmaz; pencere dışını model hiç görmez (Bölüm 58.4'te yeniden).
57.2 Sorgu, anahtar, değer (query, key, value)
Bir davada emsal karar aradığını düşün. Elinde aradığını tarif eden bir arama kartı var: "ihtarnamenin tebliği". Raftaki her kararın bir künyesi (anahtar kelimeleri) ve bir de kendisi (gerekçesi) var. Kartı her künyeyle karşılaştırır, uyumu yüksek olanları öne alır, sonunda kararların içeriklerinin uyumla orantılı bir özetini çıkarırsın. Dikkatteki üç rol budur: sorgu (query) arama kartı, anahtar (key) künye, değer (value) kararın içeriği. ("Sorgu" burada Bölüm 33 ve 38'deki veritabanı sorgusuyla yalnızca benzer bir fikirdir; gerçek modelde künyeyi kimse yazmaz, hepsi öğrenilen sayılardır.)
Dizideki her konumun elinde zaten bir vektör vardır: 56.2'deki gömme (artı aşağıdaki konum bilgisi). Dikkat bu vektörü üç öğrenilen matrisle çarpar: q = x·Wq, k = x·Wk, v = x·Wv. Bu matrisler modelin parametreleridir; gömme matrisi C gibi başta rastgele, eğitimle şekillenir (Bölüm 52). Alammar'da gömme boyutu 512, bu üç vektörün boyutu 64'tür; yazar bunları "dikkati hesaplamak ve düşünmek için işe yarayan soyutlamalar" diye anar.5 Karpathy'nin kodunda üçü de sapma terimsiz birer nn.Linear'dir.4
Beş adım
- Uyum skoru: sorgu, her konumun anahtarıyla iç çarpım (dot product) yapılır (karşılıklı elemanlar çarpılıp toplanır; benzer yönlüde sonuç büyüktür). Hepsi bir matris çarpımıdır:
Q·Kᵀ(Bölüm 55.3). - Ölçekleme: skorlar
√dk'ye bölünür (dk anahtar boyutu). - Maske: gelecek konumların skoru
−∞yapılır (aşağıda). - Softmax: satırlar olasılığa çevrilir (Bölüm 55.2): dikkat ağırlıkları (attention weights).
- Ağırlıklı toplam: yeni vektör, değerlerin bu ağırlıklarla toplamıdır.
Makale hepsini tek formülde verir ve buna ölçeklenmiş iç çarpım dikkati (scaled dot-product attention) der: softmax(Q·Kᵀ / √dk) · V.1
Elle hesaplanan oyuncak örnek
Üç konum ve dk = 4 alalım (√4 = 2). Q, K, V'yi doğrudan biz seçtik; gerçek modelde gömmelerin Wq, Wk, Wv ile çarpımından çıkarlar.
| Konum | Sorgu q | Anahtar k | Değer v |
|---|---|---|---|
| 1 | [2, 0, 0, 0] | [1, 0, 0, 0] | [1, 0] |
| 2 | [0, 2, 0, 0] | [0, 1, 0, 0] | [0, 1] |
| 3 | [2, 2, 0, 0] | [1, 1, 0, 0] | [1, 1] |
Konum 3'ün sorgusu [2,2,0,0] ile üç anahtarın iç çarpımı 2, 2, 4; ikiye bölünce [1, 1, 2]. Softmax: e ≈ 2,718; 2,718; e2 ≈ 7,389; toplam ≈ 12,826; ağırlıklar 0,2119; 0,2119; 0,5761. Çıktı: 0,2119·[1,0] + 0,2119·[0,1] + 0,5761·[1,1] = [0,7881; 0,7881]. Üç konum birden:
| Konum | Ölçeklenmiş skorlar | Dikkat ağırlıkları (maskeli) | Çıktı |
|---|---|---|---|
| 1 | [1, 0, 1] | [1,0000; 0; 0] | [1,0000; 0,0000] |
| 2 | [0, 1, 1] | [0,2689; 0,7311; 0] | [0,2689; 0,7311] |
| 3 | [1, 1, 2] | [0,2119; 0,2119; 0,5761] | [0,7881; 0,7881] |
Tabloyu kısa bir saf Python döngüsüyle ve PyTorch'la hesapladık; ikisi aynı sayıları verdi.7 Konum 1 yalnızca kendini görebildiği için ağırlığı 1'dir. Maske olmasaydı konum 1'in satırı [0,4223; 0,1554; 0,4223] olurdu: kendinden sonrasına da bakardı.
Neden √dk'ye böleriz?
Makaleye göre boyut büyüdükçe iç çarpımlar büyür ve softmax, gradyanı çok küçük bölgelere itilir; bölme bunu dengeler. Gerekçe bir dipnottadır: q ve k'nın bileşenleri ortalaması 0, varyansı 1 olan bağımsız sayılarsa iç çarpımın varyansı dk'dir.1 Simülasyonla doğruladık (200.000 rastgele çift): varyans dk = 4'te 4,01; 64'te 64,01; 512'de 510,67; bölünce üçünde de 1,00. Doygunluk: [1, 2, 3, 4] skorlarının softmax'ı yaklaşık [0,03; 0,09; 0,24; 0,64]; 8 ile çarpılınca [0,00; 0,00; 0,00; 1,00] (neredeyse tamamı tek elemanda).7
Nedensel maske: gelecek gizlenir
Eğitimde her konumun görevi sonraki harfi tahmin etmektir; Karpathy'nin kodunda hedef y, girdi x'in bir adım kaydırılmışıdır.4 Yani 256 uzunluklu bir parça, 256 ayrı tahmin görevidir (56.1'deki "bir isim, harf sayısı + 1 örnek verir"in aynısı, ama hepsi aynı anda). Konum 10, konum 11'in harfini görebilirse "tahmin" kopyadır: sınavda cevap anahtarına bakmak gibi. Bu yüzden skor matrisinin sağ üst üçgeni softmax'tan önce −∞ yapılır; e−∞ = 0 olduğundan o konumlar sıfır ağırlık alır. Buna nedensel maske (causal mask) denir; kodda torch.tril (alt üçgen matris) ile kurulur.4 Makale aynı şeyi, sonraki konumlardan önceki konumlara bilgi sızmasını önlemek için softmax girişinde yasak bağlantıları −∞ yapmak diye anlatır.1 Kodu çalıştırıp sınadık: eğitilmemiş modelde 16 simgelik bir dizinin 10. simgesini değiştirince 0–9. konumların çıktıları tam olarak aynı kaldı, 10–15. konumlar değişti.7
Konum bilgisi: dikkat sırayı bilmez
Ağırlıklar yalnızca vektörlerin içeriğinden çıkar, konumundan değil; konum bilgisi taşımayan tek dikkat işlemi, erişebildiği öbür konumların sırasını ayırt etmez. Denedik: rastgele bir dizide son simgeden önceki dört simgenin sırasını karıştırınca son simgenin çıktısı yalnızca 1,2 × 10−7 değişti (sayısal gürültü); her yuvaya ayrı bir vektör eklenince aynı karıştırma çıktıyı belirgin biçimde değiştirdi.7 Oysa dilde sıra anlam taşır. Çözüm, gömmelere sıra bilgisi eklemektir. Konum kodlaması (positional encoding) her konuma gömmeyle aynı boyutta bir vektör toplar; makale farklı frekanslarda sinüs ve kosinüs kullanır (boyut 4'te konum 1 → [0,8415; 0,5403; 0,0100; 1,0000]; kendimiz hesapladık).17 Makale öğrenilen konum gömmelerini de denemiş, neredeyse aynı sonucu bulmuştur (Tablo 3, satır E).1 GPT tarzı kodlar ikinci yolu kullanır: nn.Embedding(block_size, n_embd), yani her yuva için öğrenilen vektör; x = tok_emb + pos_emb.4 Bu tablo block_size satırlıdır: bağlam sınırının görünen yüzlerinden biri.
Hukuk uygulamamızda bir soru metni şuna benzeyebilir: "Kiracı ev sahibine ihtarname gönderdi; o teslim almadı. Hangisi doğrudur?" (Prototipinde muhtemelen soru metni ve şıklar ayrı alanlarda duruyor; bu cümle yalnızca düşünmek içindir.) Bir dil modeli "o"yu işlerken "ev sahibi"ne yüksek ağırlık veriyorsa, bunu bu bölümdeki mekanizmayla yapar: "o" konumunun sorgusu, "ev sahibi" konumunun anahtarıyla yüksek uyum çıkarır. Agent kodu okurken de benzer şey olur: bir fonksiyon adı geçtiğinde dikkat, tanımlandığı satıra gidebilir.
Pratik sonuç: agent'a gösterdiğin her şey bağlam penceresine girer (Bölüm 46.6); pencere sınırlı ve uzadıkça pahalıdır, bu yüzden AGENTS.md (Bölüm 46.2) gibi dosyaları kısa ve açık tutmak bir üslup tercihi değil, "pencereye ne koyuyorum?" sorusudur.
57.3 Transformer bloğu: dikkat + MLP + artık bağlantılar
Dikkat tek başına bir karışım aracıdır. Transformer bloğu (Transformer block), dikkati üç yardımcıyla birleştirip üst üste dizilebilen bir birime çevirir. Karpathy'nin kodunda bloğun açıklaması iki sözcüktür: "iletişim, ardından hesaplama". Dikkat konumların birbiriyle konuşması, MLP her konumun kendi başına düşünmesidir.4
Çok başlı dikkat
Bir cümlede aynı anda birçok şeye bakmak gerekebilir ("o" kimdir; hangi fiile bağlı?). Çok başlı dikkat (multi-head attention) aynı işlemi h kez, her seferinde farklı Wq, Wk, Wv ile yapar; her kopyaya baş (head) denir. Başların çıktıları yan yana yapıştırılıp bir çıkış matrisiyle tek vektöre indirilir. Makalenin ayarı: 8 baş, her biri 512/8 = 64 boyutlu; toplam hesap tek başlı dikkatinkine yakın kalır. Makaleye göre tek başlı dikkatte ağırlıklı ortalama, farklı konumlardaki farklı bilgiyi birlikte taşımayı engeller; tek başlı ayar en iyisinden 0,9 BLEU kötüdür, çok fazla baş da kaliteyi düşürür.1 Alammar'ın örneğinde bir baş "it" için "the animal"a, başka biri "tired"a odaklanır; hangi başın neye bakacağını eğitim belirler.5
MLP: her konumda ayrı hesap
Dikkatin ardından her konumun vektörü, Bölüm 51 ve 56'dan tanıdığın şeyden geçer: iki katmanlı bir MLP, makalenin adıyla konum bazlı ileri besleme ağı (position-wise feed-forward network); her konuma ayrı ayrı ve aynı uygulanır. Makalede boyutlar 512 → 2048 → 512, etkinleştirme ReLU; Karpathy'nin kodunda 384 → 1536 → 384, ders kodunda ReLU, minGPT ve nanoGPT'de GELU.1234 İş bölümü: dikkat ilgili konumlardan bilgi toplar, MLP toplananı işler.
Artık bağlantı: eskiyi silme, üstüne ekle
Dikkatin ve MLP'nin çevresine bir kestirme yol çekilir: artık bağlantı (residual connection). Alt katmanın çıktısı girdinin yerine değil üstüne eklenir: x = x + f(x). Örnek: x = [1, 2, 3, 4], f(x) = [0,1; −0,2; 0; 0,3] ise sonuç [1,1; 1,8; 3,0; 4,3]: girdi yerinde durur, katman küçük bir not ekler.7 Hukuk benzetmesiyle: ana metin değişmez, katman kenara şerh düşer. İki yararı var: 12 blok üst üste binince her blok girdiyi baştan üretmek zorunda kalmaz; ve eğitimde, Bölüm 50.2'de gördüğün gibi toplama düğümü gradyanı iki koluna da aynen dağıtır, yani gradyan kestirme yoldan da blok girişine ulaşır. Bunun için makalede bütün alt katmanlar aynı boyutta (512) çıktı verir.1
Katman normalleştirmesi
Katman normalleştirmesi (layer normalization), bir konumun vektörünü ortalamasını çıkarıp standart sapma ölçeğine bölerek düzenler; kodda kararlılık için küçük bir epsilon ile öğrenilen çarpan ve sapma da vardır. Öğrenilen dönüşümden önceki sade örnek: [1, 2, 3, 4] → [−1,342; −0,447; 0,447; 1,342].7 Amaç, derin bir ağın içinde sayıların ölçeğinin kaymasını önlemektir. Sıra iki kaynakta farklıdır: makale LayerNorm(x + Sublayer(x)) uygular (önce ekle, sonra normalleştir);1 Karpathy'nin kodlarında (ders kodu, minGPT, nanoGPT) x = x + self.sa(self.ln1(x)): önce normalleştir, alt katmandan geçir, sonra ekle.234 İkisi de "normalleştirme + artık bağlantı"dır; yalnızca yerleri farklıdır.
Kod: bir dikkat başı
class Head(nn.Module): # tek dikkat başı
def __init__(self, head_size):
super().__init__()
self.key = nn.Linear(n_embd, head_size, bias=False) # Wk
self.query = nn.Linear(n_embd, head_size, bias=False) # Wq
self.value = nn.Linear(n_embd, head_size, bias=False) # Wv
self.register_buffer('tril', torch.tril(torch.ones(block_size, block_size))) # maske
def forward(self, x): # x: (B, T, C): B örnek, T konum, C gömme boyutu
B,T,C = x.shape
k = self.key(x) # (B, T, hs) anahtarlar
q = self.query(x) # (B, T, hs) sorgular
wei = q @ k.transpose(-2,-1) * k.shape[-1]**-0.5 # (B, T, T) skorlar, √dk ile ölçekli
wei = wei.masked_fill(self.tril[:T, :T] == 0, float('-inf')) # gelecek: -sonsuz
wei = F.softmax(wei, dim=-1) # her satır toplamı 1: dikkat ağırlıkları
v = self.value(x) # (B, T, hs) değerler
return wei @ v # (B, T, hs) ağırlıklı toplam
(Dropout satırlarını çıkardık.) wei, 57.2'deki 3 × 3 ağırlık tablosunun toplu halidir; @ matris çarpımıdır (Bölüm 55.3), GPU'nun işidir. Bloğun forward'ı iki satırdır: x = x + self.sa(self.ln1(x)) ve x = x + self.ffwd(self.ln2(x)); bloklar üst üste dizilir, en sonda bir normalleştirme ve her konum için sözlük boyutunda logit üreten bir nn.Linear gelir, sonra softmax (55.2).4 Bölüm 56'nın 11.897 parametresine karşılık, ders kodunu Karpathy'nin ayarlarıyla (6 blok, 6 baş, boyut 384, bağlam 256, 65 karakter) çalıştırıp saydık: 10.788.929 (yaklaşık 907 kat). Altı bloğun payı 10.639.872'dir (blok başına 1.773.312); gerisi gömmeler ve çıkış katmanıdır.7 Ölçek büyüyünce ne olduğunu Bölüm 58.5 anlatır.
57.4 GPT: yalnızca kod çözücü (decoder-only) model; "Attention Is All You Need" (2017)
2017 makalesi ne önerdi?
Ashish Vaswani ve yedi arkadaşının makalesi arXiv'e 12 Haziran 2017'de gönderildi ve NIPS 2017'de yayımlandı.1 O güne kadar baskın dizi modelleri, kodlayıcı ve kod çözücü (encoder–decoder) yapısında karmaşık döngüsel ya da evrişimli ağlardı; yazarlar "yalnızca dikkate dayanan, döngü ve evrişimi tümüyle bırakan" bir mimari önerdi ve adını Transformer (Transformer) koydu.1 Asıl derdi çeviridir: İngilizceden Almancaya 28,4 BLEU (çeviri kalitesi puanı; ayrıntısı bu kitabın konusu değil); temel model 8 P100 GPU'da 12 saatte eğitildi.1
Orijinal tasarımın iki yarısı vardır. Kodlayıcı (encoder), girdi cümlesini okuyan 6 blokluk yığındır (çok başlı öz-dikkat + MLP). Kod çözücü (decoder), çıktı cümlesini simge simge üreten 6 blokluk yığındır; her bloğunda üç alt katman vardır: maskeli öz-dikkat, kodlayıcının çıktısına bakan dikkat, MLP.1 Ortadakine çapraz dikkat (cross-attention) diyoruz (makalede "encoder-decoder attention"): sorgular kod çözücüden, anahtar ve değerler kodlayıcıdan gelir; böylece Almanca cümle yazılırken her konum İngilizce cümlenin bütün konumlarına bakabilir.15
GPT: kodlayıcıyı ve çapraz dikkati at
GPT (Generative Pre-trained Transformer) tarzı modellerde tek bir dizi vardır: modelin şimdiye kadar gördüğü metin. Çevrilecek ayrı bir girdi olmadığı için kodlayıcı da, ona bakan çapraz dikkat de yoktur; kod çözücünün geri kalanı (maskeli öz-dikkat ve MLP) kalır. Buna yalnızca kod çözücü (decoder-only) model denir. OpenAI'ın GPT-1 makalesi bunu açıkça yazar: "maskeli öz-dikkat başlı, 12 katmanlı, yalnızca kod çözücülü transformer" (768 boyut, 12 baş, 3072 boyutlu iç MLP durumları).6 Karpathy'nin kodlarında çapraz dikkat yoktur (nanoGPT'nin modül türlerini listelediğimizde yalnızca CausalSelfAttention, MLP, LayerNorm, Embedding, Linear çıktı).2347
| Özellik | Orijinal Transformer (2017) | GPT tarzı kodlar |
|---|---|---|
| Yığınlar | Kodlayıcı ve kod çözücü | Yalnızca kod çözücü benzeri |
| Çapraz dikkat | Her kod çözücü bloğunda var | Hiçbir yerde yok |
| Normalleştirme | Eklemeden sonra | Alt katmandan önce |
| Konum bilgisi | Sabit sinüs/kosinüs | Öğrenilen gömme |
(Sağ sütun minGPT, nanoGPT ve ders kodudur; GELU ve öğrenilen konum gömmesini GPT-1 makalesi de bildirir.6 Normalleştirme sırası için GPT-1 makalesinin ne dediğini iddia etmiyoruz.) Bugün "Transformer" hem 2017'deki bu tasarımı hem GPT gibi yalnızca kod çözücülü yığınları anar; yapı taşları ortak, model aynı değildir.
Üretim döngüsü ve eğitim
Model bir dizi alır ve her konum için sonraki simgenin olasılık dağılımını verir. Üretim, Bölüm 56'daki isim örneklemesinin iskeletidir; bu tür modele otoregresif (autoregressive) denir: çıktısı kendi önceki çıktılarının üstüne oturur.1 Ders kodundaki generate döngüsü beş adımdır: bağlamı son block_size simgeye kırp; modeli çalıştır; yalnızca son konumun logit'lerini al (logits[:, -1, :]); softmax'la olasılığa çevir (Bölüm 55.2); torch.multinomial ile olasılığa göre bir simge çekip diziye ekle ve başa dön.4
Gerçek sistemlerde ek ayrıntılar (örneğin sıcaklık, Bölüm 58.4) vardır. Bu kodda bir simge bir karakterdir; büyük modellerde simgeler sözcük parçalarıdır (Bölüm 58.1). Eğitim döngüsü 52 ve 56'dan tanıdıktır; fark, kaybın her konum için hesaplanmasıdır: nedensel maske sayesinde 256 uzunluklu bir parça tek ileri geçişte 256 "sonrakini tahmin et" sorusu sorar. Eğitimin ölçeği Bölüm 58.2 ve 58.5'in konusu.
Geriye: 56'nın sorusu "model hangi önceki harfe bakacağını girdiden seçebilir mi?" idi; cevap, dikkatle evet. 56'daki parçalar (gömme, MLP, kayıp, eğitim döngüsü, örnekleme) silinmedi, bloğun içine yerleşti; değişen, sabit yuvalı pencerenin yerine girdiden hesaplanan ağırlıkların gelmesi. Dikkat ağırlıkları softmax'tandır (55.2); Q·Kᵀ matris çarpımıdır (55.3), bu yüzden GPU işe yarar (55.4). Agent'ın bağlam sınırı (46.6), buradaki dizi uzunluğu sınırıdır. İleriye: Bu bölümdeki model 10,8 milyon parametreli, 65 karakterlik sözlüklüydü. Bölüm 58 aynı fikri devasa ölçekte anlatır: simgeleştirme (58.1), ön eğitim (58.2), ince ayar (58.3), bağlam penceresi, sıcaklık, uydurma (58.4), ölçek yasaları ve GPU kümeleri (58.5).
Bu bölümde neler kuruldu
Dikkat'i, 56'daki sabit pencereli MLP'ye karşı içeriğe bağlı, açık bir konumlar arası karıştırma olarak kurduk; bağlamın sınırsız olmadığını gördük. Sorgu, anahtar, değer üçlüsünü elle hesapladık; nedensel maskeyi ve konum bilgisini doğruladık. Transformer bloğunu çok başlı dikkat, MLP, artık bağlantı ve katman normalleştirmesinden kurduk. Son olarak 2017 makalesinin tasarımını ve GPT'nin yalnızca kod çözücü olarak çapraz dikkati bıraktığını gördük.
Bu bölümde tanıştığın terimler sözlükte, Bölüm 57 başlığı altında.
Vaswani ve ark., "Attention Is All You Need" (NIPS 2017) (PDF): 3 Model Architecture, özellikle 3.2 Attention, 3.1 Encoder and Decoder Stacks, 3.3 Position-wise Feed-Forward Networks (s. 2–5). Makale 15 sayfa; formülleri tarayıp cümlelerini oku, çeviri sonuçlarını şimdilik geç. Derinleşme 1: Jay Alammar, "The Illustrated Transformer", Self-Attention in Detail ve The Beast With Many Heads (önce sezgi istersen buradan başla). Derinleşme 2: Karpathy, gpt.py, bu bölümdeki kodun tamamı, 225 satır.
Takıldığın yeri yapay zekâ öğretmenine sor. Alıştırma: "57.2'deki oyuncak örnekte 3. konumun sorgusunu [2,0,0,0] yapsan ağırlıklar ne olur? Önce elle tahmin et, sonra Python'la hesaplat."
Bölüm sonu soruları
Kitaba bakmadan cevapla. Yanlış yaparsan geri bildirim seni ilgili alt bölüme yönlendirir.
Wq, Wk, Wv matrisleri vardır; çıktılar birleştirilir. Makaleye göre tek başlı ayar daha kötüdür. Bkz. 57.3.Örnek cevabı göster
"O" konumu bir sorgu üretir ("kimi arıyorum?"); öbür konumlar birer anahtar (künye) ve değer (içerik) taşır. Sorgunun her anahtarla iç çarpımı uyum skorudur; skorlar √dk'ye bölünüp softmax'la toplamı 1 olan ağırlıklara çevrilir; çıktı, değerlerin bu ağırlıklarla toplamıdır. Benzetme: arama kartını künyelerle karşılaştırıp uyumlu kararların gerekçelerinden ağırlıklı özet çıkarmak. Bkz. 57.2.
Örnek cevabı göster
Orijinal Transformer'da kodlayıcı, kod çözücü ve kodlayıcıya bakan çapraz dikkat vardır; GPT tarzı model yalnızca kod çözücü gibidir: maskeli öz-dikkat ve MLP, çapraz dikkat yok. Bağlam sınırsızdır denemez: maliyet uzunluğun karesiyle artar, konum tablosu block_size ile sınırlıdır; pencere dışını model görmez. Bkz. 57.4 ve 57.1.
Kaynaklar
- Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin, "Attention Is All You Need" (arXiv:1706.03762, ilk sürüm 12 Haziran 2017; NIPS 2017), PDF (v7 okundu): Bölüm 1–2; 3.1; 3.2 (formül 1, 4. dipnot, çok başlı dikkat, 3.2.3); 3.3; 3.5; Tablo 1 ve Tablo 3 (satır A, E); 5.2.
- Andrej Karpathy, minGPT, README ve
mingpt/model.py: sadelik tarifi;CausalSelfAttention,Block, GELU. README, deponun "yarı arşivlenmiş" olduğunu yazar. - Andrej Karpathy, nanoGPT, README ve
model.py:wte,wpe,Block,lm_head. README, Kasım 2025 güncellemesiyle nanoGPT'nin eskidiğini ve nanochat'in önerildiğini yazar. - Andrej Karpathy,
gpt.py(ng-video-lecture):Head,Block("communication followed by computation"), konum gömmesi,generate. Depo README'si, Neural Networks: Zero To Hero serisindeki nanoGPT dersinin kodu olduğunu söyler; ders videosu vegpt-dev.ipynbdefteri bu bölümde kaynak alınmadı. - Jay Alammar, "The Illustrated Transformer": "it" ve "the animal"; sorgu, anahtar, değer (512 → 64) ve 8'e bölme; çok başlı dikkat; kodlayıcı–kod çözücü dikkati.
- Alec Radford ve ark., "Improving Language Understanding by Generative Pre-Training" (OpenAI, GPT-1): 12 katmanlı yalnızca kod çözücülü transformer, 768 boyut, 12 baş, 3072 iç durum, GELU, öğrenilen konum gömmeleri.
- Bu bölümdeki sayısal örneklerin hepsi bu kitap için Python ve PyTorch (CPU) ile çalıştırıp doğrulandı.