aitech-eks-pub/wyk/15_transformer.org

3.2 KiB

Modele Transformer

Atencja

Atencję w modelach Transformer można interpretować jako rodzaj „miękkiego” odpytywania swego rodzaju bazy danych, w której przechowywane są pary klucz-wartość. Mamy trzy rodzaje wektorów (a właściwie macierzy, bo wektory są od razu upakowane w macierze):

  • $Q$ - macierz zapytań,
  • $K$ - macierz kluczy,
  • $V$ - macierz wartości odpowiadających kluczom $K$.

W atencji modeli Transformer patrzymy jak bardzo zapytania $Q$ pasują do kluczy $K$ i na tej podstawie zwracamy wartości $V$ (im bardziej klucz pasuje do zapytania, tym większy wkład wnosi odpowiednia wartość). Ten rodzaj odpytywania można zrealizować z pomocą mnożenia macierzy i funkcji softmax:

$$\operatorname{Atention}(Q,K,V) = \operatorname{softmax}(QK^T)V$$

Uproszczony przykład

Załóżmy, że rozmiar embeddingu wynosi 4, w macierzach rozpatrywać będziemy po 3 wektory naraz (możemy sobie wyobrazić, że zdanie zawiera 3 wyrazy).

import torch

Q =  torch.tensor([
        [0.3, -2.0, 0.4, 6.0],
        [-1.0, 1.5, 0.2, 3.0],
        [0.3, -1.0, 0.2, 1.0]])

K =  torch.tensor([
        [-0.5, 1.7, 0.3, 4.0],
        [0.4, -1.5, 0.3, 5.5],
        [-1.0, -3.5, 1.0, 4.0]])

M = Q @ torch.transpose(K, 0, 1)
M
  tensor([[20.5700, 36.2400, 31.1000],
  [15.1100, 13.9100,  7.9500],
  [ 2.2100,  7.1800,  7.4000]])

Jak widać, najbardziej pierwszy wektor $Q$ pasuje do drugiego wektora $K$. Znormalizujmy te wartości używać funkcji softmax.

import torch

Mn = torch.softmax(M, 1)
Mn
  tensor([[1.5562e-07, 9.9418e-01, 5.8236e-03],
  [7.6807e-01, 2.3134e-01, 5.9683e-04],
  [3.0817e-03, 4.4385e-01, 5.5307e-01]])

Drugi wektor zapytania najbardziej pasuje do pierwszego klucza, trochę mniej do drugiego klucza, o wiele mniej do trzeciego klucza. Te wektory to oczywiście wektory atencji (drugie słowo najbardziej „patrzy” na pierwsze słowo).

Teraz będziemy przemnażać przez wektory wartości:

import torch

V =  torch.tensor([
        [0.0, 9.0, 0.0, -5.0],
        [4.0, 0.1, 0.1, 0.1],
        [-0.3, 0.0, 0.3, 10.0]])

Mn @ V
  tensor([[ 3.9750,  0.0994,  0.1012,  0.1577],
  [ 0.9252,  6.9357,  0.0233, -3.8112],
  [ 1.6095,  0.0721,  0.2103,  5.5597]])

Dodatkowa normalizacja

W praktyce dobrze jest znormalizować pierwszy iloczyn przez $\sqrt{d_k}$, gdzie $d_k$ to rozmiar wektora klucza.

$$\operatorname{Atention}(Q,K,V) = \operatorname{softmax}(\frac{QK^T}{d^k})V$$

Skąd się biorą Q, K i V?

Wektory (macierze) $Q$, $K$ i $V$ w pierwszej warstwie pochodzą z embeddingów tokenów $E$ (właściwie jednostek BPE).

  • $Q$ = $EW^Q$
  • $K$ = $EW^K$
  • $V$ = $EW^V$

W kolejnych warstwach zamiast $E$ wykorzystywane jest wyjście z poprzedniej warstwy.