# Transformery ## (2017)  ---- ## *seq2seq* Rozważmy model typu *sekwencja do sekwencji* (*seq2seq*). **Założenie**: model może przetwarzać sekwencje o dowolnej długości z wykorzystaniem tych samych parametrów.

Architektura ta jest bardzo elastyczna, umożliwia różnorodność zastosowań: - sekwencja $\rightarrow$ sekwencja - sekwencja $\rightarrow$ wartość - wartość $\rightarrow$ sekwencja - model autoregresyjny
Model może uwzględniać przyczynowość lub nie. Modele uwzględniające przyczynowość mogą patrzeć tylko wstecz. ---- ### *seq2seq* Modele seq2seq możemy zbudować z wykorzystaniem sieci rekurencyjnych (RNN) lub sieci splotowych (CNN). Jednak oba te rozwiązania mają wady:
- **sieci rekurencyjne** mogą przetwarzać niekończone sekwencje, jednak ich sekwencyjne działanie czyni je wolnymi - **sieci splotowe** pozwalają na równoległe obliczenia, jednak wymagają stałej długości sekwencji Alternatywą dla tych rozwiązań jest mechanizm **uwagi własnej** (*self-attention*).

--- ## Uwaga własna ### wersja uproszczona

Każde wyjście jest kombinacją liniową wszystkich wejść. Jednak współczynniki tej kombinacji nie są parametrem modelu, lecz są wyliczane na podstawie wejść. $$\vec y_i = \sum\limits_j w_{ij} \vec x_j$$ **Uwaga**: wejście i wyjście mają ten sam wymiar. Jeśli zależy nam na innym wymiarze wyjścia, możemy dokonać projekcji (użyć warstwy liniowej).
---- ### Uwaga własna - wersja uproszczona

\[\begin{aligned} w\prime_{ij} &= \vec x_i \cdot \vec x_j \\ w_{ij} &= \frac{e^{w\prime_{ij}}}{\sum\limits_k e^{w\prime_{ik}}} = softmax(w\prime_{ij}) \\ \vec y_i &= \sum\limits_j w_{ij} \vec x_j \end{aligned}\]
- wektory wyjściowe są średnimi ważonymi wektorów wejściowych - mechanizm komunikacji - macierz $W$ zawiera informację o relacjach między wektorami wejściowymi
---- ## Własności uwagi własnej - w uproszczonej wersji brak parametrów (zaraz to naprawimy) - przetwarza bardziej zbiór niż sekwencję (to naprawimy nieco później) - permutacja wejścia skutkuje odpowiednią permutacją wyjścia: $perm(sa(x)) = sa(perm(x))$  ---- ### Przykład: klasyfikacja opinii  ----

- iloczyn z innymi tokenami zapewnia dodatkową informację o kontekście - np. iloczyn z tokenem "*nie*" może odwrócić znaczenie
--- ## Poprawiamy wersję uproszczoną - parametryzacja (klucz, zapytanie, wartość) - przeskalowanie - kodowanie pozycji - przyczynowość (maskowanie) ---- ## Wprowadzamy parametry
W kompletnej wersji uwagi własnej każdy wektor wejściowy emituje trzy wektory: - klucz (*key*) - zapytanie (*query*) - wartość (*value*) $$ w\prime_{ij} = \vec q_i \cdot \vec k_j $$ $$\vec y_i = \sum\limits_j w_{ij} \vec v_j$$
- Klucz i zapytanie są wektorami o tym samym wymiarze ($d_k$). - Każdy klucz w jakimś zakresie pasuje do każdego zapytania. - Zwracana jest kombinacja wszystkich wartości.

---- ## Przeskalowanie
$$ w\prime_{ij} = \frac{\vec q_i \cdot \vec k_j}{\sqrt{d_k}} $$ $d_k$ - wymiar zapytania i klucza
- Przeskalowujemy iloczyn skalarny przez pierwiastek wymiaru wektorów klucza i zapytania. - Dzięki temu wejście i wyjście mają zbliżoną wariancję. - Przeskalowanie pomaga uniknąć znikaniu gradientu w funkcji *softmax*, co ma miejsce przy dużych wartościach argumentów.
----
### Uwaga własna jako słownik W słowniku do zapytania może pasować tylko jeden klucz. W uwadze własnej do zapytania może pasować w jakimś stopniu wiele kluczy.

---- ### Jaka intuicja stoi za mechanizmem uwagi?

 $score = u_1m_1 + u_2m_2 + u_3m_3$
