English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

konuk
1 / ?
derslere geri dön

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?


Ölçekli nokta-çarpım dikkati


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ı


MiktarDeğerNotlar
d_model768Her konumdaki vektör boyutu
n_head12Paralel dikkat başlıkları
d_k64Başlık başına boyut (= d_model / n_head)
T1024Bağ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

İki ANDREA varyantı için d_k'yı hesapla. (a) ANDREA-12M: d_model = 384, n_head = 12. (b) ANDREA-480M: d_model = 1536, n_head = 24. Her biri için formülünü göster: d_k = d_model / n_head.

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

Bir araştırma ekibi d_model = 4096 & n_head = 32 ile ANDREA-2B'yi inşa ettiğini varsayın. (a) d_k'yı hesaplayın. (b) sqrt(d_k)'yı hesaplayın. (c) Bir ekibin bu ölçekte sqrt(d_k)'ya bölmeyi unutması durumunda ne olacağını bir cümleyle açıklayın.

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

Etkinlik 2 (giriş) üç transformer çeşidini kapsıyordu: encoder-only, encoder-decoder, decoder-only. (a) Hangi çeşit causal mask kullanır? (b) Farklı bir çeşidin (encoder-only, örneğin BERT) neden causal mask kullanmayacağını bir cümleyle belirtin. (c) Maskesiz bir encoder bunun yerine hangi amacı eğitir?

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.

Bir Boru Hattı Sentezle

Tüm bir dikkat boru hattını kendi kelimelerinizle sentezleyin. Giriş vektörü x_5'ten dikkat çıktısı[5]'e kadar tek bir konum i (örneğin dizideki 5. konum) için neler olduğunu adım adım anlatın. Dört işlemi sırayla adlandırın: (1) Q/K/V'ye projeksiyon, (2) tüm konumlara karşı ölçekli skor hesaplama, (3) nedensel mask + softmax uygulama, (4) olasılıklarla ağırlıklı V vektörleri toplama. Bir kısa paragraf.