diff --git a/wyk/10_Atencja.org b/wyk/10_Atencja.org index b56ee17..795cb1d 100644 --- a/wyk/10_Atencja.org +++ b/wyk/10_Atencja.org @@ -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 ~~) 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.Także liczba ataków ? @@ -258,10 +197,10 @@ tłumaczone zdanie jako prefiks, doklejając tylko token ~~. **** 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 diff --git a/wyk/11_Transformer.org b/wyk/11_Transformer.org new file mode 100644 index 0000000..efaf0e4 --- /dev/null +++ b/wyk/11_Transformer.org @@ -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).