----
## Klucz, zapytanie i wartość Wprowadzamy macierze parametryzujące klucz, zapytanie i wartość: $W_k$, $W_q$, $W_v$.
\[\begin{aligned} \vec k_i &= W_k \vec x_i \\ \vec q_i &= W_q \vec x_i \\ \vec v_i &= W_v \vec x_i \end{aligned}\]

----
### Uwaga własna z uwzględnieniem klucza, zapytania i wartości
\[\begin{aligned} y_i = \sum\limits_j softmax \left( \frac{\vec q_i \cdot \vec k_j}{\sqrt{d_k}} \right) \cdot \vec v_j \end{aligned}\]
lub w postaci macierzowej: $$Y = V \cdot softmax \left( \frac{K^T \cdot Q}{\sqrt{d_k}} \right)$$ ⚠️ *W oryginalnej pracy wektory są wierszami macierzy, w tej prezentacji są kolumnami.*

--- ## Kodowanie pozycji
Uwaga własna nie uwzględnia kolejności wektorów wejściowych. Informacja o pozycji musi zostać dodatkowo zakodowana w wektorach wejściowych. #### Założenia mechanizmu kodowania pozycji: - wartość kodująca pozycję musi być unikalna dla każdego wektora w sekwencji wejściowej - odległość pomiędzy dowolną parą kolejnych wektorów wejściowych musi być ta sama - funkcja kodująca musi dać się uogólnić na sekwencję o dowolnej długości - funkcja powinna być deterministyczna

---- ### Kodowanie pozycji Funkcja używana w praktyce: $$ \vec p(t) = [\sin(\omega_1 t), \cos(\omega_1 t), \sin(\omega_2 t), \cos(\omega_2 t), \cdots, \sin(\omega_{d/2} t), \cos(\omega_{d/2} t)]$$ - częstotliwość $\omega_k = \frac{1}{10000^{2k/d}}$ - każdemu wymiarowi odpowiada sinusoida - okresy tworzą ciąg geometryczny od $2\pi$ do $10000\cdot 2\pi$ - metoda odpowiednia zarówno do kodowania pozycji globalnych, jak i względnych


----
### Kodowanie pozycji Analogia do reprezentacji binarnej liczb całkowitych: - pierwszy (najmniej znaczący) bit - okres 2 - drugi bit - okres 4 - trzeci bit - okres 8 - etc.
0. *0000* 1. *0001* 2. *0010* 3. *0011* 4. *0100* 5. *0101* 6. *0110* 7. *0111* 8. *1000* 9. *1001* 10. *1010* 11. *1011* 12. *1100* 13. *1101* 14. *1110* 15. *1111*
----
## Przyczynowość - Mechanizm uwagi własnej nie jest przyczynowy. - Jeśli zależy nam na przyczynowości, musimy wprowadzić tzw. maskowanie. - Maskowanie pozwala na ograniczenie zakresu uwagi własnej do pewnego podzbioru wektorów wejściowych. - Przyczynowość oznacza, że wektor wyjściowy $\vec y_n$ jest funkcją wyłącznie wektorów wejściowych $\vec x_1, \vec x_2, \cdots, \vec x_n$.

---- ## Wielowątkowa uwaga własna ### (*multi-head self-attention*) W NLP słowo może być w różnych relacjach z innymi słowami. Weźmy zdanie z poprzedniego przykładu: "*Ta restauracja nie była taka straszna*". Słowo "*straszna*" jest w tym zdaniu w różnych relacjach: - odnosi się do "*restauracja*" - jest łagodzone przez "*taka*" (w sensie "*aż taka*") - ma odwrócone znaczenie przez "*nie*" Wprowadzenie równoległych modułów uwagi własnej pozwala na wykrywanie różnych relacji. ---- ### Wielowątkowa uwaga własna W celu zrównoleglenia wielogłowicowej uwagi własnej, każdy z modułów wykonuje identyczne obliczenia, ale na różnych danych. - Wektory wejściowe są dzielone na $H$ mniejszych wektorów poprzez dokonanie liniowej projekcji. - Każdy z mniejszych wektorów jest poddawany osobno obliczeniom uwagi własnej. - Wszystkie wyniki są łączone w jeden wektor wyjściowy.  --- # Transformer - architektura sieci neuronowej wykorzystująca mechanizm uwagi własnej - transformery pozwalają na równoległe przetwarzanie długich sekwencji - są alternatywą dla sieci rekurencyjnych, a w przyszłości być może także dla sieci splotowych - transformery mogą przetwarzać zarówno zbiory, jak i sekwencje (po zakodowaniu pozycji) - transformery realizują architekturę *koder-dekoder* - w pierwotnej wersji zaproponowane jako modele do tłumaczenia maszynowego ----
- oryginalny model ma strukturę typu *koder-dekoder* (zastosowanie do tłumaczenia maszynowego) - sam koder może być wykorzystany do przetwarzania sekwencji np. na potrzeby klasyfikacji - sam dekoder może być wykorzystany do generowania sekwencji (np. *GPT*)

