aitech-moj-2023/wyk/11_Transformer.org

2.8 KiB

Transformer

Atencja jako „miękka” baza danych

O atencji można myśleć metaforycznie jako o odpytywaniu „miękkiej”, wektorowej bazy danych. Możemy sobie wyobrazić, że słowa $w_1,\dots,w_{j-1}$ są naszą bazą danych, a słowo $w_j$ (z którego kierujemy „snop” uwagi) jest zapytaniem (query). To zapytanie dopasowujemy do kluczy (keys), w najprostszym ujęciu po prostu słów $w_1,\dots,w_{j-1}$ (a właściwie ich zanurzeń). Jeśli klucz pasuje do zapytania, odpowiednia wartość (value) jest wydobywana z bazy. Nasza baza jest jednak „miękka”, nie — zerojedynkowa, zapytanie pasuje do klucza w pewnym stopniu, mniej lub bardziej.

W najprostszym ujęciu wartości są tym samym co klucze, czyli z naszej bazy wydobywamy te same zanurzenia słów, których używamy jako kluczy. Można jednak skomplikować schemat rozróżniając klucze i wartości — mogą one powstawać przez rzutowanie podstawowych zanurzeń różnymi macierzami:

$$\vec{k_i} = W_k E(w_i),$$

$$\vec{v_i} = W_v E(w_i).$$

Również samo zapytanie może powstać przez rzutowanie:

$$\vec{q_i} = W_q E(w_i).$$

Jeśli zanurzenie $E(w_i)$ o rozmiarze $m$ przedstawimy w postaci kolumnowej, wówczas macierze będą $W_k$ i $W_q$ będą miały rozmiar $d_k \times m$, gdzie $d_k$ jest rozmiarem kluczy i zapytań (dlaczego wektory kluczy i zapytań powinny mieć raczej ten sam rozmiar?), zaś macierz $W_v$ — $d_v \times m$, gdzie $d_v$ to rozmiar zanurzenia wektora wartości. Zazwyczaj $d_k = d_v = m$, ale nie jest to obligatoryjne.

Teraz nieznormalizowane wagi atencji przyjmą postać:

$$\hat{\alpha}_{i,j} = \vec{q_i}^T\vec{k_j} = (W_q E(w_i))(W_k E(k_j)).$$

Zauważmy, że ciąg $\hat{\alpha}_{1,j},\dots,\hat{\alpha}_{j-1,j}$ można potraktować jako wektor $\hat{\vec{\alpha}_{*,j}}$ i wyliczać w postaci zwartej:

$$\hat{\vec{\alpha}_{*,j}} = \vec{q_j}^T K$$

gdzie $K$ to macierz kluczy złożona z wektorów $\vec{k_1},\dots,\vec{k_{j-1}}$, tj. macierz o rozmiarze $d_k \times (j-1)$.

Wektor znormalizowanych wag atencji będzie miał wówczas postać:

$$\vec{\alpha}_{*,j} = \operatorname{softmax}(\vec{q_j}^T K).$$

Dokonajmy teraz agregacji wartości — obliczamy średnią wektorów wartości ($\vec{v_i}$) ważoną atencją:

$$A(w_1,\dots,j-1) = \alpha_{1,j} \vec{v_1} + \dots + \alpha_{j-1,j} \vec{v_{j-1}} = \sum_{i=1}^{j-1} \alpha_{i,j} v_i.$$

Jeśli $j-1$ wektorów wartości ułożyłem w macierz $V$ (o rozmiarze $(j-1) \times d_v$), powyższy wzór będziemy mogli zapisać jako iloczyn wektora wag atencji i macierzy $V$:

$$A(w_1,\dots,j-1) = \vec{\alpha}_{*,j}^T V = \operatorname{softmax}(\vec{q_j}^T K)^T V.$$

Sposób patrzenia na atencję przez pryzmat trójki zapytania-klucze-wartości okaże się niezwykle ważny w wypadku modelu Transformer (zob. kolejny wykład).