Sorgu, Anahtar, Değer
Aynı Girdiden Üç Doğrusal Haritalama
Gömme işleminden (etkinlik 4) sonra, her konum 768 boyutlu bir vektör x_t taşır. Dikkat, x'in üç farklı projeksiyonunu üreterek başlar:
Q (sorgu): bu konum ne bilmek istiyor?
K (anahtar): bu pozisyon diğer pozisyonlara ne sunar?
V (değer): bu pozisyona dikkat edilirse ne içerik sunar?
Her projeksiyon öğrenilmiş bir ağırlık matrisinden gelir:
Q = x · W_Q # W_Q şekli: (d_model, d_k)
K = x · W_K # W_K şekli: (d_model, d_k)
V = x · W_V # W_V şekli: (d_model, d_k)
Üç matris, hepsi geri yayılım yoluyla eğitilir. Bir model öğrenir: bu konumda, faydalı geçmiş bağlamı en iyi hangi sorgu geri alır? Bu konumun içeriğini iyi tanıtan anahtar nedir? Seçilirse ne değer verir?
Kütüphane Benzetmesi
Bir kütüphane kart kataloğunu hayal edin. Aklınızda bir konuyla (sorgunuz query) içeri girersiniz. Her kart anahtar kelimeler listeler (bir key). Konunuz bir kartın anahtar kelimeleriyle eşleştiğinde, kitap içeriğini (bir value) alırsınız. Dikkat mekanizması bunu her token için paralel olarak yapar: her pozisyon her diğer pozisyonu sorgular, uyumu sıralar ve değer vektörlerinin ağırlıklı bir kombinasyonunu alır.
ANDREA-120M Boyutları
| Miktar | Değer | Notlar |
|---|---|---|
| d_model | 768 | Her konumdaki vektör boyutu |
| n_head | 12 | Paralel dikkat başlıkları |
| d_k | 64 | Başlık başına boyut (= d_model / n_head) |
| T | 1024 | Bağlam uzunluğu |
d_k = d_model / n_head = 768 / 12 = 64. Her başlık, tam 768 boyutlu bir alanın 64 boyutlu bir dilimini görür. Etkinlik 6 (grow_a_language_model_multi_head), başlık başına bölünmeyi detaylı olarak ele alır.
d_k'yı hesapla
Neden sqrt(d_k) ile Bölüyoruz
Bir Skor Matrisi
Q ve K var olduğunda (her biri (T, d_k) şeklinde), dikkat bir skor matrisi hesaplar:
scores = Q · K^T # shape: (T, T)
scores[i, j] = pozisyon i'nin sorgusunun pozisyon j'nin anahtarıyla ne kadar güçlü uyumlu olduğunu gösterir. Her (i, j) çifti bir skor alır: 1024 × 1024 = 1.048.576 skor, her dikkat başı başına her ileri geçişte.
Neden Bölüyoruz
Rastgele d-boyutlu birim vektörlerin nokta çarpımları, büyüklük olarak sqrt(d) mertebesindedir. Ölçekleme olmadan, skorlar d_k ile büyür:
- d_k = 64: tipik nokta çarpımları 8 mertebesinde.
- d_k = 256: tipik nokta çarpımları 16 mertebesinde.
- d_k = 4096: tipik nokta çarpımları 64 mertebesinde.
Büyük skorlar sivri bir softmax üretir (bir konum baskın olur, diğer yerlerde gradyanlar kaybolur). Eğitim durur. Ölçekleme bir büyüklüğü düzeltir:
ölçeklenmiş_skorlar = (Q · K^T) / sqrt(d_k)
ANDREA-120M için sqrt(d_k) = sqrt(64) = 8. Her skor 8'e bölünür. Büyüklükler d_k ne olursa olsun kabaca birim ölçeğinde kalır. Softmax iyi davranır. Gradyanlar akar.
Vaswani'nin Orijinal Gerekçesi
Attention Is All You Need (2017)'den: 'd_k büyük değerler için, nokta çarpımları büyüklükte büyür, softmax fonksiyonunu son derece küçük gradyanlara sahip bölgelere iter.' Bir sqrt(d_k) bölen bu büyümeyi önler.
Kod Görünümü
microgpt_cuda.cu içinde bu ölçekleme şu şekilde bir tam bölme olarak görünür:
scores[i][j] = dot(Q[i], K[j]) * (1.0f / sqrtf(d_k));
Her skor için bir float çarpma. Ucuz. Kritik.
d_model = 4096'da Ölçekleme
Neden Pozisyon i, Pozisyon j > i'yi Göremez
Üretimden Doğan Bir Kısıtlama
ANDREA bir seferde bir token üretir. Çıkarım sırasında, pozisyon 0 ilk token'ı üretir, ardından pozisyon 1 pozisyon 0'ın çıktısını görür & ikinci token'ı üretir, & böyle devam eder. Bir model üretim sırasında asla gelecek token'lara erişemez.
Eğitim bunu yansıtmalıdır. Eğer eğitim sırasında pozisyon 5 pozisyon 6'ya dikkat ederse, model bir kestirme öğrenir: 'token 6'yı token 6'yı okuyarak tahmin et'. Çıkarımda, bu kestirme kaybolur (token 6 henüz yok). Modelin eğitim-karşılaştırma davranışı katastrofik şekilde ayrışır.
Bir Maske
Nedensel maske, herhangi bir pozisyon i'den herhangi bir pozisyon j > i'ye dikkati engeller. Uygulama: j > i olan her yerde scaled_scores[i][j] = -sonsuz yapın. Softmax'tan sonra, bu girişler exp(-inf) = 0 olur. Maske gelecek pozisyonlara dikkati temizce sıfırlar.
for i in range(T):
for j in range(T):
if j > i:
scaled_scores[i][j] = -1e9 # etkili olarak -inf
Softmax'tan sonra (satır bazında), her satır 1'e toplanır, ancak yalnızca [0, i] girişleri olasılık kütlesi taşır. Konum i, yalnızca geçmiş konumlardan bilgi karıştırır.
Bir Maskeyi Görselleştirme
Maske uygulandığında (T, T) şeklinde bir skor matrisi, alt-üçgensel bir yapıya benzer:
Maske sonrası scaled_scores, satır bazında softmax:
satır 0: [1.0, 0, 0, 0, ...] # sadece kendini görür
satır 1: [0.4, 0.6, 0, 0, ...] # 0 ve 1. pozisyonları görür
2. satır: [0.2, 0.3, 0.5, 0, ...] # 0, 1, 2'yi görür
3. satır: [0.1, 0.2, 0.3, 0.4, ...] # 0, 1, 2, 3'ü görür
...
Her satır için sıkı alt-üçgensel olasılık dağılımı. Gelecek görünmez kalır.
Neden Decoder-Only Transformer Buna İhtiyaç Duyar
ANDREA, GPT ve LLaMA gibi decoder-only modellerin hepsi tek bir amacı paylaşır: geçmişten sonraki token'ı tahmin etmek. Bir causal mask, bu amacı paralel olarak eğitilebilir hale getirir: her pozisyon kendi sonraki-token tahminini aynı anda hesaplar ve hiçbir pozisyon ileriye bakarak hile yapmaz.
Mask & Tat
Skorlardan Çıktıya
Softmax: Skorları Olasılıklara Dönüştürme
Maskelenmiş, ölçeklenmiş skorlar hâlâ gerçek sayılar aralığında yer alır. Softmax her satırı bir olasılık dağılımına dönüştürür:
A[i][j] = exp(scaled_scores[i][j]) / sum_k exp(scaled_scores[i][k])
Üç özellik ortaya çıkar:
- Tüm (i, j) için A[i][j] >= 0.
- Her satır i için sum_j A[i][j] = 1.
- Daha büyük ham puanlar daha büyük olasılıklar üretir (monoton).
i satırının olasılık vektörü bir modele şunu söyler: çıktı hesaplanırken konum i'nin her önceki konuma ne kadar dikkat etmesi gerekir?
Ağırlıklı V Toplamı
i pozisyonu için son dikkat çıktısı:
output[i] = sum_j A[i][j] · V[j]
Her değer vektörü V[j], dikkat olasılığı A[i][j] ile ağırlıklandırılır, ardından toplanır. i pozisyonunun çıktısı, her önceki pozisyondan değer vektörlerini, alakalılıklarına göre ağırlıklandırarak birleştirir.
Matris formunda, tüm konumlar bir arada:
Attention(Q, K, V) = softmax(mask(Q · K^T / sqrt(d_k))) · V
Tek satır. Tam bir dikkat mekanizması. Vaswani ve diğerleri bu satırı 2017'de yazdı; transformer'lar o zamandan beri temelde değişmedi.
Baş-Başına Çıktı Şekli
Bir dikkat başının çıktısı: şekil (T, d_k). ANDREA-120M için: (1024, 64). Tüm 12 baş paralel olarak hesaplanır; çıktıları (1024, 768) olarak birleştirilir & son lineer projeksiyona (W_O) beslenir, ardından bir transformer bloğunun MLP'sine geçer.
Etkinlik 6 (grow_a_language_model_multi_head) çoklu baş ayrımını kapsar. Etkinlik 7 (grow_a_language_model_transformer_block) dikkatin etrafındaki her şeyi kapsar: artık bağlantılar, katman normu, MLP.