Minor fixes
This commit is contained in:
parent
a0f4351db0
commit
462a7c5fcf
@ -7,7 +7,7 @@
|
|||||||
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
|
"![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",
|
"<div class=\"alert alert-block alert-info\">\n",
|
||||||
"<h1> Modelowanie języka</h1>\n",
|
"<h1> Modelowanie języka</h1>\n",
|
||||||
"<h2> 11. <i>Transformer</i> [wykład]</h2> \n",
|
"<h2> 14. <i>Modele języka oparte na sieciach Transformer</i> [wykład]</h2> \n",
|
||||||
"<h3> Filip Graliński (2022)</h3>\n",
|
"<h3> Filip Graliński (2022)</h3>\n",
|
||||||
"</div>\n",
|
"</div>\n",
|
||||||
"\n",
|
"\n",
|
||||||
@ -486,7 +486,7 @@
|
|||||||
"name": "python",
|
"name": "python",
|
||||||
"nbconvert_exporter": "python",
|
"nbconvert_exporter": "python",
|
||||||
"pygments_lexer": "ipython3",
|
"pygments_lexer": "ipython3",
|
||||||
"version": "3.10.4"
|
"version": "3.10.5"
|
||||||
},
|
},
|
||||||
"org": null
|
"org": null
|
||||||
},
|
},
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
* Transformer
|
* Modele języka oparte na sieciach Transformer
|
||||||
|
|
||||||
** Atencja jako „miękka” baza danych
|
** Atencja jako „miękka” baza danych
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ $$\vec{q_i} = W_q E(w_i).$$
|
|||||||
Jeśli zanurzenie $E(w_i)$ o rozmiarze $m$ przedstawimy w postaci
|
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
|
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
|
$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
|
wektory kluczy i zapytań powinny mieć raczej ten sam rozmiar?), macierz zaś
|
||||||
$W_v$ — $d_v \times m$, gdzie $d_v$ to rozmiar zanurzenia wektora wartości.
|
$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.
|
Zazwyczaj $d_k = d_v = m$, ale nie jest to obligatoryjne.
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ języka jest używany wprost jako generator.
|
|||||||
|
|
||||||
Dokonajmy najpierw tokenizacji:
|
Dokonajmy najpierw tokenizacji:
|
||||||
|
|
||||||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
|
||||||
from transformers import AutoTokenizer
|
from transformers import AutoTokenizer
|
||||||
tokenizer = AutoTokenizer.from_pretrained("gpt2")
|
tokenizer = AutoTokenizer.from_pretrained("gpt2")
|
||||||
text = "The World War III will begin in 2028 in"
|
text = "The World War III will begin in 2028 in"
|
||||||
@ -100,7 +100,7 @@ Dokonajmy najpierw tokenizacji:
|
|||||||
{'input_ids': tensor([[ 464, 2159, 1810, 6711, 481, 2221, 287, 1160, 2078, 287]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
|
{'input_ids': tensor([[ 464, 2159, 1810, 6711, 481, 2221, 287, 1160, 2078, 287]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
|
||||||
:end:
|
:end:
|
||||||
|
|
||||||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
|
||||||
[tokenizer.decode(i) for i in encoded_input.input_ids[0]]
|
[tokenizer.decode(i) for i in encoded_input.input_ids[0]]
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ Zwróćmy uwagę, że w GPT-2 tokeny obejmują spacje!
|
|||||||
|
|
||||||
Teraz uruchommy zasadniczy model:
|
Teraz uruchommy zasadniczy model:
|
||||||
|
|
||||||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
|
||||||
from transformers import AutoModelForCausalLM
|
from transformers import AutoModelForCausalLM
|
||||||
model = AutoModelForCausalLM.from_pretrained("gpt2")
|
model = AutoModelForCausalLM.from_pretrained("gpt2")
|
||||||
outputs = model(**encoded_input)
|
outputs = model(**encoded_input)
|
||||||
@ -123,7 +123,7 @@ Teraz uruchommy zasadniczy model:
|
|||||||
:results:
|
:results:
|
||||||
:end:
|
:end:
|
||||||
|
|
||||||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
|
||||||
softmax(outputs[0][0][-1])
|
softmax(outputs[0][0][-1])
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ Teraz uruchommy zasadniczy model:
|
|||||||
Z modelu GPT-2 otrzymamy rozkład prawdopodobieństwa kolejnego wyrazu, najpierw w postaci
|
Z modelu GPT-2 otrzymamy rozkład prawdopodobieństwa kolejnego wyrazu, najpierw w postaci
|
||||||
nieznormalizowanych *logitów*:
|
nieznormalizowanych *logitów*:
|
||||||
|
|
||||||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
|
||||||
logits = outputs[0][0][-1]
|
logits = outputs[0][0][-1]
|
||||||
logits
|
logits
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
@ -146,7 +146,7 @@ tensor([-130.2947, -129.5677, -136.4030, ..., -138.3791, -138.8967,
|
|||||||
-131.6319], grad_fn=<SelectBackward0>)
|
-131.6319], grad_fn=<SelectBackward0>)
|
||||||
:end:
|
:end:
|
||||||
|
|
||||||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
|
||||||
from torch import softmax, topk
|
from torch import softmax, topk
|
||||||
|
|
||||||
k = 20
|
k = 20
|
||||||
@ -164,7 +164,7 @@ tensor([-130.2947, -129.5677, -136.4030, ..., -138.3791, -138.8967,
|
|||||||
|
|
||||||
*** Generowanie tekstu za pomocą GPT-2
|
*** Generowanie tekstu za pomocą GPT-2
|
||||||
|
|
||||||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
|
||||||
from transformers import pipeline
|
from transformers import pipeline
|
||||||
generator = pipeline('text-generation', model='gpt2')
|
generator = pipeline('text-generation', model='gpt2')
|
||||||
generator('Hello, I\'m a language model,', max_length=30, num_return_sequences=1)
|
generator('Hello, I\'m a language model,', max_length=30, num_return_sequences=1)
|
||||||
@ -196,7 +196,7 @@ Samo to byłoby oczywiście zbyt proste:
|
|||||||
1. Otrzymalibyśmy model (ważonego) worka słów, w dodatku każde słowo
|
1. Otrzymalibyśmy model (ważonego) worka słów, w dodatku każde słowo
|
||||||
miałoby zawsze taką samą wagę! — token $w_j$, który atenduje jest
|
miałoby zawsze taką samą wagę! — token $w_j$, który atenduje jest
|
||||||
zawsze ten sam (~<mask>~). Musimy wzbogacić reprezentację wektorową
|
zawsze ten sam (~<mask>~). Musimy wzbogacić reprezentację wektorową
|
||||||
słów i specjalnego tokenu (~<mask>~).
|
słów i specjalnego tokena (~<mask>~).
|
||||||
|
|
||||||
2. Model Transformer w swojej podstawowej postaci w ogóle nie jest
|
2. Model Transformer w swojej podstawowej postaci w ogóle nie jest
|
||||||
wyposażony w pojęcie sekwencji — w przeciwieństwie do sieci
|
wyposażony w pojęcie sekwencji — w przeciwieństwie do sieci
|
||||||
@ -222,7 +222,7 @@ które znaczenie chodzi.
|
|||||||
Rozwiązanie polega na tym, że wszystkim tokenom będziemy przypisywać kolejne
|
Rozwiązanie polega na tym, że wszystkim tokenom będziemy przypisywać kolejne
|
||||||
zanurzenia skontekstualizowane — zależne od innych tokenów w zdaniu. W
|
zanurzenia skontekstualizowane — zależne od innych tokenów w zdaniu. W
|
||||||
tym celu zastosujemy atencję wsobną (samo-atencję, /self-attention/).
|
tym celu zastosujemy atencję wsobną (samo-atencję, /self-attention/).
|
||||||
Każdy token będzie atendował potencjalnie do każdego innego tokenu,
|
Każdy token będzie atendował potencjalnie do każdego innego tokena,
|
||||||
również do samego siebie (!).
|
również do samego siebie (!).
|
||||||
|
|
||||||
*** Wzory
|
*** Wzory
|
||||||
@ -241,16 +241,16 @@ $$\vec{\alpha}_{*,i} = \operatorname{softmax}(\vec{q_i}^T K)$$
|
|||||||
|
|
||||||
i $K$ jest macierzą kluczy o rozmiarze $d_k \times j$ (tym razem obejmuje również sam $i$-ty token).
|
i $K$ jest macierzą kluczy o rozmiarze $d_k \times j$ (tym razem obejmuje również sam $i$-ty token).
|
||||||
|
|
||||||
Nowa, skontekstualizowana reprezentacja $i$-tego tokenu będzie po prostu średnią wszystkich
|
Nowa, skontekstualizowana reprezentacja $i$-tego tokena będzie po prostu średnią wszystkich
|
||||||
wektorów ważoną atencją:
|
wektorów ważoną atencją:
|
||||||
|
|
||||||
$$E_1(w_i) = \operatorname{softmax}(\vec{q_i}^T K)^T V,$$
|
$$E_1(w_i) = \operatorname{softmax}(\vec{q_i}^T K)^T V,$$
|
||||||
|
|
||||||
gdzie:
|
gdzie:
|
||||||
|
|
||||||
- $E_1(w_i)$ — skontekstualizowane zanurzenie $i$-tego tokenu; używając indeksu $_1$
|
- $E_1(w_i)$ — skontekstualizowane zanurzenie $i$-tego tokena; używając indeksu $_1$
|
||||||
zaznaczamy, że to jest pierwszy skonstekstualizowany embedding, rekurencyjnie będziemy budowali
|
zaznaczamy, że to jest pierwszy skonstekstualizowany embedding, rekurencyjnie będziemy budowali
|
||||||
kolejne $E_2(w_i)$, $E_3(w_i)$ itd. (zaś wejściowy statyczny embedding możemy oznaczyć przez $E_0(w_i)$);
|
kolejne $E_2(w_i)$, $E_3(w_i)$ itd. (wejściowy statyczny embedding zaś możemy oznaczyć przez $E_0(w_i)$);
|
||||||
- $V$ — macierz wartości o rozmiarze $j \times d_v$.
|
- $V$ — macierz wartości o rozmiarze $j \times d_v$.
|
||||||
|
|
||||||
**** Zwarta postać macierzowa atencji wsobnej
|
**** Zwarta postać macierzowa atencji wsobnej
|
@ -7,7 +7,7 @@
|
|||||||
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
|
"![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",
|
"<div class=\"alert alert-block alert-info\">\n",
|
||||||
"<h1> Modelowanie języka</h1>\n",
|
"<h1> Modelowanie języka</h1>\n",
|
||||||
"<h2> 15. <i>Pozycyjne zanurzenia</i> [wykład]</h2> \n",
|
"<h2> 15. <i>Sieci Transformer — pozycyjne zanurzenia</i> [wykład]</h2> \n",
|
||||||
"<h3> Filip Graliński (2022)</h3>\n",
|
"<h3> Filip Graliński (2022)</h3>\n",
|
||||||
"</div>\n",
|
"</div>\n",
|
||||||
"\n",
|
"\n",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
* Pozycyjne zanurzenia
|
* Sieci Transformer — pozycyjne zanurzenia
|
||||||
|
|
||||||
** Atencja nie uwzględnia kolejności wyrazów
|
** Atencja nie uwzględnia kolejności wyrazów
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user