This commit is contained in:
Filip Gralinski 2022-07-05 11:41:54 +02:00
parent aa9bb2887c
commit a0f4351db0
2 changed files with 45 additions and 30 deletions

View File

@ -1,5 +1,20 @@
{ {
"cells": [ "cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Modelowanie języka</h1>\n",
"<h2> 15. <i>Pozycyjne zanurzenia</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2022)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)\n",
"\n"
]
},
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
@ -28,7 +43,7 @@
"\n", "\n",
"Oznacza to, że pozycje wyrazów (tokenów) muszą być w jakiś sposób,\n", "Oznacza to, że pozycje wyrazów (tokenów) muszą być w jakiś sposób,\n",
"celowo „wstrzyknięte” do sieci Transformer. Standardowa procedura\n", "celowo „wstrzyknięte” do sieci Transformer. Standardowa procedura\n",
"polega na uzupełnieniu zanurzeń do element pozycyjny. Taki element\n", "polega na uzupełnieniu zanurzeń o element pozycyjny. Taki element\n",
"sieci neuronowej nazywamy **zanurzeniami (embeddingami) pozycyjnymi**\n", "sieci neuronowej nazywamy **zanurzeniami (embeddingami) pozycyjnymi**\n",
"(*position(al) embeddings, encodings*).\n", "(*position(al) embeddings, encodings*).\n",
"\n" "\n"
@ -71,17 +86,17 @@
"source": [ "source": [
"Najprostszy sposób uwzględnienia pozycji tokena polega na\n", "Najprostszy sposób uwzględnienia pozycji tokena polega na\n",
"zdefiniowaniu pewnej funkcji $E_p(i) \\colon \\mathcal{N} \\rightarrow\n", "zdefiniowaniu pewnej funkcji $E_p(i) \\colon \\mathcal{N} \\rightarrow\n",
"\\mathcal{R}^m$, to jest zanurzenia zależnego tylko od pozycji tokenu\n", "\\mathcal{R}^m$, to jest zanurzenia zależnego tylko od pozycji tokena\n",
"$i$.\n", "$i$.\n",
"\n", "\n",
"Następnie takie zanurzenie $E^p$ jest po prostu dodawane do standardowego\n", "Następnie takie zanurzenie $E^p$ jest po prostu dodawane do standardowego\n",
"embeddingu „semantycznego” $E^s$, by ostatecznie otrzymać embeddingu\n", "embeddingu „semantycznego” $E^s$, by ostatecznie otrzymać embeddingu\n",
"tokenu na konkretnej pozycji:\n", "tokena na konkretnej pozycji:\n",
"\n", "\n",
"$$E(w_i) = E^p(i) + E^s(w_i).$$\n", "$$E(w_i) = E^p(i) + E^s(w_i).$$\n",
"\n", "\n",
"Rzecz jasna rozmiar embeddingu pozycyjnego musi być identyczny jak\n", "Rzecz jasna rozmiar embeddingu pozycyjnego musi być identyczny z\n",
"rozmiar zwykłego embeddingu ($m$).\n", "rozmiarem zwykłego embeddingu ($m$).\n",
"\n" "\n"
] ]
}, },
@ -103,16 +118,16 @@
"Przypomina to zwykły embedding wyuczalny dla poszczególnych słów:\n", "Przypomina to zwykły embedding wyuczalny dla poszczególnych słów:\n",
"podobnie jak słowa *a*, *aby*, *abrakadabra*,…,/żyzny/ mają swoje\n", "podobnie jak słowa *a*, *aby*, *abrakadabra*,…,/żyzny/ mają swoje\n",
"embeddingi, tak i pozycje będą miały swoje embeddingi (pozycja 1 ma\n", "embeddingi, tak i pozycje będą miały swoje embeddingi (pozycja 1 ma\n",
"swój embedding, pozycja 2 — inny, itd., oczywiście nie należy tego\n", "swój embedding, pozycja 2 — inny itd., oczywiście nie należy tego\n",
"mylić z embeddingami tokenów złożonych z cyfr *1*, *2*, itd.).\n", "mylić z embeddingami tokenów złożonych z cyfr *1*, *2* itd.).\n",
"\n", "\n",
"Zaletą tego podejścia jest prostota, wady to:\n", "Zaletą tego podejścia jest prostota, wady to:\n",
"\n", "\n",
"- nie generalizuje się na sekwencje dowolnej długości\n", "- nie generalizuje się na sekwencje dowolnej długości\n",
" - jeśli zdarzy się zdanie dłuższe niż $p_{\\operatorname{max}}\\}$,\n", " - jeśli zdarzy się zdanie dłuższe niż $p_{\\operatorname{max}}$,\n",
" embeddingu po prostu… nie ma\n", " embeddingu po prostu… nie ma\n",
" - … wprawdzie można po prostu zdefiniować cyklicznie embeddingi\n", " - … wprawdzie można po prostu zdefiniować cyklicznie embeddingi\n",
" $E<sup>p</sup><sub>p{\\operatorname{max}}+i</sub> = E<sup>p</sup>(i)\n", " $E^p_{p{\\operatorname{max}}+i} = E^p(i)$\n",
" - … ma to jednak swoje wady (na pozycji $p{\\operatorname{max}}+1$ sztucznie\n", " - … ma to jednak swoje wady (na pozycji $p{\\operatorname{max}}+1$ sztucznie\n",
" „wracamy” na początek tekstu,\n", " „wracamy” na początek tekstu,\n",
"- sieć musi uczyć się osobno dla sąsiadujących pozycji, na przykład\n", "- sieć musi uczyć się osobno dla sąsiadujących pozycji, na przykład\n",
@ -249,7 +264,7 @@
"source": [ "source": [
"Podstawowa operacja dotycząca czasu to przesunięcie momentu czasu o\n", "Podstawowa operacja dotycząca czasu to przesunięcie momentu czasu o\n",
"pewien okres (wprzód lub w tył), właściwie przypomina to zwykłe dodawanie czy odejmowanie,\n", "pewien okres (wprzód lub w tył), właściwie przypomina to zwykłe dodawanie czy odejmowanie,\n",
"pojawia się jednak pewne trudność.\n", "pojawia się jednak pewna trudność.\n",
"Proste dodawanie wektorów nie zawsze da dobry wyniku, np.\n", "Proste dodawanie wektorów nie zawsze da dobry wyniku, np.\n",
"jeśli dodamy do naszego znacznika 20 godzin:\n", "jeśli dodamy do naszego znacznika 20 godzin:\n",
"\n" "\n"
@ -417,11 +432,11 @@
"długości od 1 do 10000 (10000 to arbitralnie wybrana liczba), tj.\n", "długości od 1 do 10000 (10000 to arbitralnie wybrana liczba), tj.\n",
"$k$-ty cykl będzie miał długość $10000^{2k/m}$, wtedy dla parzystej pozycji wektora zanurzeń:\n", "$k$-ty cykl będzie miał długość $10000^{2k/m}$, wtedy dla parzystej pozycji wektora zanurzeń:\n",
"\n", "\n",
"$$E_p(i)_2k = \\sin(\\frac{i}{10000^{2k/m}),$$\n", "$$E_{p(i)_2k} = \\sin(\\frac{i}{10000^{2k/m}}),$$\n",
"\n", "\n",
"dla nieparzystej zaś:\n", "dla nieparzystej zaś:\n",
"\n", "\n",
"$$E_p(i)_{2k+1} = \\sin(\\frac{i}{10000^{2k/m}),$$\n", "$$E_{p(i)_{2k+1}} = \\sin(\\frac{i}{10000^{2k/m}}),$$\n",
"\n" "\n"
] ]
}, },
@ -444,7 +459,7 @@
"się serii skalarnych obciążeń $b_{\\Delta}$, gdzie $&Delta; &isin;\n", "się serii skalarnych obciążeń $b_{\\Delta}$, gdzie $&Delta; &isin;\n",
"\\\\{-&Delta;<sub>\\operatorname{max}</sub>,&hellip;,-1,0,1,&hellip;,&Delta;<sub>\\operatorname{max}</sub>\\\\}.\n", "\\\\{-&Delta;<sub>\\operatorname{max}</sub>,&hellip;,-1,0,1,&hellip;,&Delta;<sub>\\operatorname{max}</sub>\\\\}.\n",
"\n", "\n",
"Obciążenie te po prostu są dodawane do atencji:\n", "Obciążenia te po prostu są dodawane do atencji:\n",
"\n", "\n",
"$$\\hat{\\alpha}_{i,j} = \\vec{q_i}^T\\vec{k_j} + b_{j-i}.$$\n", "$$\\hat{\\alpha}_{i,j} = \\vec{q_i}^T\\vec{k_j} + b_{j-i}.$$\n",
"\n", "\n",

