Attention'ı Sıfırdan Anlamak
23 Haz 2026 · 3 dk okuma
Attention, bugün konuştuğumuz neredeyse tüm büyük dil modellerinin içindeki motordur. Transformer mimarisini transformer yapan da, bu mekanizmadır. İlk karşılaşıldığında matematiği gözü korkutabilir; oysa altında yatan fikir tek bir sezgisel soruya dayanır: bir cümledeki bir kelimeyi işlerken, anlamını doğru kurmak için diğer kelimelerden hangilerine dikkat etmem gerekir? Bu yazıda o soruyu adım adım formüle edecek, query–key–value üçlüsünü kuracak ve attention'ın neden bir mimari devrimi tetiklediğini göreceğiz.
Problemi doğru koymak
"Banka kenarında oturdu" cümlesindeki "banka" ile "Bankadan para çekti" cümlesindeki "banka" aynı kelime olsa da bambaşka şeyleri kasteder. Bir modelin bu farkı yakalayabilmesi için, her kelimeyi tek başına değil, bağlamındaki diğer kelimelerle ilişkisi içinde temsil etmesi gerekir. Attention tam olarak bu ilişkiyi kurar: her kelimenin temsiline, cümledeki ilgili diğer kelimelerden "toplanan" bilgiyi katar.
Query, key ve value
Bu toplama işlemini düzenli kılmak için model, her token (kelime parçası) için üç ayrı vektör üretir. Bunları bir kütüphanede arama yapmaya benzetmek sezgiyi güçlendirir. Query (), o token'ın "ne arıyorum?" sorusudur. Key (), her token'ın "bende şu var" diyen etiketidir. Value () ise o token'ın gerçekten taşıdığı içeriktir. Bir token'ın query'sini bütün token'ların key'leriyle karşılaştırarak hangilerinin ne kadar alakalı olduğunu ölçer, bu alaka skorlarını ağırlığa çevirir ve value'ların bu ağırlıklarla harmanlanmış ortalamasını alırsınız. Sonuç, o token'ın bağlamla zenginleştirilmiş yeni temsilidir.
Bütün bu süreç tek bir denkleme sığar:
Denklemi parçalarına ayıralım. çarpımı, her query ile her key arasındaki benzerliği — bir iç çarpım aracılığıyla, yani yine lineer cebirle — hesaplar; sonuçta her token çiftine bir skor düşer. Paydadaki terimi, vektör boyutu büyüdükçe şişen bu skorları ölçekleyerek sayısal kararlılığı korur. Softmax ise ham skorları, toplamı bire eşit olan ağırlıklara çevirir; böylece "şu kelimeye yüzde altmış, bu kelimeye yüzde kırk dikkat et" diyebilen bir dağılım elde ederiz. Son olarak bu ağırlıklarla value'ları çarpıp toplarız.
Birkaç satır kodla
Mekanizmayı en sade hâliyle koda dökmek, denklemin soyutluğunu dağıtır:
import torch
import torch.nn.functional as F
def attention(Q, K, V):
d_k = Q.size(-1)
scores = Q @ K.transpose(-2, -1) / d_k**0.5 # her token çifti için benzerlik
weights = F.softmax(scores, dim=-1) # kim kime ne kadar dikkat ediyor
return weights @ V # value'ların ağırlıklı toplamı
# oyuncak örnek: 5 token, her biri 16 boyutlu
Q = K = V = torch.randn(5, 16)
print(attention(Q, K, V).shape) # torch.Size([5, 16])Buradaki scores matrisinin her satırı bir token'ın diğer tüm token'lara
verdiği dikkati, softmax sonrası weights ise bunun olasılık dağılımına dönmüş
hâlini taşır. weights @ V çarpımıyla her token, kendisi için en alakalı
token'ların içeriğini ağırlıklı biçimde devralır.
Neden bir devrim
Attention'dan önceki nesil modeller, metni katı bir biçimde soldan sağa, kelime kelime işliyordu. Bu yaklaşımda, cümlenin başındaki bir özneyle sonundaki bir zamiri ilişkilendirmek için bilginin uzun bir zincir boyunca taşınması gerekir ve bu zincir uzadıkça bilgi sönükleşir. Attention bu kısıtı tümden ortadan kaldırır: her token, tek bir adımda diğer bütün token'lara doğrudan bakabilir. "O" zamiri, on kelime önce geçen ismine zincirden bağımsız olarak anında bağlanabilir. Üstelik bu işlemler birbirinden bağımsız olduğu için modern donanımda paralelleştirilebilir; işte transformer'ların hem daha isabetli hem de devasa ölçeklerde eğitilebilir olmasının altında bu özellik yatar.
Buradan sonrası
Burada attention'ın tek başlı (single-head) ve sade biçimini ele aldık. Gerçek transformer'lar, modelin farklı türden ilişkileri eşzamanlı yakalayabilmesi için bu mekanizmayı paralel "kafalar" hâlinde çalıştırır (multi-head attention) ve kelime sırasını modele bildirmek için ayrıca positional encoding ekler. İlerleyen yazılarda bu iki parçayı da aynı titizlikle açacağız.