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",
|
||||
"<div class=\"alert alert-block alert-info\">\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",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
@ -486,7 +486,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.4"
|
||||
"version": "3.10.5"
|
||||
},
|
||||
"org": null
|
||||
},
|
@ -1,5 +1,5 @@
|
||||
|
||||
* Transformer
|
||||
* Modele języka oparte na sieciach Transformer
|
||||
|
||||
** 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
|
||||
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
|
||||
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.
|
||||
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:
|
||||
|
||||
#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer
|
||||
#+BEGIN_SRC python :session mysession :exports both :results raw drawer
|
||||
from transformers import AutoTokenizer
|
||||
tokenizer = AutoTokenizer.from_pretrained("gpt2")
|
||||
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]])}
|
||||
: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]]
|
||||
#+END_SRC
|
||||
|
||||
@ -113,7 +113,7 @@ Zwróćmy uwagę, że w GPT-2 tokeny obejmują spacje!
|
||||
|
||||
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
|
||||
model = AutoModelForCausalLM.from_pretrained("gpt2")
|
||||
outputs = model(**encoded_input)
|
||||
@ -123,7 +123,7 @@ Teraz uruchommy zasadniczy model:
|
||||
:results:
|
||||
: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])
|
||||
#+END_SRC
|
||||
|
||||
@ -135,7 +135,7 @@ Teraz uruchommy zasadniczy model:
|
||||
Z modelu GPT-2 otrzymamy rozkład prawdopodobieństwa kolejnego wyrazu, najpierw w postaci
|
||||
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
|
||||
#+END_SRC
|
||||
@ -146,7 +146,7 @@ tensor([-130.2947, -129.5677, -136.4030, ..., -138.3791, -138.8967,
|
||||
-131.6319], grad_fn=<SelectBackward0>)
|
||||
: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
|
||||
|
||||
k = 20
|
||||
@ -164,7 +164,7 @@ tensor([-130.2947, -129.5677, -136.4030, ..., -138.3791, -138.8967,
|
||||
|
||||
*** 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
|
||||
generator = pipeline('text-generation', model='gpt2')
|
||||
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
|
||||
miałoby zawsze taką samą wagę! — token $w_j$, który atenduje jest
|
||||
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
|
||||
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
|
||||
zanurzenia skontekstualizowane — zależne od innych tokenów w zdaniu. W
|
||||
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 (!).
|
||||
|
||||
*** 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).
|
||||
|
||||
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ą:
|
||||
|
||||
$$E_1(w_i) = \operatorname{softmax}(\vec{q_i}^T K)^T V,$$
|
||||
|
||||
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
|
||||
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$.
|
||||
|
||||
**** 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",
|
||||
"<div class=\"alert alert-block alert-info\">\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",
|
||||
"</div>\n",
|
||||
"\n",
|
||||
|
@ -1,4 +1,4 @@
|
||||
* Pozycyjne zanurzenia
|
||||
* Sieci Transformer — pozycyjne zanurzenia
|
||||
|
||||
** Atencja nie uwzględnia kolejności wyrazów
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user