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": [
{
"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",
"metadata": {},
@ -28,7 +43,7 @@
"\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",
"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",
"(*position(al) embeddings, encodings*).\n",
"\n"
@ -71,17 +86,17 @@
"source": [
"Najprostszy sposób uwzględnienia pozycji tokena polega na\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",
"\n",
"Następnie takie zanurzenie $E^p$ jest po prostu dodawane do standardowego\n",
"embeddingu „semantycznego” $E^s$, by ostatecznie otrzymać embeddingu\n",
"tokenu na konkretnej pozycji:\n",
"tokena na konkretnej pozycji:\n",
"\n",
"$$E(w_i) = E^p(i) + E^s(w_i).$$\n",
"\n",
"Rzecz jasna rozmiar embeddingu pozycyjnego musi być identyczny jak\n",
"rozmiar zwykłego embeddingu ($m$).\n",
"Rzecz jasna rozmiar embeddingu pozycyjnego musi być identyczny z\n",
"rozmiarem zwykłego embeddingu ($m$).\n",
"\n"
]
},
@ -103,16 +118,16 @@
"Przypomina to zwykły embedding wyuczalny dla poszczególnych słów:\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",
"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",
"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",
"\n",
"Zaletą tego podejścia jest prostota, wady to:\n",
"\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",
" - … 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",
" „wracamy” na początek tekstu,\n",
"- sieć musi uczyć się osobno dla sąsiadujących pozycji, na przykład\n",
@ -249,7 +264,7 @@
"source": [
"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",
"pojawia się jednak pewne trudność.\n",
"pojawia się jednak pewna trudność.\n",
"Proste dodawanie wektorów nie zawsze da dobry wyniku, np.\n",
"jeśli dodamy do naszego znacznika 20 godzin:\n",
"\n"
@ -417,11 +432,11 @@
"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",
"\n",
"$$E_p(i)_2k = \\sin(\\frac{i}{10000^{2k/m}),$$\n",
"$$E_{p(i)_2k} = \\sin(\\frac{i}{10000^{2k/m}}),$$\n",
"\n",
"dla nieparzystej zaś:\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"
]
},
@ -444,7 +459,7 @@
"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",
"\n",
"Obciążenie te po prostu są dodawane do atencji:\n",
"Obciążenia te po prostu są dodawane do atencji:\n",
"\n",
"$$\\hat{\\alpha}_{i,j} = \\vec{q_i}^T\\vec{k_j} + b_{j-i}.$$\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,
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*
(/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
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$.
Następnie takie zanurzenie $E^p$ jest po prostu dodawane do standardowego
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).$$
Rzecz jasna rozmiar embeddingu pozycyjnego musi być identyczny jak
rozmiar zwykłego embeddingu ($m$).
Rzecz jasna rozmiar embeddingu pozycyjnego musi być identyczny z
rozmiarem zwykłego embeddingu ($m$).
*** 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:
podobnie jak słowa /a/, /aby/, /abrakadabra/,…,/żyzny/ mają swoje
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
mylić z embeddingami tokenów złożonych z cyfr /1/, /2/, itd.).
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.).
Zaletą tego podejścia jest prostota, wady to:
- 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
- … 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
„wracamy” na początek tekstu,
- 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ć:
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
def to_analog(tv):
cycles = [100,12,30,24,60,60,100]
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
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.
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
#+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]
: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):
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:
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
import math
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.
$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ś:
$$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
@ -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
\{-\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}.$$