Minor fixes

This commit is contained in:
Filip Gralinski 2022-07-05 22:23:46 +02:00
parent a0f4351db0
commit 462a7c5fcf
4 changed files with 18 additions and 18 deletions

View File

@ -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
}, },

View File

@ -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

View File

@ -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",

View File

@ -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