Up
This commit is contained in:
parent
aa9bb2887c
commit
a0f4351db0
@ -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 $Δ ∈\n",
|
"się serii skalarnych obciążeń $b_{\\Delta}$, gdzie $Δ ∈\n",
|
||||||
"\\\\{-Δ<sub>\\operatorname{max}</sub>,…,-1,0,1,…,Δ<sub>\\operatorname{max}</sub>\\\\}.\n",
|
"\\\\{-Δ<sub>\\operatorname{max}</sub>,…,-1,0,1,…,Δ<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",
|
||||||
|
@ -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}.$$
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user