Fixes, changing structure

This commit is contained in:
Filip Gralinski 2022-06-04 09:13:25 +02:00
parent 9a3d411257
commit ceb6fb7ef7
2 changed files with 73 additions and 70 deletions

View File

@ -90,67 +90,6 @@ słowo odgadywane.
#+CAPTION: Atencja użyta w prostym neuronowym modelu języka
[[./10_Atencja/simple-attention.drawio.png]]
** 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).
** Atencja jako składnik sieci rekurencyjnej
@ -175,7 +114,7 @@ $$P_M(w_j|w_1,\dots,w_{j-1}) = ?.$$
Załóżmy, że mamy pewien początek (*prefiks*) tekstu o długości $p$:
$w_1,\dots,w_p$. Powiedzmy, że naszym celem jest *wygenerowanie*
dokończenia czy kontynuacji tego tekstu (nie określamy z góry tej
dokończenia czy kontynuacji tego tekstu (nie określamy z góry
długości tej kontynuacji).
Najprostszy sposób wygenerowania pierwszego wyrazu dokończenia polega
@ -183,7 +122,7 @@ na wzięciu wyrazu maksymalizującego prawdopodobieństwo według modelu języka
$$w_{p+1} = \operatorname{argmax}_w P_M(w|w_1,\dots,w_p).$$
*Pytanie*: Dlaczego \operatorname{argmax}, a nie \operatorname{max}?
*Pytanie*: Dlaczego $\operatorname{argmax}$, a nie $\operatorname{max}$?
Słowo $w_{p+1}$ możemy dołączyć do prefiksu i powtórzyć procedurę:
@ -209,9 +148,9 @@ przedstawić jako zadanie generowania tekstu. Przykładem jest tłumaczenie masz
W tłumaczeniu maszynowym (tłumaczeniu automatycznym, ang. /machine
translation/) na wejściu podawany jest tekst (na ogół pojedyncze
zdanie) źródłowy (/source sentence/) $S = (u_1,\dots,u_|S|)$, celem
zdanie) źródłowy (/source sentence/) $S = (u_1,\dots,u_{|S|})$, celem
jest uzyskanie tekstu docelowego (/target sentence/)
$T=(w_1,\dots,w_|T|). Zakładamy, że $S$ jest tekstem w pewnym języku
$T=(w_1,\dots,w_{|T|}). Zakładamy, że $S$ jest tekstem w pewnym języku
źródłowym (/source language/), zaś $T$ — w innym języku, języku
docelowym (/target language/).
@ -233,8 +172,8 @@ The 'new Member States' - actually, the name continues to be sort of conditional
The number of armed attacks also rose by 200% overall. Także liczba ataków zbrojnych wzrosła łącznie o 200 %.
#+END_SRC
Zauważmy, że możemy taki tekst modelować po prostu traktując jako
jeden. Innymi słowy, nie modelujemy tekstu angielskiego ani polskiego,
Zauważmy, że możemy taki (bi)tekst modelować po prostu traktując jako
jeden ciągły tekst. Innymi słowy, nie modelujemy tekstu angielskiego ani polskiego,
tylko angielsko-polską mieszankę, to znaczy uczymy model, który najpierw modeluje prawdopodobieństwo
po stronie źródłowej (powiedzmy — angielskiej):
@ -243,7 +182,7 @@ The number of armed attacks also ?
#+END_SRC
W momencie napotkania specjalnego tokenu końca zdania źródłowego (powiedzmy ~<eoss>~) model
powinien nauczyć się, że musi przerzucić się na modelowanie tekstu w języku docelowym (powiedzmy — polskim):
powinien nauczyć się, że musi przełączyć się na modelowanie tekstu w języku docelowym (powiedzmy — polskim):
#+BEGIN_SRC
The number of armed attacks also rose by 200% overall.<eoss>Także liczba ataków ?
@ -258,10 +197,10 @@ tłumaczone zdanie jako prefiks, doklejając tylko token ~<eoss>~.
**** Neuronowe modele języka jako translatory
Jako że N-gramowego modelu języka ani modelu opartego na worku słów
Jako że n-gramowego modelu języka ani modelu opartego na worku słów
nie da się użyć w omawiany sposób w tłumaczeniu maszynowym
(dlaczego?), jako pierwszych użyto w neuronowym tłumaczeniu maszynowym
sieci LSTM, przy użyciu omawianego wyżej sposobu.
sieci LSTM, przy zastosowaniu omawianego wyżej sposobu.
System tłumaczenia oparte na sieciach LSTM działały zaskakująco
dobrze, zważywszy na to, że cała informacja o zdaniu źródłowym musi

64
wyk/11_Transformer.org Normal file
View File

@ -0,0 +1,64 @@
* 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).