Meydan okuma 1
- Makine Öğrenmesi kursu
- Uzman
- Ders 41/44
- 8 dk
Attention mekanizmasını uygularsın.
Meydan okuma: nedensel çok başlı dikkat
Bu meydan okumada GPT'nin kalbindeki katmanı sıfırdan yazacaksın: nedensel çok başlı dikkat. Parçaları birleştir:
- Q, K, V projeksiyonları ve (n, d) → (h, n, d/h) bölme
- √(d/h) ile ölçekli skorlar
- Köşegenin üstüne −∞ maske
- Başları birleştirip W_o çıkış projeksiyonu
def mha(x, Wq, Wk, Wv, Wo, h, nedensel=True):
n, d = x.shape
bol = lambda M: M.reshape(n, h, d // h).transpose(1, 0, 2)
...
return Y @ Wo, ADoğruluğu iki testle sına: ağırlık satırları 1'e toplanmalı ve gelecek değişince geçmiş değişmemeli.
Uygulama Nedensel MHA
mha(x, Wq, Wk, Wv, Wo, h, nedensel=True) fonksiyonunu yaz; çıktı ve (h, n, n) ağırlıkları döndürsün. Verilen x (6×12) ve h = 3 için çıktı ile ağırlık şekillerini aynı satırda yazdır. Ardından şu üç testi aynı satırda yazdır: satır toplamları 1 mi (np.allclose), ilk konumun diğerlerine ağırlığı 0 mı ((A[:, 0, 1:] == 0).all()), son satır değişince ilk beş çıktı aynı mı.
Başlangıç kodu
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)
rng = np.random.default_rng(0)
n, d, h = 6, 12, 3
x = rng.normal(size=(n, d))
Wq, Wk, Wv, Wo = rng.normal(size=(4, d, d)) * 0.3
x2 = x.copy()
x2[-1] += 2
# buraya yazÖrnek çözüm
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)
rng = np.random.default_rng(0)
n, d, h = 6, 12, 3
x = rng.normal(size=(n, d))
Wq, Wk, Wv, Wo = rng.normal(size=(4, d, d)) * 0.3
x2 = x.copy()
x2[-1] += 2
def mha(x, Wq, Wk, Wv, Wo, h, nedensel=True):
n, d = x.shape
bol = lambda M: M.reshape(n, h, d // h).transpose(1, 0, 2)
Qh, Kh, Vh = bol(x @ Wq), bol(x @ Wk), bol(x @ Wv)
skor = Qh @ Kh.transpose(0, 2, 1) / np.sqrt(d // h)
if nedensel:
skor = np.where(np.triu(np.ones((n, n), dtype=bool), k=1), -np.inf, skor)
A = softmax(skor)
Y = (A @ Vh).transpose(1, 0, 2).reshape(n, d)
return Y @ Wo, A
Y, A = mha(x, Wq, Wk, Wv, Wo, h)
Y2, _ = mha(x2, Wq, Wk, Wv, Wo, h)
print(Y.shape, A.shape)
print(np.allclose(A.sum(-1), 1), (A[:, 0, 1:] == 0).all(), np.allclose(Y[:5], Y2[:5]))Beklenen çıktı
(6, 12) (3, 6, 6) True True True
Uygulama Yumuşak sözlük araması
Attention'ın bir arama tablosu gibi çalıştığını göster. Verilen 8 anahtar (birim vektörler, ölçek s ile çarpılmış) ve 8 değer için her anahtarın kendisini sorgu olarak kullan; softmax(Q @ K.T) @ V çıktısının en yakın değerini (argmin uzaklık) bul. s = 0.5, 2 ve 8 için doğru bulma oranını ve doğru değere ortalama ağırlığı (köşegen ortalaması) round(..., 2) ile aynı satırda yazdır.
Başlangıç kodu
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)
rng = np.random.default_rng(1)
birim = np.eye(8)
V = rng.normal(size=(8, 3))
# buraya yazÖrnek çözüm
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)
rng = np.random.default_rng(1)
birim = np.eye(8)
V = rng.normal(size=(8, 3))
for s in [0.5, 2, 8]:
K = birim * s
A = softmax(K @ K.T)
Y = A @ V
uzak = ((Y[:, None, :] - V[None, :, :]) ** 2).sum(-1)
dogru = (uzak.argmin(axis=1) == np.arange(8)).mean()
print(s, round(dogru, 2), round(np.diag(A).mean(), 2))Beklenen çıktı
0.5 0.12 0.16 2 1.0 0.89 8 1.0 1.0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 d = 12, h = 3 iken skorlar hangi sayıya bölünür?
- 2 Doğru cevap
- √12 ≈ 3.46
- 4
- 3
Açıklama: Her baş d/h = 4 boyutlu; √4 = 2.
2 Başları birleştirip (n, d) şekline döndür.
Y = (A @ Vh).transpose(1, 0, 2).____(n, d)
Y = (A @ Vh).transpose(1, 0, 2).reshape(n, d)
Açıklama: Önce (n, h, d/h) sırasına çevir, sonra birleştir.
3 Testleri eşleştir.
| Kavram | Anlamı |
|---|---|
A.sum(-1) ≈ 1 |
Geçerli dağılım |
geçmiş değişmez |
Nedensellik |
A[:, 0, 1:] = 0 |
İlk konum yalnızca kendine bakar |
Y.shape = (n, d) |
Yığılabilirlik |