CodeBlanks Logo Icon CodeBlanks

Query, Key, Value

Attention, query ve key'in çarpımıyla ağırlıkları hesaplar ve value'yu toplar.

Query, Key, Value

Her eleman üç farklı role bürünür; her rol öğrenilen bir matrisle üretilir:

  • Query (Q = X W_q): "ne arıyorum?"
  • Key (K = X W_k): "bende ne var?"
  • Value (V = X W_v): "bulunursam ne veririm?"
Q = X @ W_q      # (n, d_k)
K = X @ W_k      # (n, d_k)
V = X @ W_v      # (n, d_v)
A = softmax(Q @ K.T, eksen=1)
Y = A @ V

Ayrı dönüşümler sayesinde "aradığı" ile "sunduğu" farklı olabilir: bir fiil öznesini arayabilir, ama kendisi başka bir şey sunar.

Arama motoru benzetmesi

Attention yumuşak bir sözlük aramasıdır: sorgu (query) tüm anahtarlarla (key) karşılaştırılır, eşleşme oranında değerler (value) karıştırılır. Tek bir anahtar mükemmel eşleşirse sonuç neredeyse o anahtarın değeridir:

K = np.array([[10., 0.], [0., 10.]])
V = np.array([[1., 2.], [3., 4.]])
q = np.array([1., 0.])          # ilk anahtara benziyor
print(np.round(softmax(q @ K.T) @ V, 3))   # [1. 2.]: ilk değer

Klasik sözlükte arama "ya tam eşleşir ya hiç"tir; attention bunun türevlenebilir hâlidir.

Uygulama Q, K, V

X (3 eleman, 4 boyut) ve öğrenilmiş gibi verilen W_q, W_k, W_v ile Q, K, V'yi hesapla. Dikkat matrisini satır başına softmax ile bul; şekillerini (Q.shape, A.shape, Y.shape) aynı satırda, ardından A'nın ilk satırını np.round(..., 3) ile yazdır.

Başlangıç kodu

model.py
import numpy as np

def softmax(z, eksen=-1):
    e = np.exp(z - z.max(axis=eksen, keepdims=True))
    return e / e.sum(axis=eksen, keepdims=True)

X = np.array([[1., 0., 1., 0.], [0., 1., 0., 1.], [1., 1., 0., 0.]])
W_q = np.eye(4)[:, :2]
W_k = np.eye(4)[:, 1:3]
W_v = np.eye(4)

# buraya yaz

Örnek çözüm

model.py
import numpy as np

def softmax(z, eksen=-1):
    e = np.exp(z - z.max(axis=eksen, keepdims=True))
    return e / e.sum(axis=eksen, keepdims=True)

X = np.array([[1., 0., 1., 0.], [0., 1., 0., 1.], [1., 1., 0., 0.]])
W_q = np.eye(4)[:, :2]
W_k = np.eye(4)[:, 1:3]
W_v = np.eye(4)

Q, K, V = X @ W_q, X @ W_k, X @ W_v
A = softmax(Q @ K.T, eksen=1)
Y = A @ V
print(Q.shape, A.shape, Y.shape)
print(np.round(A[0], 3))

Beklenen çıktı

(3, 2) (3, 3) (3, 4)
[0.155 0.422 0.422]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir elemanın diğerine ne kadar dikkat edeceği hangi iki parçadan hesaplanır?

  • İkisinin Value'su
  • Query ve Value
  • Yalnızca Key
  • Birinin Query'si ile diğerinin Key'i Doğru cevap

Açıklama: Skor = q_i · k_j; Value yalnızca taşınan bilgidir.

2 Sorguları anahtarlarla karşılaştır.

Soru
skor = Q @ ____
Cevap
skor = Q @ K.T

Açıklama: Q Kᵀ her sorgu-anahtar çiftinin iç çarpımıdır.

3 Rolleri eşleştir.

Kavram Anlamı
Query Ne arıyorum?
Key Bende ne var?
Value Ne veririm?
W_q, W_k, W_v Öğrenilen dönüşümler

Uzman bölümündeki tüm dersler