CodeBlanks Logo Icon CodeBlanks

Decoder

Decoder, encoder çıktısını ve önceki çıktıyı kullanarak tahmin üretir.

Decoder

Decoder çıktı dizisini soldan sağa üretir. Encoder bloğuna göre iki farkı vardır:

  • Maskeli öz-dikkat: konum i yalnızca 0..i'ye bakar; gelecekteki kelimeleri göremez.
  • Çapraz dikkat: Query decoder'dan, Key ve Value encoder çıktısından gelir; çeviride hedef kelime kaynak cümleye bakar.
x = layer_norm(x + masked_self_attn(x))
x = layer_norm(x + cross_attn(Q=x, K=enc, V=enc))
x = layer_norm(x + ffn(x))

Çapraz dikkatin ağırlık matrisi (hedef uzunluğu × kaynak uzunluğu) şeklindedir; kare olmak zorunda değildir.

Nedensel maske

Maske, softmax'tan önce gelecek konumların skorunu −∞ yapar; böylece ağırlıkları tam 0 olur. Alt üçgen bir boolean matrisle kurulur:

n = 4
maske = np.tril(np.ones((n, n), dtype=bool))
skor = np.where(maske, skor, -np.inf)
A = softmax(skor, eksen=-1)
print(np.round(A[1], 2))     # yalnızca ilk iki konum sıfırdan büyük

Eğitimde tüm hedef dizi tek seferde verilir; maske sayesinde her konum yine yalnızca geçmişi görür (teacher forcing).

Uygulama Maskeli ve çapraz dikkat

Decoder dizisi y (3 konum) için maskeli öz-dikkat ağırlıklarını hesapla ve np.round(..., 3) ile yazdır. Ardından encoder çıktısı enc (5 konum) ile çapraz dikkat ağırlıklarını hesapla ve yalnızca şeklini 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)

y = np.array([[1., 0.], [0., 1.], [1., 1.]])
enc = np.random.default_rng(0).normal(size=(5, 2))
n = len(y)

# 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)

y = np.array([[1., 0.], [0., 1.], [1., 1.]])
enc = np.random.default_rng(0).normal(size=(5, 2))
n = len(y)

maske = np.tril(np.ones((n, n), dtype=bool))
skor = np.where(maske, y @ y.T / np.sqrt(2), -np.inf)
print(np.round(softmax(skor), 3))
C = softmax(y @ enc.T / np.sqrt(2))
print(C.shape)

Beklenen çıktı

[[1.    0.    0.   ]
 [0.33  0.67  0.   ]
 [0.248 0.248 0.503]]
(3, 5)

Soru ve cevaplar

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

1 Çapraz dikkatte Key ve Value nereden gelir?

  • Decoder'ın kendisinden
  • Konum kodlamasından
  • Rastgele başlatılır
  • Encoder çıktısından Doğru cevap

Açıklama: Query decoder'dan, Key/Value encoder'dan gelir.

2 Gelecek konumları maskele.

Soru
skor = np.where(maske, skor, -np.____)
Cevap
skor = np.where(maske, skor, -np.inf)

Açıklama: −∞'un üsteli 0'dır; ağırlık tam sıfır olur.

3 Dikkat türlerini eşleştir.

Kavram Anlamı
encoder öz-dikkati Tüm diziye bakar
maskeli öz-dikkat Yalnızca geçmişe bakar
çapraz dikkat Kaynak cümleye bakar
np.tril Alt üçgen maske

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