CodeBlanks Logo Icon CodeBlanks

Positional encoding

Positional encoding, dizideki konum bilgisini modele verir.

Konum kodlaması

Dikkat konumdan habersizdir: kelimelerin sırasını karıştırsan çıktılar da aynı biçimde karışır (permütasyona eşdeğişken). Sırayı bildirmek için girişe bir konum kodlaması eklenir. Orijinal makale sinüs/kosinüs kullanır:

def konum_kodu(n, d):
    pos = np.arange(n)[:, None]
    i = np.arange(0, d, 2)
    aci = pos / 10000 ** (i / d)
    PE = np.zeros((n, d))
    PE[:, 0::2] = np.sin(aci)
    PE[:, 1::2] = np.cos(aci)
    return PE

x = gomme + konum_kodu(n, d)

Düşük boyutlar hızlı, yüksek boyutlar yavaş salınır; böylece her konum benzersiz bir "parmak izi" alır.

Permütasyon eşdeğişkenliği

Bunu sayısal olarak görebilirsin: satırları ters çevirip öz-dikkat uygulamak, öz-dikkatin çıktısını ters çevirmekle aynıdır. Konum kodu eklenince bu eşitlik bozulur:

ters = x[::-1]
print(np.allclose(oz_dikkat(ters), oz_dikkat(x)[::-1]))     # True
xp = x + konum_kodu(n, d)
tp = x[::-1] + konum_kodu(n, d)
print(np.allclose(oz_dikkat(tp), oz_dikkat(xp)[::-1]))      # False

BERT ve GPT gibi modeller sabit sinüs yerine öğrenilen konum gömmeleri kullanır; yeni modeller ise RoPE gibi göreli yöntemler tercih eder.

Uygulama Sinüs konum kodu

konum_kodu(n, d) fonksiyonunu yaz. konum_kodu(4, 6)'nın şeklini ve ilk satırını alt alta, ardından ikinci satırını np.round(..., 3) ile yazdır. Son olarak verilen oz_dikkat ile satırları ters çevirmenin konum kodu olmadan eşdeğişken, konum koduyla eşdeğişken olmadığını np.allclose ile aynı satırda 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)

def oz_dikkat(x):
    return softmax(x @ x.T / np.sqrt(x.shape[1])) @ x

x = np.random.default_rng(0).normal(size=(4, 6))

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

def oz_dikkat(x):
    return softmax(x @ x.T / np.sqrt(x.shape[1])) @ x

x = np.random.default_rng(0).normal(size=(4, 6))

def konum_kodu(n, d):
    pos = np.arange(n)[:, None]
    i = np.arange(0, d, 2)
    aci = pos / 10000 ** (i / d)
    PE = np.zeros((n, d))
    PE[:, 0::2] = np.sin(aci)
    PE[:, 1::2] = np.cos(aci)
    return PE

PE = konum_kodu(4, 6)
print(PE.shape)
print(PE[0])
print(np.round(PE[1], 3))
esit1 = np.allclose(oz_dikkat(x[::-1]), oz_dikkat(x)[::-1])
esit2 = np.allclose(oz_dikkat(x[::-1] + PE), oz_dikkat(x + PE)[::-1])
print(esit1, esit2)

Beklenen çıktı

(4, 6)
[0. 1. 0. 1. 0. 1.]
[0.841 0.54  0.046 0.999 0.002 1.   ]
True False

Soru ve cevaplar

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

1 Konum kodlaması olmadan "kedi köpeği kovaladı" ile "köpek kediyi kovaladı" neden karışır?

  • Softmax hatalıdır
  • Ölçekleme eksiktir
  • Dikkat sırayı görmez; aynı kelimeler aynı temsilleri üretir Doğru cevap
  • Sözlük çok küçüktür

Açıklama: Kelime kümesi aynıysa, sıra bilgisi olmadan temsiller de aynıdır.

2 Çift boyutlara sinüs yerleştir.

Soru
PE[:, 0::____] = np.sin(aci)
Cevap
PE[:, 0::2] = np.sin(aci)

Açıklama: 0::2 çift indeksleri, 1::2 tek indeksleri seçer.

3 Eşleştir.

Kavram Anlamı
PE[0, 0::2] Hepsi 0 (sin 0)
PE[0, 1::2] Hepsi 1 (cos 0)
düşük boyut Hızlı salınım
RoPE Göreli konum

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