View File

@ -10,7 +10,7 @@ permutacja tekstu dawałaby identyczny wynik.
Oznacza to, że pozycje wyrazów (tokenów) muszą być w jakiś sposób, Oznacza to, że pozycje wyrazów (tokenów) muszą być w jakiś sposób,
celowo „wstrzyknięte” do sieci Transformer. Standardowa procedura celowo „wstrzyknięte” do sieci Transformer. Standardowa procedura
polega na uzupełnieniu zanurzeń do element pozycyjny. Taki element polega na uzupełnieniu zanurzeń o element pozycyjny. Taki element
sieci neuronowej nazywamy *zanurzeniami (embeddingami) pozycyjnymi* sieci neuronowej nazywamy *zanurzeniami (embeddingami) pozycyjnymi*
(/position(al) embeddings, encodings/). (/position(al) embeddings, encodings/).
@ -29,17 +29,17 @@ Opracowano kilka różnych typów embeddingów pozycyjnych, najczęściej stosow
Najprostszy sposób uwzględnienia pozycji tokena polega na Najprostszy sposób uwzględnienia pozycji tokena polega na
zdefiniowaniu pewnej funkcji $E_p(i) \colon \mathcal{N} \rightarrow zdefiniowaniu pewnej funkcji $E_p(i) \colon \mathcal{N} \rightarrow
\mathcal{R}^m$, to jest zanurzenia zależnego tylko od pozycji tokenu \mathcal{R}^m$, to jest zanurzenia zależnego tylko od pozycji tokena
$i$. $i$.
Następnie takie zanurzenie $E^p$ jest po prostu dodawane do standardowego Następnie takie zanurzenie $E^p$ jest po prostu dodawane do standardowego
embeddingu „semantycznego” $E^s$, by ostatecznie otrzymać embeddingu embeddingu „semantycznego” $E^s$, by ostatecznie otrzymać embeddingu
tokenu na konkretnej pozycji: tokena na konkretnej pozycji:
$$E(w_i) = E^p(i) + E^s(w_i).$$ $$E(w_i) = E^p(i) + E^s(w_i).$$
Rzecz jasna rozmiar embeddingu pozycyjnego musi być identyczny jak Rzecz jasna rozmiar embeddingu pozycyjnego musi być identyczny z
rozmiar zwykłego embeddingu ($m$). rozmiarem zwykłego embeddingu ($m$).
*** Wyuczalne embeddingi pozycyjne *** Wyuczalne embeddingi pozycyjne
@ -49,16 +49,16 @@ $\{1,\dots,p_{\operatorname{max}}\}$) osobnego wyuczalnego wektora.
Przypomina to zwykły embedding wyuczalny dla poszczególnych słów: Przypomina to zwykły embedding wyuczalny dla poszczególnych słów:
podobnie jak słowa /a/, /aby/, /abrakadabra/,…,/żyzny/ mają swoje podobnie jak słowa /a/, /aby/, /abrakadabra/,…,/żyzny/ mają swoje
embeddingi, tak i pozycje będą miały swoje embeddingi (pozycja 1 ma embeddingi, tak i pozycje będą miały swoje embeddingi (pozycja 1 ma
swój embedding, pozycja 2 — inny, itd., oczywiście nie należy tego swój embedding, pozycja 2 — inny itd., oczywiście nie należy tego
mylić z embeddingami tokenów złożonych z cyfr /1/, /2/, itd.). mylić z embeddingami tokenów złożonych z cyfr /1/, /2/ itd.).
Zaletą tego podejścia jest prostota, wady to: Zaletą tego podejścia jest prostota, wady to:
- nie generalizuje się na sekwencje dowolnej długości - nie generalizuje się na sekwencje dowolnej długości
- jeśli zdarzy się zdanie dłuższe niż $p_{\operatorname{max}}\}$, - jeśli zdarzy się zdanie dłuższe niż $p_{\operatorname{max}}$,
embeddingu po prostu… nie ma embeddingu po prostu… nie ma
- … wprawdzie można po prostu zdefiniować cyklicznie embeddingi - … wprawdzie można po prostu zdefiniować cyklicznie embeddingi
$E^p_{p{\operatorname{max}}+i} = E^p(i) $E^p_{p{\operatorname{max}}+i} = E^p(i)$
- … ma to jednak swoje wady (na pozycji $p{\operatorname{max}}+1$ sztucznie - … ma to jednak swoje wady (na pozycji $p{\operatorname{max}}+1$ sztucznie
„wracamy” na początek tekstu, „wracamy” na początek tekstu,
- sieć musi uczyć się osobno dla sąsiadujących pozycji, na przykład - sieć musi uczyć się osobno dla sąsiadujących pozycji, na przykład
@ -111,7 +111,7 @@ tylko 2022,5.
A zatem właściwa reprezentacja wektorowa przykładowego momentu w czasie powinna mieć raczej postać: A zatem właściwa reprezentacja wektorowa przykładowego momentu w czasie powinna mieć raczej postać:
#+BEGIN_SRC python :session mysession :exports both :results raw drawer #+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
def to_analog(tv): def to_analog(tv):
cycles = [100,12,30,24,60,60,100] cycles = [100,12,30,24,60,60,100]
analog_tv = [] analog_tv = []
@ -139,11 +139,11 @@ A zatem właściwa reprezentacja wektorowa przykładowego momentu w czasie powin
Podstawowa operacja dotycząca czasu to przesunięcie momentu czasu o Podstawowa operacja dotycząca czasu to przesunięcie momentu czasu o
pewien okres (wprzód lub w tył), właściwie przypomina to zwykłe dodawanie czy odejmowanie, pewien okres (wprzód lub w tył), właściwie przypomina to zwykłe dodawanie czy odejmowanie,
pojawia się jednak pewne trudność. pojawia się jednak pewna trudność.
Proste dodawanie wektorów nie zawsze da dobry wyniku, np. Proste dodawanie wektorów nie zawsze da dobry wyniku, np.
jeśli dodamy do naszego znacznika 20 godzin: jeśli dodamy do naszego znacznika 20 godzin:
#+BEGIN_SRC python :session mysession :exports both :results raw drawer #+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
delta_v = to_analog([0,0,0,20,0,0,0]) delta_v = to_analog([0,0,0,20,0,0,0])
delta_v delta_v
#+END_SRC #+END_SRC
@ -153,7 +153,7 @@ jeśli dodamy do naszego znacznika 20 godzin:
[2.3148148148148147e-05, 0.0023148148148148147, 0.02777777777777778, 0.8333333333333334, 0.0, 0.0, 0.0] [2.3148148148148147e-05, 0.0023148148148148147, 0.02777777777777778, 0.8333333333333334, 0.0, 0.0, 0.0]
:end: :end:
#+BEGIN_SRC python :session mysession :exports both :results raw drawer #+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
def vsum(a, b): def vsum(a, b):
return [ai+bi for ai, bi in zip(a, b)] return [ai+bi for ai, bi in zip(a, b)]
@ -189,7 +189,7 @@ gdzie $phi$ jest kątem wskazówki.
W ten sposób otrzymamy dwa razy dłuższy wektor: W ten sposób otrzymamy dwa razy dłuższy wektor:
#+BEGIN_SRC python :session mysession :exports both :results raw drawer #+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
import math import math
def to_hand_coord(atv): def to_hand_coord(atv):
@ -241,11 +241,11 @@ Można na przykład wprowadzić narastające geometrycznie cykle o
długości od 1 do 10000 (10000 to arbitralnie wybrana liczba), tj. długości od 1 do 10000 (10000 to arbitralnie wybrana liczba), tj.
$k$-ty cykl będzie miał długość $10000^{2k/m}$, wtedy dla parzystej pozycji wektora zanurzeń: $k$-ty cykl będzie miał długość $10000^{2k/m}$, wtedy dla parzystej pozycji wektora zanurzeń:
$$E_p(i)_2k = \sin(\frac{i}{10000^{2k/m}),$$ $$E_{p(i)_2k} = \sin(\frac{i}{10000^{2k/m}}),$$
dla nieparzystej zaś: dla nieparzystej zaś:
$$E_p(i)_{2k+1} = \sin(\frac{i}{10000^{2k/m}),$$ $$E_{p(i)_{2k+1}} = \sin(\frac{i}{10000^{2k/m}}),$$
*** Zanurzenia względne *** Zanurzenia względne
@ -256,7 +256,7 @@ atencji jako pozycyjne obciążenie (/positional bias/), tj. np. w modelu T5 mod
się serii skalarnych obciążeń $b_{\Delta}$, gdzie $\Delta \in się serii skalarnych obciążeń $b_{\Delta}$, gdzie $\Delta \in
\{-\Delta_{\operatorname{max}},\dots,-1,0,1,\dots,\Delta_{\operatorname{max}}\}. \{-\Delta_{\operatorname{max}},\dots,-1,0,1,\dots,\Delta_{\operatorname{max}}\}.
Obciążenie te po prostu są dodawane do atencji: Obciążenia te po prostu są dodawane do atencji:
$$\hat{\alpha}_{i,j} = \vec{q_i}^T\vec{k_j} + b_{j-i}.$$ $$\hat{\alpha}_{i,j} = \vec{q_i}^T\vec{k_j} + b_{j-i}.$$