----
## Wejście - Wektory wejściowe są zanurzane w przestrzeń wektorów o wymiarze $d$. - Do wektorów wejściowych dodawane są wektory pozycji.

----
## Koder - Koder składa się z $N$ bloków. - Każdy blok kodera zawiera dwie części: - warstwa uwagi własnej (bez maskowania) - blok gęsty (operujący na pojedynczym wektorze) - dwie warstwy liniowe (pierwsza z $4d$ neuronami) - nieliniowość w postaci funkcji aktywacji *ReLU* lub *GeLU* (*GPT*) - ew. warstwę dropout Koder wykorzystuje połączenia rezydualne (patrz: *Residual Neural Networks*) i normalizację warstwową.

---- ## Normalizacja warstwowa ### (*layer normalization*) - Warstwa normalizacji warstwowej jest alternatywą dla normalizacji wsadowej (patrz: *Batch Normalization*). - Przesunięcie i skalowanie jest wykonywane na poziomie pojedynczej warstwy. $$ \vec y = \gamma \cdot \frac{\vec x - \mu}{\sigma} + \beta $$ - Wielkości $\mu$ i $\sigma$ to odpowiednio średnia i odchylenie standardowe wektora $\vec x$. - Wielkości $\gamma$ i $\beta$ to parametry warstwy (uczone). Patrz: [Przegląd metod normalizacji](https://medium.com/nerd-for-tech/overview-of-normalization-techniques-in-deep-learning-e12a79060daf) ----
## Dekoder - Rolą dekodera jest wygenerowanie sekwencji wyjściowej. - Dekoder działa w sposób autoregresywny, tj. wyjście dekodera w kroku $t$ jest wykorzystywane jako wejście w kroku $t+1$. - Dekoder składa się z $N$ bloków. - Każdy blok dekodera zawiera trzy części: - warstwa uwagi własnej (z maskowaniem) - warstwa uwagi względnej (bez maskowania) - blok gęsty (operujący na pojedynczym wektorze)

----
## Uwaga względna ### (*cross-attention*) - mechanizm mieszania dwóch różnych sekwencji - wektory **klucza i wartości** pochodzą z kodera - wektor **zapytania** pochodzi z dekodera - warstwa uwagi własnej znajduje relacje między tokenami wyłącznie w obrębie jednej sekwencji (np. wejściowej w koderze) - warstwa uwagi względnej pozwala na wykrywanie relacji między tokenami z różnych sekwencji (np. w tłumaczeniu maszynowym - relacja między słowami w dwóch różnych językach)

----
## Wyjście - Wyjście dekodera trafia do warstwy liniowej, która dokonuje liniowej projekcji na przestrzeń wektorów o wymiarze równym rozmiarowi słownika. - Warstwa *softmax* zwraca gęstość prawdopodobieństwa, z którego próbkowany jest kolejny token. - Wygenerowany wektor dołączany jest do sekwencji wchodzącej do dekodera w następnym kroku.

--- ### Przykłady działania uwagi własnej  ----  ----  ----
## GPT - GPT (*Generative Pre-trained Transformer*) - model językowy oparty na dekoderze transformera. - pierwsza wersja: 12 poziomów, 12 wątków uwagi ### Rozwój modelu - GPT-1 (2018) - $117 \times 10^6$ parametrów, zestaw treningowy: 4.5 GB czystego tekstu - GPT-2 (2019) - $1.5 \times 10^9$ parametrów, zestaw treningowy: 40 GB - GPT-3 (2020) - $175 \times 10^9$ parametrów, zestaw treningowy: 570 GB - GPT-4 (2023) - brak informacji

---- ## Źródła - [Attention is all you need](https://arxiv.org/pdf/1706.03762.pdf) - [Let's build GPT: from scratch, in code, spelled out. - Andrej Karpathy](https://www.youtube.com/watch?v=kCc8FmEb1nY)
## Źródła ilustracji - [Attention - CS231n Course Materials](https://github.com/cs231n/cs231n.github.io/blob/master/attention.md) - [Transformers - Deep Learning at VU University Amsterdam](https://dlvu.github.io/slides/dlvu.lecture12.pdf)