diff --git a/wyk/11_Transformer.ipynb b/wyk/14_Transformer.ipynb similarity index 99% rename from wyk/11_Transformer.ipynb rename to wyk/14_Transformer.ipynb index b5e0f8a..d586939 100644 --- a/wyk/11_Transformer.ipynb +++ b/wyk/14_Transformer.ipynb @@ -7,7 +7,7 @@ "![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n", "
\n", "

Modelowanie języka

\n", - "

11. Transformer [wykład]

\n", + "

14. Modele języka oparte na sieciach Transformer [wykład]

\n", "

Filip Graliński (2022)

\n", "
\n", "\n", @@ -486,7 +486,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.10.5" }, "org": null }, diff --git a/wyk/11_Transformer.org b/wyk/14_Transformer.org similarity index 92% rename from wyk/11_Transformer.org rename to wyk/14_Transformer.org index bd9be02..76e2691 100644 --- a/wyk/11_Transformer.org +++ b/wyk/14_Transformer.org @@ -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=) :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 (~~). Musimy wzbogacić reprezentację wektorową - słów i specjalnego tokenu (~~). + słów i specjalnego tokena (~~). 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 diff --git a/wyk/15_Pozycyjne_zanurzenia.ipynb b/wyk/15_Pozycyjne_zanurzenia.ipynb index d2acf48..d56fbd7 100644 --- a/wyk/15_Pozycyjne_zanurzenia.ipynb +++ b/wyk/15_Pozycyjne_zanurzenia.ipynb @@ -7,7 +7,7 @@ "![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n", "
\n", "

Modelowanie języka

\n", - "

15. Pozycyjne zanurzenia [wykład]

\n", + "

15. Sieci Transformer — pozycyjne zanurzenia [wykład]

\n", "

Filip Graliński (2022)

\n", "
\n", "\n", diff --git a/wyk/15_Pozycyjne_zanurzenia.org b/wyk/15_Pozycyjne_zanurzenia.org index 0005f15..4e6f83b 100644 --- a/wyk/15_Pozycyjne_zanurzenia.org +++ b/wyk/15_Pozycyjne_zanurzenia.org @@ -1,4 +1,4 @@ -* Pozycyjne zanurzenia +* Sieci Transformer — pozycyjne zanurzenia ** Atencja nie uwzględnia kolejności wyrazów