diff --git a/wyk/10_Atencja.ipynb b/wyk/10_Atencja.ipynb new file mode 100644 index 0000000..0f8a603 --- /dev/null +++ b/wyk/10_Atencja.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","metadata":{},"source":["## Atencja\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Sieci LSTM w roku 2017/2018 zostały wyparte przez nową, pod pewnymi\nwzględami prostszą, architekturę Transformer. Sieci Transformer oparte\nsą zasadniczo na prostej idei **atencji** (*attention*), pierwszy\nartykuł wprowadzający sieci Transformer nosił nawet tytuł\n[Attention Is All You Need]([https://arxiv.org/abs/1706.03762](https://arxiv.org/abs/1706.03762)).\n\nIntuicyjnie, atencja jest rodzajem uwagi, którą sieć może selektywnie\nkierować na wybrane miejsca (w modelowaniu języka: wybrane wyrazy).\n\nIdea atencji jest jednak wcześniejsza, powstała jako ulepszenie sieci\nrekurencyjnych. My omówimy ją jednak na jeszcze prostszym przykładzie\nużycia w modelowaniu języka za pomocą hybrydy modelu\nbigramowego i modelu worka słów.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Prosty przykład zastosowania atencji\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Wróćmy do naszego przykładu z Wykładu 8, w którym łączyliśmy $n$-gramowy\nmodel języka z workiem słów. Przyjmijmy bigramowy model języka ($n=2$), wówczas:\n\n$$y = \\operatorname{softmax}(C[E(w_{i-1}),A(w_1,\\dots,w_{i-2})]),$$\n\ngdzie $A$ była prostą agregacją (np. sumą albo średnią) embeddingów\n$E(w_1),\\dots,E(w_{i-2})$. Aby wyjść z prostego nieuporządkowanego\nmodelu worka słów, próbowaliśmy w prosty sposób uwzględnić pozycję\nwyrazów czy ich istotność (za pomocą odwrotnej częstości\ndokumentowej). Oba te sposoby niestety zupełnie nie uwzględniają kontekstu.\n\nInnymi słowy, chcielibyśmy mieć sumę ważoną zanurzeń:\n\n$$A(w_1,\\dots,j) = \\omega_1 E(w_1) + \\dots \\omega_j E(w_j) = \\sum_{k=1}^j \\omega_k E(w_k),$$\n\ntak by $\\omega_k$ w sposób bardziej zasadniczy zależały od lokalnego kontekstu, a\nnie tylko od pozycji $k$ czy słowa $w_k$. W naszym prostym przypadku\njako kontekst możemy rozpatrywać słowo bezpośrednio poprzedzające\nodgadywane słowa (kontekstem jest $w_{i-1}$).\n\nWygodnie również przyjąć, że $\\sum_{k=1}^j \\omega_k = 1$, wówczas mamy do czynienia ze średnią ważoną.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Nieznormalizowane wagi atencji\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Będziemy liczyć nieznormalizowane ****wagi atencji****\n$\\hat{\\alpha}_{k,j}$. Określają one, jak bardzo słowo $w_j$ „zwraca\nuwagę” na poszczególne, inne słowa. Innymi słowy, wagi je opisują, jak\nbardzo słowo $w_k$ pasuje do naszego kontekstu, czyli słowa $w_j$.\n\nNajprostszy sposób mierzenia dopasowania to po prostu iloczyn skalarn:\n\n$$\\hat{\\alpha}_{k,j} = E(w_k)E(w_j),$$\n\nmożna też alternatywnie złamać symetrię iloczynu skalarnego i\nwyliczać dopasowanie za pomocą prostej sieci feed-forward:\n\n$$\\hat{\\alpha}_{k,j} =\n\\vec{v}\\operatorname{tanh}(W_{\\alpha}[E(w_k),E(w_j)] +\n\\vec{b_{\\alpha}}).$$\n\nW drugim przypadku pojawiają się dodatkowe wyuczalne paramatery: macierz $W_{\\alpha}$, wektory\n$\\vec{b_{\\alpha}}$ i $\\vec{v}$.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Normalizacja wag atencji\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Jak już wspomniano, dobrze żeby wagi atencji sumowały się do 1. W tym celu możemy po prostu zastosować\nfunkcję softmax:\n\n$$\\alpha_{k,j} = \\operatorname{softmax}([\\hat{\\alpha}_{1,j},\\dots,\\hat{\\alpha}_{j-1,j}]).$$\n\nZauważmy jednak, że otrzymanego z funkcji softmax wektora\n$[\\alpha_{1,j},\\dots,\\alpha_{j-1,j}]$ tym razem nie interpretujemy jako rozkład prawdopodobieństwa.\nJest to raczej rozkład uwagi, atencji słowa $w_j$ względem innych słów.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Użycie wag atencji w prostym neuronowym modelu języka\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Teraz jako wagi $\\omega$ w naszym modelu języka możemy przyjąć:\n\n$$\\omega_k = \\alpha_{k,i-1}.$$\n\nOznacza to, że z naszego worka będziemy „wyjmowali” słowa w sposób\nselektywny w zależności od wyrazu, który bezpośrednio poprzedza\nsłowo odgadywane.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Diagram\n\n"]},{"cell_type":"markdown","metadata":{},"source":["![img](./10_Atencja/simple-attention.drawio.png \"Atencja użyta w prostym neuronowym modelu języka\")\n\n"]}],"metadata":{"org":null,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":0} \ No newline at end of file diff --git a/wyk/10_Atencja.org b/wyk/10_Atencja.org new file mode 100644 index 0000000..dde1008 --- /dev/null +++ b/wyk/10_Atencja.org @@ -0,0 +1,87 @@ + +* Atencja + +Sieci LSTM w roku 2017/2018 zostały wyparte przez nową, pod pewnymi +względami prostszą, architekturę Transformer. Sieci Transformer oparte +są zasadniczo na prostej idei *atencji* (/attention/), pierwszy +artykuł wprowadzający sieci Transformer nosił nawet tytuł +[Attention Is All You Need](https://arxiv.org/abs/1706.03762). + +Intuicyjnie, atencja jest rodzajem uwagi, którą sieć może selektywnie +kierować na wybrane miejsca (w modelowaniu języka: wybrane wyrazy). + +Idea atencji jest jednak wcześniejsza, powstała jako ulepszenie sieci +rekurencyjnych. My omówimy ją jednak na jeszcze prostszym przykładzie +użycia w modelowaniu języka za pomocą hybrydy modelu +bigramowego i modelu worka słów. + +** Prosty przykład zastosowania atencji + +Wróćmy do naszego przykładu z Wykładu 8, w którym łączyliśmy $n$-gramowy +model języka z workiem słów. Przyjmijmy bigramowy model języka ($n=2$), wówczas: + +$$y = \operatorname{softmax}(C[E(w_{i-1}),A(w_1,\dots,w_{i-2})]),$$ + +gdzie $A$ była prostą agregacją (np. sumą albo średnią) embeddingów +$E(w_1),\dots,E(w_{i-2})$. Aby wyjść z prostego nieuporządkowanego +modelu worka słów, próbowaliśmy w prosty sposób uwzględnić pozycję +wyrazów czy ich istotność (za pomocą odwrotnej częstości +dokumentowej). Oba te sposoby niestety zupełnie nie uwzględniają kontekstu. + +Innymi słowy, chcielibyśmy mieć sumę ważoną zanurzeń: + +$$A(w_1,\dots,j) = \omega_1 E(w_1) + \dots \omega_j E(w_j) = \sum_{k=1}^j \omega_k E(w_k),$$ + +tak by $\omega_k$ w sposób bardziej zasadniczy zależały od lokalnego kontekstu, a +nie tylko od pozycji $k$ czy słowa $w_k$. W naszym prostym przypadku +jako kontekst możemy rozpatrywać słowo bezpośrednio poprzedzające +odgadywane słowa (kontekstem jest $w_{i-1}$). + +Wygodnie również przyjąć, że $\sum_{k=1}^j \omega_k = 1$, wówczas mamy do czynienia ze średnią ważoną. + +*** Nieznormalizowane wagi atencji + +Będziemy liczyć nieznormalizowane **wagi atencji** +$\hat{\alpha}_{k,j}$. Określają one, jak bardzo słowo $w_j$ „zwraca +uwagę” na poszczególne, inne słowa. Innymi słowy, wagi je opisują, jak +bardzo słowo $w_k$ pasuje do naszego kontekstu, czyli słowa $w_j$. + +Najprostszy sposób mierzenia dopasowania to po prostu iloczyn skalarn: + +$$\hat{\alpha}_{k,j} = E(w_k)E(w_j),$$ + +można też alternatywnie złamać symetrię iloczynu skalarnego i +wyliczać dopasowanie za pomocą prostej sieci feed-forward: + +$$\hat{\alpha}_{k,j} = +\vec{v}\operatorname{tanh}(W_{\alpha}[E(w_k),E(w_j)] + +\vec{b_{\alpha}}).$$ + +W drugim przypadku pojawiają się dodatkowe wyuczalne paramatery: macierz $W_{\alpha}$, wektory +$\vec{b_{\alpha}}$ i $\vec{v}$. + +*** Normalizacja wag atencji + +Jak już wspomniano, dobrze żeby wagi atencji sumowały się do 1. W tym celu możemy po prostu zastosować +funkcję softmax: + +$$\alpha_{k,j} = \operatorname{softmax}([\hat{\alpha}_{1,j},\dots,\hat{\alpha}_{j-1,j}]).$$ + +Zauważmy jednak, że otrzymanego z funkcji softmax wektora +$[\alpha_{1,j},\dots,\alpha_{j-1,j}]$ tym razem nie interpretujemy jako rozkład prawdopodobieństwa. +Jest to raczej rozkład uwagi, atencji słowa $w_j$ względem innych słów. + +*** Użycie wag atencji w prostym neuronowym modelu języka + +Teraz jako wagi $\omega$ w naszym modelu języka możemy przyjąć: + +$$\omega_k = \alpha_{k,i-1}.$$ + +Oznacza to, że z naszego worka będziemy „wyjmowali” słowa w sposób +selektywny w zależności od wyrazu, który bezpośrednio poprzedza +słowo odgadywane. + +*** Diagram + +#+CAPTION: Atencja użyta w prostym neuronowym modelu języka +[[./10_Atencja/simple-attention.drawio.png]] diff --git a/wyk/10_Atencja/simple-attention.drawio b/wyk/10_Atencja/simple-attention.drawio new file mode 100644 index 0000000..76a6105 --- /dev/null +++ b/wyk/10_Atencja/simple-attention.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/wyk/10_Atencja/simple-attention.drawio.png b/wyk/10_Atencja/simple-attention.drawio.png new file mode 100644 index 0000000..3506327 Binary files /dev/null and b/wyk/10_Atencja/simple-attention.drawio.png differ