From c2d5a96afcec537c836264fd2a53f346ec78bfde Mon Sep 17 00:00:00 2001 From: Filip Gralinski Date: Sat, 14 May 2022 10:27:03 +0200 Subject: [PATCH 1/3] LSTM --- wyk/07_Zanurzenia_slow.ipynb | 550 ++++++++++++++++++- wyk/08_Neuronowy_ngramowy_model.ipynb | 727 ++++++++++++++++++++++++- wyk/08_Neuronowy_ngramowy_model.pdf | Bin 0 -> 298242 bytes wyk/09_Rekurencyjny_model_jezyka.ipynb | 2 +- wyk/09_Rekurencyjny_model_jezyka.org | 72 ++- 5 files changed, 1341 insertions(+), 10 deletions(-) create mode 100644 wyk/08_Neuronowy_ngramowy_model.pdf diff --git a/wyk/07_Zanurzenia_slow.ipynb b/wyk/07_Zanurzenia_slow.ipynb index bb98b73..720c72d 100644 --- a/wyk/07_Zanurzenia_slow.ipynb +++ b/wyk/07_Zanurzenia_slow.ipynb @@ -1,4 +1,3 @@ - { "cells": [ { @@ -16,4 +15,551 @@ "\n" ] }, -{"cell_type":"markdown","metadata":{},"source":["## Zanurzenia słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["W praktyce stosowalność słowosieci okazała się zaskakująco\nograniczona. Większy przełom w przetwarzaniu języka naturalnego przyniosły\nwielowymiarowe reprezentacje słów, inaczej: zanurzenia słów.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### „Wymiary” słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Moglibyśmy zanurzyć (ang. *embed*) w wielowymiarowej przestrzeni, tzn. zdefiniować odwzorowanie\n$E \\colon V \\rightarrow \\mathcal{R}^m$ dla pewnego $m$ i określić taki sposób estymowania\nprawdopodobieństw $P(u|v)$, by dla par $E(v)$ i $E(v')$ oraz $E(u)$ i $E(u')$ znajdujących się w pobliżu\n(według jakiejś metryki odległości, na przykład zwykłej odległości euklidesowej):\n\n$$P(u|v) \\approx P(u'|v').$$\n\n$E(u)$ nazywamy zanurzeniem (embeddingiem) słowa.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Wymiary określone z góry?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Można by sobie wyobrazić, że $m$ wymiarów mogłoby być z góry\nokreślonych przez lingwistę. Wymiary te byłyby związane z typowymi\n„osiami” rozpatrywanymi w językoznawstwie, na przykład:\n\n- czy słowo jest wulgarne, pospolite, potoczne, neutralne czy książkowe?\n- czy słowo jest archaiczne, wychodzące z użycia czy jest neologizmem?\n- czy słowo dotyczy kobiet, czy mężczyzn (w sensie rodzaju gramatycznego i/lub\n socjolingwistycznym)?\n- czy słowo jest w liczbie pojedynczej czy mnogiej?\n- czy słowo jest rzeczownikiem czy czasownikiem?\n- czy słowo jest rdzennym słowem czy zapożyczeniem?\n- czy słowo jest nazwą czy słowem pospolitym?\n- czy słowo opisuje konkretną rzecz czy pojęcie abstrakcyjne?\n- …\n\nW praktyce okazało się jednak, że lepiej, żeby komputer uczył się sam\nmożliwych wymiarów — z góry określamy tylko $m$ (liczbę wymiarów).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Bigramowy model języka oparty na zanurzeniach\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Zbudujemy teraz najprostszy model język oparty na zanurzeniach. Będzie to właściwie najprostszy\n**neuronowy model języka**, jako że zbudowany model można traktować jako prostą sieć neuronową.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Słownik\n\n"]},{"cell_type":"markdown","metadata":{},"source":["W typowym neuronowym modelu języka rozmiar słownika musi być z góry\nograniczony. Zazwyczaj jest to liczba rzędu kilkudziesięciu wyrazów —\npo prostu będziemy rozpatrywać $|V|$ najczęstszych wyrazów, pozostałe zamienimy\nna specjalny token `` reprezentujący nieznany (*unknown*) wyraz.\n\nAby utworzyć taki słownik użyjemy gotowej klasy `Vocab` z pakietu torchtext:\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"16"}],"source":["from itertools import islice\nimport regex as re\nimport sys\nfrom torchtext.vocab import build_vocab_from_iterator\n\n\ndef get_words_from_line(line):\n line = line.rstrip()\n yield ''\n for m in re.finditer(r'[\\p{L}0-9\\*]+|\\p{P}+', line):\n yield m.group(0).lower()\n yield ''\n\n\ndef get_word_lines_from_file(file_name):\n with open(file_name, 'r') as fh:\n for line in fh:\n yield get_words_from_line(line)\n\nvocab_size = 20000\n\nvocab = build_vocab_from_iterator(\n get_word_lines_from_file('opensubtitlesA.pl.txt'),\n max_tokens = vocab_size,\n specials = [''])\n\nvocab['jest']"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"['', '', '', 'w', 'wierzyli']"}],"source":["vocab.lookup_tokens([0, 1, 2, 10, 12345])"]},{"cell_type":"markdown","metadata":{},"source":["#### Definicja sieci\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Naszą prostą sieć neuronową zaimplementujemy używając frameworku PyTorch.\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["from torch import nn\nimport torch\n\nembed_size = 100\n\nclass SimpleBigramNeuralLanguageModel(nn.Module):\n def __init__(self, vocabulary_size, embedding_size):\n super(SimpleBigramNeuralLanguageModel, self).__init__()\n self.model = nn.Sequential(\n nn.Embedding(vocabulary_size, embedding_size),\n nn.Linear(embedding_size, vocabulary_size),\n nn.Softmax()\n )\n\n def forward(self, x):\n return self.model(x)\n\nmodel = SimpleBigramNeuralLanguageModel(vocab_size, embed_size)\n\nvocab.set_default_index(vocab[''])\nixs = torch.tensor(vocab.forward(['pies']))\nout[0][vocab['jest']]"]},{"cell_type":"markdown","metadata":{},"source":["Teraz wyuczmy model. Wpierw tylko potasujmy nasz plik:\n\n shuf < opensubtitlesA.pl.txt > opensubtitlesA.pl.shuf.txt\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["from torch.utils.data import IterableDataset\nimport itertools\n\ndef look_ahead_iterator(gen):\n prev = None\n for item in gen:\n if prev is not None:\n yield (prev, item)\n prev = item\n\nclass Bigrams(IterableDataset):\n def __init__(self, text_file, vocabulary_size):\n self.vocab = build_vocab_from_iterator(\n get_word_lines_from_file(text_file),\n max_tokens = vocabulary_size,\n specials = [''])\n self.vocab.set_default_index(self.vocab[''])\n self.vocabulary_size = vocabulary_size\n self.text_file = text_file\n\n def __iter__(self):\n return look_ahead_iterator(\n (self.vocab[t] for t in itertools.chain.from_iterable(get_word_lines_from_file(self.text_file))))\n\ntrain_dataset = Bigrams('opensubtitlesA.pl.shuf.txt', vocab_size)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"(2, 5)"}],"source":["from torch.utils.data import DataLoader\n\nnext(iter(train_dataset))"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"[tensor([ 2, 5, 51, 3481, 231]), tensor([ 5, 51, 3481, 231, 4])]"}],"source":["from torch.utils.data import DataLoader\n\nnext(iter(DataLoader(train_dataset, batch_size=5)))"]},{"cell_type":"markdown","metadata":{},"source":[" device = 'cuda'\n model = SimpleBigramNeuralLanguageModel(vocab_size, embed_size).to(device)\n data = DataLoader(train_dataset, batch_size=5000)\n optimizer = torch.optim.Adam(model.parameters())\n criterion = torch.nn.NLLLoss()\n \n model.train()\n step = 0\n for x, y in data:\n x = x.to(device)\n y = y.to(device)\n optimizer.zero_grad()\n ypredicted = model(x)\n loss = criterion(torch.log(ypredicted), y)\n if step % 100 == 0:\n print(step, loss)\n step += 1\n loss.backward()\n optimizer.step()\n \n torch.save(model.state_dict(), 'model1.bin')\n\nPoliczmy najbardziej prawdopodobne kontynuację dla zadanego słowa:\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"[('ciebie', 73, 0.1580502986907959), ('mnie', 26, 0.15395283699035645), ('', 0, 0.12862136960029602), ('nas', 83, 0.0410110242664814), ('niego', 172, 0.03281523287296295), ('niej', 245, 0.02104802615940571), ('siebie', 181, 0.020788608118891716), ('którego', 365, 0.019379809498786926), ('was', 162, 0.013852755539119244), ('wszystkich', 235, 0.01381855271756649)]"}],"source":["device = 'cuda'\nmodel = SimpleBigramNeuralLanguageModel(vocab_size, embed_size).to(device)\nmodel.load_state_dict(torch.load('model1.bin'))\nmodel.eval()\n\nixs = torch.tensor(vocab.forward(['dla'])).to(device)\n\nout = model(ixs)\ntop = torch.topk(out[0], 10)\ntop_indices = top.indices.tolist()\ntop_probs = top.values.tolist()\ntop_words = vocab.lookup_tokens(top_indices)\nlist(zip(top_words, top_indices, top_probs))"]},{"cell_type":"markdown","metadata":{},"source":["Teraz zbadajmy najbardziej podobne zanurzenia dla zadanego słowa:\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"[('.', 3, 0.404473215341568), (',', 4, 0.14222915470600128), ('z', 14, 0.10945753753185272), ('?', 6, 0.09583134204149246), ('w', 10, 0.050338443368673325), ('na', 12, 0.020703863352537155), ('i', 11, 0.016762692481279373), ('', 0, 0.014571071602404118), ('...', 15, 0.01453721895813942), ('', 1, 0.011769450269639492)]"}],"source":["vocab = train_dataset.vocab\nixs = torch.tensor(vocab.forward(['kłopot'])).to(device)\n\nout = model(ixs)\ntop = torch.topk(out[0], 10)\ntop_indices = top.indices.tolist()\ntop_probs = top.values.tolist()\ntop_words = vocab.lookup_tokens(top_indices)\nlist(zip(top_words, top_indices, top_probs))"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"[('poszedł', 1087, 1.0), ('idziesz', 1050, 0.4907470941543579), ('przyjeżdża', 4920, 0.45242372155189514), ('pojechałam', 12784, 0.4342481195926666), ('wrócił', 1023, 0.431664377450943), ('dobrać', 10351, 0.4312002956867218), ('stałeś', 5738, 0.4258835017681122), ('poszła', 1563, 0.41979148983955383), ('trafiłam', 18857, 0.4109022617340088), ('jedzie', 1674, 0.4091658890247345)]"}],"source":["cos = nn.CosineSimilarity(dim=1, eps=1e-6)\n\nembeddings = model.model[0].weight\n\nvec = embeddings[vocab['poszedł']]\n\nsimilarities = cos(vec, embeddings)\n\ntop = torch.topk(similarities, 10)\n\ntop_indices = top.indices.tolist()\ntop_probs = top.values.tolist()\ntop_words = vocab.lookup_tokens(top_indices)\nlist(zip(top_words, top_indices, top_probs))"]},{"cell_type":"markdown","metadata":{},"source":["#### Zapis przy użyciu wzoru matematycznego\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Powyżej zaprogramowaną sieć neuronową można opisać następującym wzorem:\n\n$$\\vec{y} = \\operatorname{softmax}(CE(w_{i-1}),$$\n\ngdzie:\n\n- $w_{i-1}$ to pierwszy wyraz w bigramie (poprzedzający wyraz),\n- $E(w)$ to zanurzenie (embedding) wyrazy $w$ — wektor o rozmiarze $m$,\n- $C$ to macierz o rozmiarze $|V| \\times m$, która rzutuje wektor zanurzenia w wektor o rozmiarze słownika,\n- $\\vec{y}$ to wyjściowy wektor prawdopodobieństw o rozmiarze $|V|$.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["##### Hiperparametry\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Zauważmy, że nasz model ma dwa hiperparametry:\n\n- $m$ — rozmiar zanurzenia,\n- $|V|$ — rozmiar słownika, jeśli zakładamy, że możemy sterować\n rozmiarem słownika (np. przez obcinanie słownika do zadanej liczby\n najczęstszych wyrazów i zamiany pozostałych na specjalny token, powiedzmy, ``.\n\nOczywiście możemy próbować manipulować wartościami $m$ i $|V|$ w celu\npolepszenia wyników naszego modelu.\n\n**Pytanie**: dlaczego nie ma sensu wartość $m \\approx |V|$ ? dlaczego nie ma sensu wartość $m = 1$?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Diagram sieci\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Jako że mnożenie przez macierz ($C$) oznacza po prostu zastosowanie\nwarstwy liniowej, naszą sieć możemy interpretować jako jednowarstwową\nsieć neuronową, co można zilustrować za pomocą następującego diagramu:\n\n![img](./07_Zanurzenia_slow/bigram1.drawio.png \"Diagram prostego bigramowego neuronowego modelu języka\")\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Zanurzenie jako mnożenie przez macierz\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Uzyskanie zanurzenia ($E(w)$) zazwyczaj realizowane jest na zasadzie\nodpytania (look-up\\_). Co ciekawe, zanurzenie można intepretować jako\nmnożenie przez macierz zanurzeń (embeddingów) $E$ o rozmiarze $m \\times |V|$ — jeśli słowo będziemy na wejściu kodowali przy użyciu\nwektora z gorącą jedynką (one-hot encoding\\_), tzn. słowo $w$ zostanie\npodane na wejściu jako wektor $\\vec{1_V}(w) = [0,\\ldots,0,1,0\\ldots,0]$ o rozmiarze $|V|$\nzłożony z samych zer z wyjątkiem jedynki na pozycji odpowiadającej indeksowi wyrazu $w$ w słowniku $V$.\n\nWówczas wzór przyjmie postać:\n\n$$\\vec{y} = \\operatorname{softmax}(CE\\vec{1_V}(w_{i-1})),$$\n\ngdzie $E$ będzie tym razem macierzą $m \\times |V|$.\n\n**Pytanie**: czy $\\vec{1_V}(w)$ intepretujemy jako wektor wierszowy czy kolumnowy?\n\nW postaci diagramu można tę interpretację zilustrować w następujący sposób:\n\n![img](./07_Zanurzenia_slow/bigram2.drawio.png \"Diagram prostego bigramowego neuronowego modelu języka z wejściem w postaci one-hot\")\n\n"]}],"metadata":{"org":null,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":0} \ No newline at end of file + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Zanurzenia słów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "W praktyce stosowalność słowosieci okazała się zaskakująco\n", + "ograniczona. Większy przełom w przetwarzaniu języka naturalnego przyniosły\n", + "wielowymiarowe reprezentacje słów, inaczej: zanurzenia słów.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### „Wymiary” słów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Moglibyśmy zanurzyć (ang. *embed*) w wielowymiarowej przestrzeni, tzn. zdefiniować odwzorowanie\n", + "$E \\colon V \\rightarrow \\mathcal{R}^m$ dla pewnego $m$ i określić taki sposób estymowania\n", + "prawdopodobieństw $P(u|v)$, by dla par $E(v)$ i $E(v')$ oraz $E(u)$ i $E(u')$ znajdujących się w pobliżu\n", + "(według jakiejś metryki odległości, na przykład zwykłej odległości euklidesowej):\n", + "\n", + "$$P(u|v) \\approx P(u'|v').$$\n", + "\n", + "$E(u)$ nazywamy zanurzeniem (embeddingiem) słowa.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Wymiary określone z góry?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Można by sobie wyobrazić, że $m$ wymiarów mogłoby być z góry\n", + "określonych przez lingwistę. Wymiary te byłyby związane z typowymi\n", + "„osiami” rozpatrywanymi w językoznawstwie, na przykład:\n", + "\n", + "- czy słowo jest wulgarne, pospolite, potoczne, neutralne czy książkowe?\n", + "- czy słowo jest archaiczne, wychodzące z użycia czy jest neologizmem?\n", + "- czy słowo dotyczy kobiet, czy mężczyzn (w sensie rodzaju gramatycznego i/lub\n", + " socjolingwistycznym)?\n", + "- czy słowo jest w liczbie pojedynczej czy mnogiej?\n", + "- czy słowo jest rzeczownikiem czy czasownikiem?\n", + "- czy słowo jest rdzennym słowem czy zapożyczeniem?\n", + "- czy słowo jest nazwą czy słowem pospolitym?\n", + "- czy słowo opisuje konkretną rzecz czy pojęcie abstrakcyjne?\n", + "- …\n", + "\n", + "W praktyce okazało się jednak, że lepiej, żeby komputer uczył się sam\n", + "możliwych wymiarów — z góry określamy tylko $m$ (liczbę wymiarów).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Bigramowy model języka oparty na zanurzeniach\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zbudujemy teraz najprostszy model język oparty na zanurzeniach. Będzie to właściwie najprostszy\n", + "**neuronowy model języka**, jako że zbudowany model można traktować jako prostą sieć neuronową.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Słownik\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "W typowym neuronowym modelu języka rozmiar słownika musi być z góry\n", + "ograniczony. Zazwyczaj jest to liczba rzędu kilkudziesięciu wyrazów —\n", + "po prostu będziemy rozpatrywać $|V|$ najczęstszych wyrazów, pozostałe zamienimy\n", + "na specjalny token `` reprezentujący nieznany (*unknown*) wyraz.\n", + "\n", + "Aby utworzyć taki słownik użyjemy gotowej klasy `Vocab` z pakietu torchtext:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "16" + ] + } + ], + "source": [ + "from itertools import islice\n", + "import regex as re\n", + "import sys\n", + "from torchtext.vocab import build_vocab_from_iterator\n", + "\n", + "\n", + "def get_words_from_line(line):\n", + " line = line.rstrip()\n", + " yield ''\n", + " for m in re.finditer(r'[\\p{L}0-9\\*]+|\\p{P}+', line):\n", + " yield m.group(0).lower()\n", + " yield ''\n", + "\n", + "\n", + "def get_word_lines_from_file(file_name):\n", + " with open(file_name, 'r') as fh:\n", + " for line in fh:\n", + " yield get_words_from_line(line)\n", + "\n", + "vocab_size = 20000\n", + "\n", + "vocab = build_vocab_from_iterator(\n", + " get_word_lines_from_file('opensubtitlesA.pl.txt'),\n", + " max_tokens = vocab_size,\n", + " specials = [''])\n", + "\n", + "vocab['jest']" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['', '', '', 'w', 'wierzyli']" + ] + } + ], + "source": [ + "vocab.lookup_tokens([0, 1, 2, 10, 12345])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Definicja sieci\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Naszą prostą sieć neuronową zaimplementujemy używając frameworku PyTorch.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from torch import nn\n", + "import torch\n", + "\n", + "embed_size = 100\n", + "\n", + "class SimpleBigramNeuralLanguageModel(nn.Module):\n", + " def __init__(self, vocabulary_size, embedding_size):\n", + " super(SimpleBigramNeuralLanguageModel, self).__init__()\n", + " self.model = nn.Sequential(\n", + " nn.Embedding(vocabulary_size, embedding_size),\n", + " nn.Linear(embedding_size, vocabulary_size),\n", + " nn.Softmax()\n", + " )\n", + "\n", + " def forward(self, x):\n", + " return self.model(x)\n", + "\n", + "model = SimpleBigramNeuralLanguageModel(vocab_size, embed_size)\n", + "\n", + "vocab.set_default_index(vocab[''])\n", + "ixs = torch.tensor(vocab.forward(['pies']))\n", + "out[0][vocab['jest']]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Teraz wyuczmy model. Wpierw tylko potasujmy nasz plik:\n", + "\n", + " shuf < opensubtitlesA.pl.txt > opensubtitlesA.pl.shuf.txt\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from torch.utils.data import IterableDataset\n", + "import itertools\n", + "\n", + "def look_ahead_iterator(gen):\n", + " prev = None\n", + " for item in gen:\n", + " if prev is not None:\n", + " yield (prev, item)\n", + " prev = item\n", + "\n", + "class Bigrams(IterableDataset):\n", + " def __init__(self, text_file, vocabulary_size):\n", + " self.vocab = build_vocab_from_iterator(\n", + " get_word_lines_from_file(text_file),\n", + " max_tokens = vocabulary_size,\n", + " specials = [''])\n", + " self.vocab.set_default_index(self.vocab[''])\n", + " self.vocabulary_size = vocabulary_size\n", + " self.text_file = text_file\n", + "\n", + " def __iter__(self):\n", + " return look_ahead_iterator(\n", + " (self.vocab[t] for t in itertools.chain.from_iterable(get_word_lines_from_file(self.text_file))))\n", + "\n", + "train_dataset = Bigrams('opensubtitlesA.pl.shuf.txt', vocab_size)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(2, 5)" + ] + } + ], + "source": [ + "from torch.utils.data import DataLoader\n", + "\n", + "next(iter(train_dataset))" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[tensor([ 2, 5, 51, 3481, 231]), tensor([ 5, 51, 3481, 231, 4])]" + ] + } + ], + "source": [ + "from torch.utils.data import DataLoader\n", + "\n", + "next(iter(DataLoader(train_dataset, batch_size=5)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " device = 'cuda'\n", + " model = SimpleBigramNeuralLanguageModel(vocab_size, embed_size).to(device)\n", + " data = DataLoader(train_dataset, batch_size=5000)\n", + " optimizer = torch.optim.Adam(model.parameters())\n", + " criterion = torch.nn.NLLLoss()\n", + " \n", + " model.train()\n", + " step = 0\n", + " for x, y in data:\n", + " x = x.to(device)\n", + " y = y.to(device)\n", + " optimizer.zero_grad()\n", + " ypredicted = model(x)\n", + " loss = criterion(torch.log(ypredicted), y)\n", + " if step % 100 == 0:\n", + " print(step, loss)\n", + " step += 1\n", + " loss.backward()\n", + " optimizer.step()\n", + " \n", + " torch.save(model.state_dict(), 'model1.bin')\n", + "\n", + "Policzmy najbardziej prawdopodobne kontynuację dla zadanego słowa:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('ciebie', 73, 0.1580502986907959), ('mnie', 26, 0.15395283699035645), ('', 0, 0.12862136960029602), ('nas', 83, 0.0410110242664814), ('niego', 172, 0.03281523287296295), ('niej', 245, 0.02104802615940571), ('siebie', 181, 0.020788608118891716), ('którego', 365, 0.019379809498786926), ('was', 162, 0.013852755539119244), ('wszystkich', 235, 0.01381855271756649)]" + ] + } + ], + "source": [ + "device = 'cuda'\n", + "model = SimpleBigramNeuralLanguageModel(vocab_size, embed_size).to(device)\n", + "model.load_state_dict(torch.load('model1.bin'))\n", + "model.eval()\n", + "\n", + "ixs = torch.tensor(vocab.forward(['dla'])).to(device)\n", + "\n", + "out = model(ixs)\n", + "top = torch.topk(out[0], 10)\n", + "top_indices = top.indices.tolist()\n", + "top_probs = top.values.tolist()\n", + "top_words = vocab.lookup_tokens(top_indices)\n", + "list(zip(top_words, top_indices, top_probs))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Teraz zbadajmy najbardziej podobne zanurzenia dla zadanego słowa:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('.', 3, 0.404473215341568), (',', 4, 0.14222915470600128), ('z', 14, 0.10945753753185272), ('?', 6, 0.09583134204149246), ('w', 10, 0.050338443368673325), ('na', 12, 0.020703863352537155), ('i', 11, 0.016762692481279373), ('', 0, 0.014571071602404118), ('...', 15, 0.01453721895813942), ('', 1, 0.011769450269639492)]" + ] + } + ], + "source": [ + "vocab = train_dataset.vocab\n", + "ixs = torch.tensor(vocab.forward(['kłopot'])).to(device)\n", + "\n", + "out = model(ixs)\n", + "top = torch.topk(out[0], 10)\n", + "top_indices = top.indices.tolist()\n", + "top_probs = top.values.tolist()\n", + "top_words = vocab.lookup_tokens(top_indices)\n", + "list(zip(top_words, top_indices, top_probs))" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('poszedł', 1087, 1.0), ('idziesz', 1050, 0.4907470941543579), ('przyjeżdża', 4920, 0.45242372155189514), ('pojechałam', 12784, 0.4342481195926666), ('wrócił', 1023, 0.431664377450943), ('dobrać', 10351, 0.4312002956867218), ('stałeś', 5738, 0.4258835017681122), ('poszła', 1563, 0.41979148983955383), ('trafiłam', 18857, 0.4109022617340088), ('jedzie', 1674, 0.4091658890247345)]" + ] + } + ], + "source": [ + "cos = nn.CosineSimilarity(dim=1, eps=1e-6)\n", + "\n", + "embeddings = model.model[0].weight\n", + "\n", + "vec = embeddings[vocab['poszedł']]\n", + "\n", + "similarities = cos(vec, embeddings)\n", + "\n", + "top = torch.topk(similarities, 10)\n", + "\n", + "top_indices = top.indices.tolist()\n", + "top_probs = top.values.tolist()\n", + "top_words = vocab.lookup_tokens(top_indices)\n", + "list(zip(top_words, top_indices, top_probs))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Zapis przy użyciu wzoru matematycznego\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Powyżej zaprogramowaną sieć neuronową można opisać następującym wzorem:\n", + "\n", + "$$\\vec{y} = \\operatorname{softmax}(CE(w_{i-1}),$$\n", + "\n", + "gdzie:\n", + "\n", + "- $w_{i-1}$ to pierwszy wyraz w bigramie (poprzedzający wyraz),\n", + "- $E(w)$ to zanurzenie (embedding) wyrazy $w$ — wektor o rozmiarze $m$,\n", + "- $C$ to macierz o rozmiarze $|V| \\times m$, która rzutuje wektor zanurzenia w wektor o rozmiarze słownika,\n", + "- $\\vec{y}$ to wyjściowy wektor prawdopodobieństw o rozmiarze $|V|$.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Hiperparametry\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zauważmy, że nasz model ma dwa hiperparametry:\n", + "\n", + "- $m$ — rozmiar zanurzenia,\n", + "- $|V|$ — rozmiar słownika, jeśli zakładamy, że możemy sterować\n", + " rozmiarem słownika (np. przez obcinanie słownika do zadanej liczby\n", + " najczęstszych wyrazów i zamiany pozostałych na specjalny token, powiedzmy, ``.\n", + "\n", + "Oczywiście możemy próbować manipulować wartościami $m$ i $|V|$ w celu\n", + "polepszenia wyników naszego modelu.\n", + "\n", + "**Pytanie**: dlaczego nie ma sensu wartość $m \\approx |V|$ ? dlaczego nie ma sensu wartość $m = 1$?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Diagram sieci\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jako że mnożenie przez macierz ($C$) oznacza po prostu zastosowanie\n", + "warstwy liniowej, naszą sieć możemy interpretować jako jednowarstwową\n", + "sieć neuronową, co można zilustrować za pomocą następującego diagramu:\n", + "\n", + "![img](./07_Zanurzenia_slow/bigram1.drawio.png \"Diagram prostego bigramowego neuronowego modelu języka\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Zanurzenie jako mnożenie przez macierz\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Uzyskanie zanurzenia ($E(w)$) zazwyczaj realizowane jest na zasadzie\n", + "odpytania (look-up\\_). Co ciekawe, zanurzenie można intepretować jako\n", + "mnożenie przez macierz zanurzeń (embeddingów) $E$ o rozmiarze $m \\times |V|$ — jeśli słowo będziemy na wejściu kodowali przy użyciu\n", + "wektora z gorącą jedynką (one-hot encoding\\_), tzn. słowo $w$ zostanie\n", + "podane na wejściu jako wektor $\\vec{1_V}(w) = [0,\\ldots,0,1,0\\ldots,0]$ o rozmiarze $|V|$\n", + "złożony z samych zer z wyjątkiem jedynki na pozycji odpowiadającej indeksowi wyrazu $w$ w słowniku $V$.\n", + "\n", + "Wówczas wzór przyjmie postać:\n", + "\n", + "$$\\vec{y} = \\operatorname{softmax}(CE\\vec{1_V}(w_{i-1})),$$\n", + "\n", + "gdzie $E$ będzie tym razem macierzą $m \\times |V|$.\n", + "\n", + "**Pytanie**: czy $\\vec{1_V}(w)$ intepretujemy jako wektor wierszowy czy kolumnowy?\n", + "\n", + "W postaci diagramu można tę interpretację zilustrować w następujący sposób:\n", + "\n", + "![img](./07_Zanurzenia_slow/bigram2.drawio.png \"Diagram prostego bigramowego neuronowego modelu języka z wejściem w postaci one-hot\")\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.2" + }, + "org": null + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/wyk/08_Neuronowy_ngramowy_model.ipynb b/wyk/08_Neuronowy_ngramowy_model.ipynb index 607c5bc..a9a1212 100644 --- a/wyk/08_Neuronowy_ngramowy_model.ipynb +++ b/wyk/08_Neuronowy_ngramowy_model.ipynb @@ -1,4 +1,3 @@ - { "cells": [ { @@ -16,4 +15,728 @@ "\n" ] }, -{"cell_type":"markdown","metadata":{},"source":["## Neuronowy n-gramowy model języka\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Omówiony w poprzedniej części neuronowy bigramowy model języka\nwarunkuje kolejny wyraz jedynie względem bezpośrednio poprzedzającego\n— jak w każdym bigramowym modelu przyjmujemy założenie, że $w_i$\nzależy tylko od $w_{i-1}$. Rzecz jasna jest to bardzo duże\nograniczenie, w rzeczywistości bardzo często prawdopodobieństwo\nkolejnego wyrazu zależy od wyrazu dwie, trzy, cztery itd. pozycje\nwstecz czy w ogólności od wszystkich wyrazów poprzedzających (bez\nwzględu na ich pozycje).\n\n**Pytanie**: Wskaż zależności o zasięgu większym niż 1 wyraz w zdaniu\n/Zatopieni w kłębach dymu cygar i pochyleni nad butelkami z ciemnego\nszkła obywatele tej dzielnicy, jedni zakładali się o wygranę lub\nprzegranę Anglii, drudzy o bankructwo Wokulskiego; jedni nazywali\ngeniuszem Bismarcka, drudzy — awanturnikiem Wokulskiego; jedni\nkrytykowali postępowanie prezydenta MacMahona, inni twierdzili, że\nWokulski jest zdecydowanym wariatem, jeżeli nie czymś gorszym…/\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Trigramowy neuronowy model języka\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Spróbujmy najpierw rozszerzyć nasz model na trigramy, to znaczy\nbędziemy przewidywać słowo $w_i$ na podstawie słów $w_{i-2}$ i\n$w_{i-1}$.\n\nNajprostsze rozwiązanie polegałoby na zanurzeniu pary $(w_{i-2},\nw_{i-1})$ w całości i postępowaniu jak w przypadku modelu bigramowego.\nByłoby to jednak zupełnie niepraktyczne, jako że:\n\n- liczba zanurzeń do wyuczenia byłaby olbrzymia ($|V|^2$ — byłoby to\n ewentualnie akceptowalne dla modeli operujących na krótszych\n jednostkach niż słowa, np. na znakach),\n- w szczególności zanurzenia dla par $(v, u)$, $(u, v)$, $(u, u)$ i\n $(v, v)$ nie miałyby ze sobą nic wspólnego.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Konketanacja zanurzeń\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Właściwsze rozwiązanie polega na zanurzeniu dalej pojedynczych słów i\nnastępnie ich **konkatenowaniu**.\n\nPrzypomnijmy, że konkatenacja wektorów $\\vec{x_1}$ i $\\vec{x_2}$ to wektor o rozmiarze\n$|\\vec{x_1}| + |\\vec{x_2}|$ powstały ze „sklejania” wektorów $\\vec{x_1}$ i $\\vec{x_2}$.\nKonkatenację wektorów $\\vec{x_1}$ i $\\vec{x_2}$ będziemy oznaczać za pomocą $[\\vec{x_1}, \\vec{x_2}]$.\n\nPrzykład: jeśli $\\vec{x_1} = [-1, 2, 0]$ i $\\vec{x_2} = [3, -3]$,\nwówczas $[\\vec{x_1}, \\vec{x_2}] = [-1, 2, 0, 3, -3]$\n\nOznacza to, że nasza macierz „kontekstowa” $C$ powinna mieć w modelu trigramowym rozmiar nie\n$|V| \\times m$, lecz $|V| \\times (m+m)$ = $|V| \\times 2m$ i wyjście będzie zdefiniowane za pomocą wzoru:\n\n$$\\vec{y} = \\operatorname{softmax}(C[E(w_{i-2}),E(w_{i-1})]),$$\n\nco można przedstawić za pomocą następującego schematu:\n\n![img](./08_Neuronowy_ngramowy_model/trigram1.drawio.png \"Diagram prostego bigramowego neuronowego modelu języka\")\n\n"]},{"cell_type":"markdown","metadata":{},"source":["##### Rozbicie macierzy $C$\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Zamiast mnożyć macierz $C$ przez konkatenację dwóch wektorów, można\nrozbić macierz $C$ na dwie, powiedzmy $C_{-2}$ i $C_{-1}$, przemnażać\nje osobno przez odpowiadające im wektory i następnie **dodać** macierze,\ntak aby:\n\n$$C[E(w_{i-2}),E(w_{i-1})] = C_{-2}E(w_{i-2}) + C_{-1}E(w_{i-1}).$$\n\nMacierze $C_{-2}$ i $C_{-1}$ będą miały rozmiar $|V| \\times m$.\n\nPrzy tym podejściu możemy powiedzieć, że ostatni i przedostatni wyraz\nmają swoje osobne macierze o potencjalnie różnych wagach — co ma sens,\njako że na inne aspekty zwracamy uwagę przewidując kolejne słowo na\npodstawie wyrazu bezpośrednio poprzedzającego, a na inne — na\npodstawie słowa występującego dwie pozycje wcześniej.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Uogólnienie na $n$-gramowy model języka dla dowolnego $n$\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Łatwo uogólnić opisany wyżej trigramowy model języka dla dowolnego $n$.\nUogólniony model można przedstawić za pomocą wzoru:\n\n$$\\vec{y} = \\operatorname{softmax}(C[E(w_{i-n+1}),\\dots,E(w_{i-1})]),$$\n\ngdzie macierz $C$ ma rozmiar $|V| \\times nm$ lub za pomocą wzoru:\n\n$$\\vec{y} = \\operatorname{softmax}(C_{-(n-1)}E(w_{i-n+1}) + \\dots + C_{-1}E(w_{i-1}),$$\n\ngdzie macierze $C_{-(n-1)}$, …, $C_{-1}$ mają rozmiary $|V| \\times m$.\n\nPor. diagram:\n\n![img](./08_Neuronowy_ngramowy_model/ngram.drawio.png \"Diagram prostego n-gramowego neuronowego modelu języka\")\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Dodanie kolejnej warstwy\n\n"]},{"cell_type":"markdown","metadata":{},"source":["W wypadku trigramowego czy — ogólniej — n-gramowego modelu języka dla\n$n \\geq 3$ warto dodać kolejną (**ukrytą**) warstwę, na którą będziemy rzutować\nskonkatenowane embeddingi, zanim zrzutujemy je do długiego wektora\nprawdopodobieństw.\n\nZakładamy, że warstwa ukryta zawiera $h$ neuronów. Wartość $h$ powinna być mniejsza\nniż $nm$ (a może nawet od $m$).\n\n**Pytanie**: Dlaczego wartość $h > nm$ nie jest racjonalnym wyborem?\n\n**Pytanie**: Dlaczego dodanie kolejnej warstwy nie ma sensu dla modelu bigramowego?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Funkcja aktywacji\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Aby warstwa ukryta wnosiła coś nowego, na wyjściu z tej funkcji musimy (dlaczego?)\nzastosować nieliniową **funkcji aktywacji**. Zazwyczaj jako funkcji\naktywacji w sieciach neuronowych używa się funkcji ReLU albo funkcji\nsigmoidalnej. W prostych neuronowych modelach języka sprawdza się też\n**tangens hiperboliczny** (tgh, w literaturze anglojęzycznej tanh):\n\n$$\\operatorname{tgh}(x) = \\frac{e^x - e^{-x}}{e^x + e^{-x}}.$$\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAbAAAAEgCAYAAADVKCZpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAj90lEQVR4nO3de3xV5Z3v8c8vOzcg3Em4hEQuIhcRgUZqa0dFhSLVYvW0VTvWTs8MxzkyU3vanmHsOZ2+Tufi2E57ZlpbS1s79lRLtUplFBVEO9ZrAUXuCCJIQkjC/ZKQ2/6dP/aCbkPAJGTvtdfO9/3qfu21nudZK79tSb57PXvttczdERERiZqcsAsQERHpCgWYiIhEkgJMREQiSQEmIiKRpAATEZFIUoCJiEgkKcBERCSSFGAiIhJJCjAREYkkBZiIiESSAkxERCJJASYiIpGkABMRkUhSgImISCQpwEREJJIUYCIiEkkKMBERiSQFmIiIRJICTEREIkkBJiIikaQAExGRSFKAiYhIJCnAREQkkhRgIiISSQowERGJJAWYiIhEkgJMREQiSQEmIiKRpAATEZFIUoCJiEgkKcBERCSSFGAiIhJJCjAREYkkBZiIiERSbtgFpMqQIUN81KhRYZchIhIpa9as2efuxWHX0RFZG2CjRo1i9erVYZchIhIpZrYr7Bo6SlOIIiISSQowERGJJAWYiIhEUtoCzMweMLNaM9twhn4zs38zs+1mts7Mpif1zTGzrUHfwnTVLCIimSudR2D/Dsw5S/+1wLjgMR/4EYCZxYD7gv5JwC1mNimllYqISMZLW4C5+4vAgbMMmQf8whNeAwaY2XBgBrDd3Xe4exOwOBgrIiI9WCadRl8K7E5arwza2mv/cBrrEpEsFI87zfE4rXGnudVpjTstwXpr3InHodWDZQ8ecYi7484f2xzcHQ/26YA7OE7wv1Pr7omfHTyd2u59jbQZm9SeLLnZ2wyaMnIAw/oXnst/nkjIpACzdtr8LO2n78BsPonpR8rLy7uvMhEJTTzuHGpo5sDxRg7VN3O4IfE4eqKFoyeaOdrYwvHGFuqbWmloaqW+qZUTza2caInT2NxKY/Dc1BqnsSVOc2v8VGBlq/tunc4npgwPu4yUy6QAqwTKktZHAnuA/DO0n8bdFwGLACoqKrL3X6dIlnB39h1rYuf+41QerKfqYANVhxrYe/gENUcaqT16ggPHmzhb1uTHcuhTEKN3fi59CmL0yotRmBdjQK88CvsVUJAbIz83J/GIJZ7zYkZeLIe8WA6xHCM3J7GeEyzHzMjJMWI5kGNGLGgzM8wI+sFIjDPALDHWACzRZ5Z4B56Tk3gffnIcp9Y4NSax/Mf368ljrd338cn7er+ygb0/8L99NsikAFsKLDCzxSSmCA+7e7WZ1QHjzGw0UAXcDNwaYp0i0gXHGltYX3mYzdVH2LL3CFv3HmXHvuMcPdHyvnFDivIZ1r+QYf0LmTKyP0OKChjUJ5/BRfkM6J3PgF559O+VR79eefQpiFGQGwvpFUnY0hZgZvYr4EpgiJlVAn8H5AG4+/3AMmAusB2oB/4s6GsxswXAs0AMeMDdN6arbhHpmv3HGnn5nf28tmM/b+w6yNs1R08dSQ3uk8+E4X351LRSRg/pw+ghfSgb1JvSAb0ozFMgScekLcDc/ZYP6HfgzjP0LSMRcCKSodydLXuP8vT6ap7bXMum6iMA9C3IZWr5AD5+4TCmlg/gwuH9KO5b8L7pMpGuyKQpRBGJoKpDDTyyajdPrK1i5/56cgwqzhvEV2dfwMfGFXNRaX9iOQor6X4KMBHpNHfnha21PPjKLl7cVgfAR8cOZv7lY5l94VCGFBWEXKH0BAowEemw1rizbH01P/zdO2yuPsLQfgUsmHk+n6koo2xQzzjzTTKHAkxEOuTFt+v41pOb2FZ7jLHFffjOpy9m3tQR5MV0TXAJhwJMRM5qR90x/v6pzTy/pZbzBvfmvlunc+3kYae+2yQSFgWYiLQrHnd+/spO7n1mC/mxHO6eO4HbPzpK37uSjKEAE5HTVB6s56uPvsVrOw5w9YQS/unGiyjpl/3X1pNoUYCJyPv8flsddz70Bq1x596bpvDpipH6zpZkJAWYiACJU+N/9tK7/OOyzYwr6cuiz3+I8wb3CbsskTNSgIkILa1x7l6ynkdWVzJ70lC++9mpFBXoz4NkNv0LFenhmlvj3LV4LU+tr+avrjqfL19zgc4wlEhQgIn0YI0trfzVw2+yfFMNX587kb+4fEzYJYl0mAJMpIdqbo3zl798g+e31PLN6yfxhctGh12SSKcowER6IHfn7sfX8/yWWr51w2Ruu/S8sEsS6TRdA0akB/r+89t5dE0lf33V+QoviSwFmEgP89iaSr674m1unFbKl2ddEHY5Il2WtgAzszlmttXMtpvZwnb6v2Zma4PHBjNrNbNBQd9OM1sf9K1OV80i2eat3YdY+Pg6Pjp2MPfcNEVfUJZIS8tnYGYWA+4DZgGVwCozW+rum06OcfdvA98Oxl8PfNndDyTtZqa770tHvSLZ6HBDM3c+/AYlfQv54eemk5+rCRiJtnT9C54BbHf3He7eBCwG5p1l/C3Ar9JSmUgP4O4sfGwdew+f4Pu3TmNA7/ywSxI5Z+kKsFJgd9J6ZdB2GjPrDcwBHktqdmC5ma0xs/kpq1IkS/3ytV08vWEvX/v4eKaXDwy7HJFuka7T6NubaPczjL0eeLnN9OFl7r7HzEqAFWa2xd1fPO2HJMJtPkB5efm51iySFd6uOcq3ntzMzPHF/MWf6IvKkj3SdQRWCZQlrY8E9pxh7M20mT509z3Bcy2whMSU5GncfZG7V7h7RXFx8TkXLRJ1rXHnbx5bR5+CGN/59MW6RJRklXQF2CpgnJmNNrN8EiG1tO0gM+sPXAE8kdTWx8z6nlwGZgMb0lK1SMT98rVdvPneIb5x/SQGFxWEXY5It0rLFKK7t5jZAuBZIAY84O4bzeyOoP/+YOingOXufjxp86HAkuB031zgYXd/Jh11i0RZ1aEG7n1mC5dfUMwNU9v9yFkk0tJ2KSl3XwYsa9N2f5v1fwf+vU3bDuDiFJcnklXcnf+1ZD1xh3+4YbK+7yVZSV8EEclCyzfV8MLWOr4y+wLKBvUOuxyRlFCAiWSZppY49zy9hfNLivjCR0eFXY5IyijARLLMw6/v4t19x7l77gRyY/oVl+ylf90iWeRwQzP/unIbl50/mJnjS8IuRySlFGAiWeSHL2znUEMzd8+dqBM3JOspwESyROXBen7+8k5umj6SC0f0D7sckZRTgIlkifteeAeAr8zWPb6kZ1CAiWSBPYca+M2a3Xz2kjKG9+8VdjkiaaEAE8kC9/9n4ujrjivHhlyJSPoowEQirvbICRav2s1N00dSOkBHX9JzKMBEIu7HL+6gNe789yvPD7sUkbRSgIlE2L5jjTz0+i5umFpK+WBdMkp6FgWYSIT94pWdNLbEuXOmPvuSnkcBJhJRJ5pbeej197h6wlDGFBeFXY5I2inARCJq6Vt72H+8iS9eNirsUkRCoQATiSB35+cv72T80L58ZOzgsMsRCUXaAszM5pjZVjPbbmYL2+m/0swOm9na4PGNjm4r0tO8tuMAm6uP8MWPjdI1D6XHSssdmc0sBtwHzAIqgVVmttTdN7UZ+nt3v66L24r0GD9/+V0G9s5j3tTSsEsRCU26jsBmANvdfYe7NwGLgXlp2FYk67y3v54Vm2u49cPlFObFwi5HJDTpCrBSYHfSemXQ1tZHzOwtM3vazC7s5LYiPcJDr+8ix4zbLh0VdikioUrLFCLQ3iS9t1l/AzjP3Y+Z2Vzgt8C4Dm6b+CFm84H5AOXl5V0uViRTNbXE+c2aSq6eUMKw/oVhlyMSqnQdgVUCZUnrI4E9yQPc/Yi7HwuWlwF5ZjakI9sm7WORu1e4e0VxcXF31i+SEZ7bXMP+403cMkNv0ETSFWCrgHFmNtrM8oGbgaXJA8xsmAWnU5nZjKC2/R3ZVqSn+NUf3mNE/0Iuv0Bv0ETSMoXo7i1mtgB4FogBD7j7RjO7I+i/H/gvwF+aWQvQANzs7g60u2066hbJJLsP1PPS9n389VXjiOXo1HmRdH0GdnJacFmbtvuTln8A/KCj24r0NI+uTpzL9JlLyj5gpEjPoCtxiERAS2ucR1ZXcvm4Yt3zSySgABOJgP98u469R05wywwdfYmcpAATiYDfrKlkcJ98rp44NOxSRDKGAkwkwx1uaGbl5lquv3gEeTH9yoqcpN8GkQy3bH01Ta1xbpyuC9CIJFOAiWS4JW9WMaa4DxeV9g+7FJGMogATyWC7D9Tzh3cPcOO0Ut02RaQNBZhIBlv6VuKqabptisjpFGAiGcrdefyNSmaMGkTZoN5hlyOScRRgIhlqQ9UR3qk7zg3TdPQl0h4FmEiG+u3aKvJjOXziouFhlyKSkRRgIhkoHneeWlfNFeOL6d87L+xyRDKSAkwkA6157yB7j5zguik6+hI5EwWYSAZ6al01Bbk5unSUyFkowEQyTGvcWba+mpnjSygqSNsdj0QiRwEmkmFW7TxA7dFGrrtY04ciZ5O2ADOzOWa21cy2m9nCdvo/Z2brgscrZnZxUt9OM1tvZmvNbHW6ahYJw1PrqinMy+GqCSVhlyKS0dIyP2FmMeA+YBZQCawys6Xuvilp2LvAFe5+0MyuBRYBH07qn+nu+9JRr0hYWuPO0xuquXrCUHrna/pQ5GzSdQQ2A9ju7jvcvQlYDMxLHuDur7j7wWD1NWBkmmoTyRiv79jPvmNNOvtQpAPSFWClwO6k9cqg7Uz+K/B00roDy81sjZnNT0F9IhnhyfXV9M6PceV4TR+KfJB0zVG0dxltb3eg2UwSAfaxpObL3H2PmZUAK8xsi7u/2M6284H5AOXl5edetUgatcad5RtrmDmhhF75sbDLEcl46ToCqwTKktZHAnvaDjKzKcBPgXnuvv9ku7vvCZ5rgSUkpiRP4+6L3L3C3SuKi4u7sXyR1Fuz6yD7jjVy7eRhYZciEgnpCrBVwDgzG21m+cDNwNLkAWZWDjwO3Obubye19zGzvieXgdnAhjTVLZI2z2zYS35ujqYPRTooLVOI7t5iZguAZ4EY8IC7bzSzO4L++4FvAIOBHwY37mtx9wpgKLAkaMsFHnb3Z9JRt0i6uDvPbtzL5eOG6MvLIh2Utt8Ud18GLGvTdn/S8p8Df97OdjuAi9u2i2STDVVHqDrUwF3XjAu7FJHI0JU4RDLAMxurieUY1+jahyIdpgATyQDPbNjLpWMGMbBPftiliESGAkwkZNtqjvJO3XHmXKizD0U6QwEmErJnNuwFYLYCTKRTFGAiIXt2016mlw9gaL/CsEsRiRQFmEiIqg41sKHqCB/X0ZdIpynAREK0YmNi+nDWJJ19KNJZCjCREK3YXMP5JUWMKS4KuxSRyFGAiYTkcH0zr+04wGwdfYl0iQJMJCTPb62hNe6aPhTpIgWYSEhWbKqhpG8BF48cEHYpIpGkABMJwYnmVn63tY5Zk4aSk9Pe7fJE5IMowERC8Mo7+6hvatWXl0XOgQJMJAQrNtVQVJDLpWMGhV2KSGQpwETSLB53Vmyq5YrxxRTkxsIuRySy0hZgZjbHzLaa2XYzW9hOv5nZvwX968xseke3FYmSN3cfYt+xRp0+L3KO0hJgZhYD7gOuBSYBt5jZpDbDrgXGBY/5wI86sa1IZKzYVENujnHl+JKwSxGJtNMCzMwWmNnAbv45M4Dt7r7D3ZuAxcC8NmPmAb/whNeAAWY2vIPbikTGik17uXTMYPr3ygu7FJFIa+8IbBiwysweCabuuuMc31Jgd9J6ZdDWkTEd2VYkEnbUHeOduuNcM1FHXyLn6rQAc/f/RWIa72fAF4BtZvaPZjb2HH5OeyHoHRzTkW0TOzCbb2arzWx1XV1dJ0sUSb0Vm2oAuEaff4mcs3Y/A3N3B/YGjxZgIPAbM7u3iz+nEihLWh8J7OngmI5se7LuRe5e4e4VxcXFXSxVJHVWbKph0vB+jBzYO+xSRCKvvc/A/trM1gD3Ai8DF7n7XwIfAm7q4s9ZBYwzs9Fmlg/cDCxtM2Yp8PngbMRLgcPuXt3BbUUy3r5jjax576CufSjSTXLbaRsC3Ojuu5Ib3T1uZtd15Ye4e4uZLQCeBWLAA+6+0czuCPrvB5YBc4HtQD3wZ2fbtit1iITp+c21uOveXyLd5bQAc/dvnGmwu2/u6g9y92UkQiq57f6kZQfu7Oi2IlGzfFMNpQN6ceGIfmGXIpIVdCUOkTRoaGrlpe11XDOxhO45sVdEFGAiafD7bXWcaI7r4r0i3UgBJpIGyzfV0K8wlxmjdfFeke6iABNJsZbWOCs313DVhBLyYvqVE+ku+m0SSbE1uw5ysL5Z04ci3UwBJpJiyzfVkJ+bw+UX6Mv1It1JASaSQu7O8k17uWzsYIoK2vvapYh0lQJMJIW21hxl94EGTR+KpIACTCSFlm+swQyu1tXnRbqdAkwkhVZsqmFa2QBK+haGXYpI1lGAiaRI1aEG1lcd1vShSIoowERS5JkNewGYowATSQkFmEiKPLthLxOG9WXUkD5hlyKSlRRgIilQd7SRVbsOMGeyjr5EUkUBJpICKzbV4I4CTCSFFGAiKfD0hmpGDe7N+KF9wy5FJGulPMDMbJCZrTCzbcHzwHbGlJnZC2a22cw2mtmXkvq+aWZVZrY2eMxNdc0i5+JwfTOvvrOfj08epnt/iaRQOo7AFgIr3X0csDJYb6sF+Iq7TwQuBe40s0lJ/d9z96nBQ3dmloy2cksNLXHn2snDwy5FJKulI8DmAQ8Gyw8CN7Qd4O7V7v5GsHwU2AyUpqE2kW73zIa9DO9fyJTS/mGXIpLV0hFgQ929GhJBBZz1mjpmNgqYBrye1LzAzNaZ2QPtTUGKZIrjjS3859t1zJ40lJwcTR+KpFK3BJiZPWdmG9p5zOvkfoqAx4C73P1I0PwjYCwwFagG/uUs2883s9Vmtrqurq5rL0bkHKzcUktjS5y5F2n6UCTVuuX+Du5+zZn6zKzGzIa7e7WZDQdqzzAuj0R4PeTujyftuyZpzE+AJ89SxyJgEUBFRYV3+oWInKOn1u2hpG8Bl4waFHYpIlkvHVOIS4Hbg+XbgSfaDrDEqVo/Aza7+3fb9CW/lf0UsCFFdYqck6Mnmnlhax1zLxqu6UORNEhHgN0DzDKzbcCsYB0zG2FmJ88ovAy4DbiqndPl7zWz9Wa2DpgJfDkNNYt02srNtTS1xLluiqYPRdIh5beIdff9wNXttO8B5gbLLwHtvmV199tSWqBIN3lyXTXD+hUyvVznGYmkg67EIdINDjc08+LbdXxiiqYPRdJFASbSDZ7bVENTa5xPaPpQJG0UYCLd4Ml1eygd0ItpZQPCLkWkx1CAiZyjQ/VNvLR9H5+YMlzXPhRJIwWYyDl6an01za3O9VNGhF2KSI+iABM5R799s4rzS4qYXNov7FJEehQFmMg52H2gnlU7D/KpaaWaPhRJMwWYyDn47ZtVAMybqulDkXRTgIl0kbuzZG0VM0YPYuTA3mGXI9LjKMBEumhd5WF21B3nxmm6dZ1IGBRgIl205M0q8nNzuFa3ThEJhQJMpAuaW+P8x1t7uGZiCf175YVdjkiPpAAT6YLfba1j//Embpiq6UORsCjARLrg16veo7hvATMnlIRdikiPpQAT6aS9h0/w/JZaPv2hkeTF9CskEhb99ol00qOrdxN3+OwlZWGXItKjpTzAzGyQma0ws23Bc7t3+zOzncGdl9ea2erObi+SDvG48+vVu/no2MGcN7hP2OWI9GjpOAJbCKx093HAymD9TGa6+1R3r+ji9iIp9fI7+6g82MDNM8rDLkWkx0tHgM0DHgyWHwRuSPP2It1m8R92M6B3HrMnDQ27FJEeLx0BNtTdqwGC5zOdtuXAcjNbY2bzu7C9SErtP9bI8k17uXHaSArzYmGXI9Lj5XbHTszsOWBYO11f78RuLnP3PWZWAqwwsy3u/mIn65gPzAcoL9cUj3Svxat209zq3DJDJ2+IZIJuCTB3v+ZMfWZWY2bD3b3azIYDtWfYx57gudbMlgAzgBeBDm0fbLsIWARQUVHhXX9FIu/X3BrnF6/u5E/GDWHc0L5hlyMipGcKcSlwe7B8O/BE2wFm1sfM+p5cBmYDGzq6vUiqLVtfTc2RRr542eiwSxGRQDoC7B5glpltA2YF65jZCDNbFowZCrxkZm8BfwCecvdnzra9SDo98PJOxgzpwxUXFIddiogEumUK8WzcfT9wdTvte4C5wfIO4OLObC+SLm+8d5C3dh/i/8y7kJwc3XVZJFPoShwiH+CBl96lb2EuN00fGXYpIpJEASZyFtWHG3h6w15uvqSMPgUpn7AQkU5QgImcxU9efBeAz39kVLiFiMhpFGAiZ1B3tJGH/7CLG6aWUjaod9jliEgbCjCRM/jp73fQ1BLnzpljwy5FRNqhABNpx4HjTfy/13Zx3ZQRjCkuCrscEWmHAkykHQ+89C71Ta0suOr8sEsRkTNQgIm0cbihmQdf2cm1k4dxgS4bJZKxFGAibfzkxR0cbWzR0ZdIhlOAiSTZc6iBn/x+B5+8eAQXjugfdjkichYKMJEk31m+FQe+9vHxYZciIh9AASYS2FB1mCVvVvFnl43S975EIkABJgK4O//w1GYG9s7nzpn67EskChRgIsBzm2t5dcd+7rpmHP0K88IuR0Q6QAEmPd6xxhb+7okNjCsp4pYZ5WGXIyIdlPIAM7NBZrbCzLYFzwPbGTPezNYmPY6Y2V1B3zfNrCqpb26qa5ae5TvPbqX6yAnuuWkKeTG9pxOJinT8ti4EVrr7OGBlsP4+7r7V3ae6+1TgQ0A9sCRpyPdO9rv7srbbi3TVG+8d5MFXd/L5S8/jQ+ed9t5KRDJYOgJsHvBgsPwgcMMHjL8aeMfdd6WyKJGmljgLH1vHsH6FfG3OhLDLEZFOSkeADXX3aoDgueQDxt8M/KpN2wIzW2dmD7Q3BSnSFT94fhtv1xzj72+YTJFuVikSOd0SYGb2nJltaOcxr5P7yQc+CTya1PwjYCwwFagG/uUs2883s9Vmtrqurq7zL0R6jFe27+P7L2znxumlXD1xaNjliEgXdMvbTne/5kx9ZlZjZsPdvdrMhgO1Z9nVtcAb7l6TtO9Ty2b2E+DJs9SxCFgEUFFR4Z14CdKD1B1t5Eu/XsuYIX341rzJYZcjIl2UjinEpcDtwfLtwBNnGXsLbaYPg9A76VPAhm6tTnqUeNz5H4+s5UhDMz+4dTp9NHUoElnpCLB7gFlmtg2YFaxjZiPM7NQZhWbWO+h/vM3295rZejNbB8wEvpyGmiVLff/57fx+2z7+7voLmTi8X9jliMg5SPnbT3ffT+LMwrbte4C5Sev1wOB2xt2W0gKlx3hibRXfe+5tbpxWyi0zysIuR0TOkb61KT3Cazv287VH13HpmEH8000XYWZhlyQi50gBJllve+1R5v9iNeWDe/PjP62gIDcWdkki0g0UYJLVttce43M/fZ383Bg//8Il9O+tC/WKZAudgiVZa+veo3zup68B8NCfX6p7fIlkGR2BSVbaUHWYmxe9SizHWDz/I4wf1jfskkSkmynAJOus2FTDZ3/8Kr3yYvx6/kc4v6Qo7JJEJAU0hShZw9354e/e4TvLtzJ5RH8Wff5DDO/fK+yyRCRFFGCSFQ7VN3H3kvUsW7+XeVNH8M83TaEwT2cbimQzBZhE3gtba/mb36zjwPEm/vbaCcy/fIy+5yXSAyjAJLL2H2vk289uZfGq3VwwtIgHvnAJk0v7h12WiKSJAkwip6klzi9e3cm/rtxGfVMr/+3yMXx51gWaMhTpYRRgEhlNLXGWvFnJj373Djv313PFBcX87+smcn6JTpEX6YkUYJLxDtc38+ia3fzspXepPnyCyaX9+PkXLmHmhA+6ubeIZDMFmGSkeNx5/d0DPLJ6N8vWV9PYEufDowfxzzdN4U/GDdFJGiKiAJPM0dQSZ/XOAzy9YS/PbNxL3dFG+hbm8pmKMj57SZlO0BCR91GASWiaWuJsqj7C6p0HeGn7Pl7fcYCG5lYK83KYOb6EOZOHMXvSMHrl6+QMETldygPMzD4NfBOYCMxw99VnGDcH+FcgBvzU3U/euXkQ8GtgFLAT+Iy7H0x13dK9jp5o5p2642ypPsLm6iNs3HOE9VWHaWyJAzBmSB8+XTGSj50/hI+NG0LvfL23EpGzS8dfiQ3AjcCPzzTAzGLAfcAsoBJYZWZL3X0TsBBY6e73mNnCYP1vUl+2dJS7c+REC7VHTlBzpJHqww1UHmyg6lAD7x2o5919x6k72nhqfJ/8GBOH9+O2S89j+nkDmVY+QJd8EpFOS3mAuftm4IM+dJ8BbHf3HcHYxcA8YFPwfGUw7kHgdyjAzom70xp3mludxpZWmlriNLbEaWhu5URzKyea49Q3tVDf1MrxxhaON7ZwrLGFo40tHGlo5nDwOHi8mQPHmzhwvImm1vj7foYZlPQtoGxgb668oJgxxUWMKe7DxGH9GDmwFzk5OglDRM5NpszTlAK7k9YrgQ8Hy0PdvRrA3avNLKXnTv/HW3t4fkttu33u/sfl97VzWru7v2/MyRXHcU9sc2r51D6S1xPbxz1Ydoi7B4/EWXqnloNAag3aTi63xJ2W1uA5Hqel1WlqjdPcGn9fzR2Vn5tDv8I8+vfKpX+vPIb3L+TCEf0YVJRPcVEBJf0KGdq3gKH9Chk+oFB3PhaRlOqWADOz54Bh7XR93d2f6Mgu2mnr9J9YM5sPzAcoLy/v7OYAVB1qYM2uM3/Elnwgae9rt9Pbrf0xFuzHsFP7M7M/tif15ZgF6xDLsVPj8nNziAVHMbEcI2aJvtwcIxZLrOfGgvWcHPJiRl4sh9yYkR/LIS94FOTmUJCXQ34sh8K8GL3yYonn/Bh9CmL0zsulqDCXooJc8nN19x0RyRzdEmDufs057qISKEtaHwnsCZZrzGx4cPQ1HGj/8ChRxyJgEUBFRUUXjjHgjivGcscVY7uyqYiIpFGmvKVeBYwzs9Fmlg/cDCwN+pYCtwfLtwMdOaITEZEsl/IAM7NPmVkl8BHgKTN7NmgfYWbLANy9BVgAPAtsBh5x943BLu4BZpnZNhJnKd6T6ppFRCTzmXfl0/wIqKio8NWr2/3KmYiInIGZrXH3irDr6IhMmUIUERHpFAWYiIhEkgJMREQiSQEmIiKRpAATEZFIytqzEM2sDtgVdh1dMATYF3YRadbTXnNPe72g1xwl57l7cdhFdETWBlhUmdnqqJzC2l162mvuaa8X9JolNTSFKCIikaQAExGRSFKAZZ5FYRcQgp72mnva6wW9ZkkBfQYmIiKRpCMwERGJJAVYhjKzr5qZm9mQsGtJNTP7tpltMbN1ZrbEzAaEXVOqmNkcM9tqZtvNbGHY9aSamZWZ2QtmttnMNprZl8KuKR3MLGZmb5rZk2HXks0UYBnIzMpI3DrmvbBrSZMVwGR3nwK8DfxtyPWkhJnFgPuAa4FJwC1mNincqlKuBfiKu08ELgXu7AGvGeBLJG4NJSmkAMtM3wP+J9AjPqB09+XBPeEAXiNxR+5sNAPY7u473L0JWAzMC7mmlHL3and/I1g+SuKPemm4VaWWmY0EPgH8NOxasp0CLMOY2SeBKnd/K+xaQvJF4Omwi0iRUmB30nolWf7HPJmZjQKmAa+HXEqq/V8Sb0DjIdeR9XLDLqAnMrPngGHtdH0duBuYnd6KUu9sr9ndnwjGfJ3ElNND6awtjaydth5xlG1mRcBjwF3ufiTselLFzK4Dat19jZldGXI5WU8BFgJ3v6a9djO7CBgNvGVmkJhKe8PMZrj73jSW2O3O9JpPMrPbgeuAqz17v9tRCZQlrY8E9oRUS9qYWR6J8HrI3R8Pu54Uuwz4pJnNBQqBfmb2S3f/05Drykr6HlgGM7OdQIW7R/GCoB1mZnOA7wJXuHtd2PWkipnlkjhJ5WqgClgF3OruG0MtLIUs8U7sQeCAu98VcjlpFRyBfdXdrwu5lKylz8AkE/wA6AusMLO1ZnZ/2AWlQnCiygLgWRInMzySzeEVuAy4Dbgq+P92bXB0InLOdAQmIiKRpCMwERGJJAWYiIhEkgJMREQiSQEmIiKRpAATEZFIUoCJiEgkKcBERCSSFGAiaWJmlwT3PCs0sz7B/bEmh12XSFTpi8wiaWRmf0/iGnm9gEp3/6eQSxKJLAWYSBqZWT6JayCeAD7q7q0hlyQSWZpCFEmvQUARiWs/FoZci0ik6QhMJI3MbCmJOzGPBoa7+4KQSxKJLN0PTCRNzOzzQIu7P2xmMeAVM7vK3Z8PuzaRKNIRmIiIRJI+AxMRkUhSgImISCQpwEREJJIUYCIiEkkKMBERiSQFmIiIRNL/Bx8SvIIOeTvjAAAAAElFTkSuQmCC","text/plain":""},"metadata":{},"output_type":"display_data"}],"source":["import matplotlib.pyplot as plt\nimport torch\nimport torch.nn as nn\n\nx = torch.linspace(-5,5,100)\nplt.xlabel(\"x\")\nplt.ylabel(\"y\")\na = torch.Tensor(x.size()[0]).fill_(2.)\nm = torch.stack([x, a])\nplt.plot(x, nn.functional.tanh(m)[0])\nfname = '08_Neuronowy_ngramowy_model/tanh.png'\nplt.savefig(fname)\nfname"]},{"cell_type":"markdown","metadata":{},"source":["##### Tangens hiperboliczny zastosowany dla wektora\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Tangens hiperboliczny wektora będzie po prostu wektorem tangensów\nhiperbolicznych poszczególnych wartości.\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["import torch\nimport torch.nn as nn\n\nv = torch.Tensor([-100, -2.0, 0.0, 0.5, 1000.0])\nnn.functional.tanh(v)"]},{"cell_type":"markdown","metadata":{},"source":["[[[tensor](tensor)([-1.0000, -0.9640, 0.0000, 0.4621, 1.0000])]]\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Wzór i schemat dwuwarstwowego n-gramowego neuronowego modelu języka\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Dwuwarstwowy model języka będzie określony następującym wzorem:\n\n$$\\vec{y} = \\operatorname{softmax}(C\\operatorname{tgh}(W[E(w_{i-n+1}),\\dots,E(w_{i-1})])),$$\n\ngdzie:\n\n- $W$ jest wyuczalną macierzą wag o rozmiarze $h \\times nm$,\n- $C$ będzie macierzą o rozmiarze $|V| \\times h$.\n\nZmodyfikowaną sieć można przedstawić za pomocą następującego schematu:\n\n![img](./08_Neuronowy_ngramowy_model/ngram-tgh.drawio.png \"Dwuwarstwowy n-gramowy neuronowy model języka\")\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Liczba wag w modelu dwuwarstwowym\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Na wagi w modelu dwuwarstwowym składają się:\n\n- zanurzenia: $m|V|$,\n- wagi warstwy ukrytej: $hnm$,\n- wagi warstwy wyjściowej: $|V|h$,\n\na zatem łącznie:\n\n$$m|V| + hnm + |V|h$$\n\nJeśli $h \\approx m$ (co jest realistyczną opcją), wówczas otrzymamy oszacowanie:\n\n$$O(m|V| + nm^2).$$\n\nZauważmy, że względem $n$ oznacza to bardzo korzystną złożoność\n$O(n)$! Oznacza to, że nasz model może działać dla dużo większych\nwartości $n$ niż tradycyjny, statystyczny n-gramowy model języka (dla którego\nwartości $n > 5$ zazwyczaj nie mają sensu).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Model worka słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Jak stwierdziliśmy przed chwilą, dwuwarstwowy n-gramowy model języka\nmoże działać dla stosunkowo dużego $n$. Zauważmy jednak, że istnieje\npewna słabość tego modelu. Otóż o ile intuicyjnie ma sens odróżniać\nsłowo poprzedzające, słowo występujące dwie pozycje wstecz i zapewne\ntrzy pozycje wstecz, a zatem uczyć się osobnych macierzy $C_{-1}$,\n$C_{-2}$, $C_{-3}$ to różnica między wpływem słowa\nwystępującego cztery pozycje wstecz i pięć pozycji wstecz jest już\nraczej nieistotna; innymi słowy różnica między macierzami $C_{-4}$ i\n$C_{-5}$ będzie raczej niewielka i sieć niepotrzebnie będzie uczyła\nsię dwukrotnie podobnych wag. Im dalej wstecz, tym różnica wpływu\nbędzie jeszcze mniej istotna, można np. przypuszczać, że różnica\nmiędzy $C_{-10}$ i $C_{-13}$ nie powinna być duża.\n\nSpróbujmy najpierw zaproponować radykalne podejście, w którym nie\nbędziemy w ogóle uwzględniać pozycji słów (lub będziemy je uwzględniać\nw niewielkim stopniu), później połączymy to z omówionym wcześniej\nmodelem $n$-gramowym.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Agregacja wektorów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Zamiast patrzeć na kilka poprzedzających słów, można przewidywać na\npodstawie **całego** ciągu słów poprzedzających odgadywane słowo. Zauważmy jednak, że\nsieć neuronowa musi mieć ustaloną strukturę, nie możemy zmieniać jej\nrozmiaru. Musimy zatem najpierw zagregować cały ciąg do wektora o\n**stałej** długości. Potrzebujemy zatem pewnej funkcji agregującej $A$, takiej by\n$A(w_1,\\dots,w_{i-1})$ było wektorem o stałej długości, niezależnie od $i$.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Worek słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Najprostszą funkcją agregującą jest po prostu… suma. Dodajemy po\nprostu zanurzenia słów:\n\n$$A(w_1,\\dots,w_{i-1}) = E(w_1) + \\dots + E(w_{i-1}) = \\sum_{j=1}^{i-1} E(w_j).$$\n\n**Uwaga**: zanurzenia słów nie zależą od pozycji słowa (podobnie było w wypadku n-gramowego modelu!).\n\nJeśli rozmiar zanurzenia (embeddingu) wynosi $m$, wówczas rozmiar\nwektora uzyskanego dla całego poprzedzającego tekstu wynosi również $m$.\n\nProste dodawanie wydaje się bardzo „prostacką” metodą, a jednak\nsuma wektorów słów jest **zaskakująco skuteczną metodą zanurzenia\n(embedowania) całych tekstów (doc2vec)**. Prostym wariantem dodawania jest obliczanie **średniej wektorów**:\n\n$$A(w_1,\\dots,w_{i-1}) = \\frac{E(w_1) + \\dots + E(w_{i-1})}{i-1} = \\frac{\\sum_{j=1}^{i-1} E(w_j)}{i-1}.$$\n\nTak czy siak uzyskany wektor **nie zależy od kolejności słów**\n(dodawanie jest przemienne i łączne!). Mówimy więc o **worku słów**\n(*bag of words*, *BoW*) — co ma symbolizować fakt, że słowa są\nprzemieszane, niczym produkty w torbie na zakupy.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["##### Schemat graficzny modelu typu worek słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Po zanurzeniu całego poprzedzającego tekstu postępujemy podobnie jak w\nmodelu bigramowym — rzutujemy embedding na długi wektor wartości, na\nktórym stosujemy funkcję softmax:\n\n![img](./08_Neuronowy_ngramowy_model/bow1.drawio.png \"Model typu worek słów\")\n\nOdpowiada to wzorowi:\n\n$$y = \\operatorname{softmax}(C\\sum_{j=1}^{i-1} E(w_j)).$$\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Jak traktować powtarzające się słowa?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Według wzoru podanego wyżej, jeśli słowo w poprzedzającym tekście\npojawia się więcej niż raz, jego embedding zostanie zsumowany odpowiednią liczbę razy.\nNa przykład embedding tekstu *to be or not to be* będzie wynosił:\n\n$$E(\\mathrm{to}) + E(\\mathrm{be}) + E(\\mathrm{or}) + E(\\mathrm{not}) + E(\\mathrm{to}) + E(\\mathrm{be}) = 2E(\\mathrm{to}) + 2E(\\mathrm{be}) + E(\\mathrm{or}) + E(\\mathrm{not}).$$\n\nInnymi słowy, choć w worku słów nie uwzględniamy kolejności słów, to\n**liczba wystąpień** ma dla nas ciągle znaczenie. Można powiedzieć, że\ntraktujemy poprzedzający tekst jako **multizbiór** (struktura\nmatematyczna, w której nie uwzględnia się kolejności, choć zachowana\njest informacja o liczbie wystąpień).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["##### Zbiór słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Oczywiście moglibyśmy przy agregowaniu zanurzeń pomijać powtarzające\nsię słowa, a zatem zamiast multizbioru słów rozpatrywać po prostu ich zbiór:\n\n$$A(w_1,\\dots,w_{i-1}) = \\sum_{w \\in \\{w_1,\\dots,w_{i-1}\\}} E(w).$$\n\nJest kwestią dyskusyjną, czy to lepsze czy gorsze podejście — w końcu\nliczba wystąpień np. słów *Ukraina* czy *Polska* może wpływać w jakimś\nstopniu na prawdopodobieństwo kolejnego słowa (*Kijów* czy\n*Warszawa*?).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Worek słów a wektoryzacja tf\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Wzór na sumę zanurzeń słów można przekształcić w taki sposób, by\nsumować po wszystkich słowach ze słownika, zamiast po słowach rzeczywiście występujących w tekście:\n\n$$A(w_1,\\dots,w_{i-1}) = \\sum_{j=1}^{i-1} E(w_j) = \\sum_{w \\in V} \\#wE(w)$$\n\ngdzie $\\#w$ to liczba wystąpień słowa $w$ w ciagu $w_1,\\dots,w_{i-1}$ (w wielu przypadkach równa zero!).\n\nJeśli teraz zanurzenia będziemy reprezentować jako macierz $E$ (por. poprzedni wykład),\nwówczas sumę można przedstawić jako iloczyn macierzy $E$ i pewnego wektora:\n\n$$A(w_1,\\dots,w_{i-1}) = E(w) [\\#w^1,\\dots,\\#w^{|V|}]^T.$$\n\n(Odróżniamy $w^i$ jako $i$-ty wyraz w słowniku $V$ od $w_i$ jako $i$-tego wyraz w rozpatrywanym ciągu).\n\nZwróćmy uwagę, że wektor $[\\#w_1,\\dots,\\#w_{|V|}]$ to po prostu\nreprezentacja wektora poprzedzającego tekstu (tj. ciągu\n$(w_1,\\dots,w_{i-1})$) przy użyciu schematu wektoryzacji tf (*term\nfrequency*). Przypomnijmy, że tf to reprezentacja tekstu przy użyciu\nwektorów o rozmiarze $|V|$ — na każdej pozycji odnotowujemy liczbę wystąpień.\nWektory tf są **rzadkie**, tj. na wielu pozycjach zawierają zera.\n\nInnymi słowy, nasz model języka *bag of words* można przedstawić za pomocą wzoru:\n\n$$y = \\operatorname{softmax}(C\\operatorname{tf}(w_1,\\dots,w_{i-1})),$$\n\nco można zilustrować w następujący sposób:\n\n![img](./08_Neuronowy_ngramowy_model/bow2.drawio.png \"Model typu worek słów — alternatywna reprezentacja\")\n\nMożna stwierdzić, że zanurzenie tekstu przekształca rzadki, długi wektor\ntf w gęsty, krótki wektor.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Ważenie słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Czy wszystkie słowa są tak samo istotne? Rzecz jasna, nie:\n\n- jak już wiemy z naszych rozważań dotyczących n-gramowych modeli języka, słowa bezpośrednio\n poprzedzające odgadywany wyraz mają większy wpływ niż słowa wcześniejsze;\n intuicyjnie, wpływ słów stopniowo spada — tym bardziej, im bardziej słowo jest oddalone od słowa odgadywanego;\n- jak wiemy z wyszukiwania informacji, słowa, które występują w wielu tekstach czy dokumentach, powinny mieć\n mniejsze znaczenie, w skrajnym przypadku słowa występujące w prawie każdym tekście (*że*, *w*, *i* itd.) powinny\n być praktycznie pomijane jako *stop words* (jeśli rozpatrywać je w „masie” worka słów — oczywiście\n to, czy słowo poprzedzające odgadywane słowo to *że*, *w* czy *i* ma olbrzymie znaczenie!).\n\nZamiast po prostu dodawać zanurzenia, można operować na sumie (bądź średniej) ważonej:\n\n$$\\sum_{j=1}^{i-1} \\omega(j, w_j)E(w_j),$$\n\ngdzie $\\omega(j, w_j)$ jest pewną wagą, która może zależeć od pozycji $j$ lub samego słowa $w_j$.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Uwzględnienie pozycji\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Można w pewnym stopniu złamać „workowatość” naszej sieci przez proste\nuwzględnienie pozycji słowa, np. w taki sposób:\n\n$$\\omega(j, w_j) = \\beta^{i-j-1},$$\n\ndla pewnego hiperparametru $\\beta$. Na przykład jeśli $\\beta=0,9$,\nwówczas słowo bezpośrednio poprzedzające dane słowo ma $1 / 0,9^9 \\approx 2,58$\nwiększy wpływ niż słowo występujące 10 pozycji wstecz.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Odwrócona częstość dokumentowa\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Aby większą wagę przykładać do słów występujących w mniejszej liczbie\ndokumentów, możemy użyć, znanej z wyszukiwania informacji,\nodwrotnej częstości dokumentowej (*inverted document frequency*, *idf*):\n\n$$\\omega(j, w_j) = \\operatorname{idf}_S(w_j) = \\operatorname{log}\\frac{|S|}{\\operatorname{df}_S(w_j)},$$\n\ngdzie:\n\n- $S$ jest pewną kolekcją dokumentów czy tekstów, z którego pochodzi przedmiotowy ciąg słów,\n- $\\operatorname{df}_S(w)$ to częstość dokumentowa słowa $w$ w kolekcji $S$, tzn. odpowiedź na pytanie,\n w ilu dokumentach występuje $w$.\n\nRzecz jasna, ten sposób ważenia oznacza tak naprawdę zastosowanie wektoryzacji tf-idf zamiast tf,\nnasza sieć będzie dana zatem wzorem:\n\n$$y = \\operatorname{softmax}(C\\operatorname{tfidf}(w_1,\\dots,w_{i-1})).$$\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Bardziej skomplikowane sposoby ważenia słów\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Można oczywiście połączyć odwrotną częstość dokumentową z uwzględnieniem pozycji słowa:\n\n$$\\omega(j, w_j) = \\beta^{i-j-1}\\operatorname{idf}_S(w_j).$$\n\n**Uwaga**: „wagi” $\\omega(j, w_j)$ nie są tak naprawdę wyuczalnymi\nwagami (parametrami) naszej sieci neuronowej, terminologia może być\ntutaj myląca. Z punktu widzenia sieci neuronowej $\\omega(j, w_j)$ są\nstałe i **nie** są optymalizowane w procesie propagacji wstecznej. Innymi\nsłowy, tak zdefiniowane $\\omega(j, w_j)$ zależą tylko od:\n\n- hiperparametru $\\beta$, który może być optymalizowany już poza siecią (w procesie **hiperoptymalizacji**),\n- wartości $\\operatorname{idf}_S(w_j)$ wyliczanych wcześniej na podstawie kolekcji $S$.\n\n**Pytanie**: czy wagi $\\omega(j, w_j)$ mogłyby sensownie uwzględniać\njakieś parametry wyuczalne z całą siecią?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Modelowanie języka przy użyciu bardziej złożonych neuronowych sieci *feed-forward*\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Można połączyć zalety obu ogólnych podejść (n-gramowego modelu i worka\nsłów) — można **równocześnie** traktować w specjalny sposób (na\nprzykład) dwa poprzedzające wyrazy, wszystkie zaś inne wyrazy\nreprezentować jako „tło” modelowane za pomocą worka słów lub podobnej\nreprezentacji. Osiągamy to poprzez konkatenację wektora\npoprzedzającego słowa, słowa występującego dwie pozycje wstecz oraz\nzagregowanego zanurzenia całego wcześniejszego tekstu:\n\n$$y = \\operatorname{softmax}(C[E(w_{i-1}),E(w_{i-2}),A(w_1,\\dots,w_{i-3})]),$$\n\nczy lepiej z dodatkową warstwą ukrytą:\n\n$$y = \\operatorname{softmax}(C\\operatorname{tgh}(W[E(w_{i-1}),E(w_{i-2}),A(w_1,\\dots,w_{i-3})])),$$\n\nW tak uzyskanym dwuwarstwowym neuronowym modelu języka, łączącym model\ntrigramowy z workiem słów, macierz $W$ ma rozmiar $h \\times 3m$.\n\n**Pytanie**: jakie mamy możliwości, jeśli zamiast przewidywać kolejne słowo, mamy za zadanie\nodgadywać słowo w luce (jak w wyzwaniach typu *word gap*)?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Literatura\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Skuteczny n-gramowy neuronowy model języka opisano po raz pierwszy\nw pracy [A Neural Probabilistic Language Model](https://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf) autorstwa Yoshua Bengio i in.\n\n"]}],"metadata":{"org":null,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":0} \ No newline at end of file + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Neuronowy n-gramowy model języka\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Omówiony w poprzedniej części neuronowy bigramowy model języka\n", + "warunkuje kolejny wyraz jedynie względem bezpośrednio poprzedzającego\n", + "— jak w każdym bigramowym modelu przyjmujemy założenie, że $w_i$\n", + "zależy tylko od $w_{i-1}$. Rzecz jasna jest to bardzo duże\n", + "ograniczenie, w rzeczywistości bardzo często prawdopodobieństwo\n", + "kolejnego wyrazu zależy od wyrazu dwie, trzy, cztery itd. pozycje\n", + "wstecz czy w ogólności od wszystkich wyrazów poprzedzających (bez\n", + "względu na ich pozycje).\n", + "\n", + "**Pytanie**: Wskaż zależności o zasięgu większym niż 1 wyraz w zdaniu\n", + "/Zatopieni w kłębach dymu cygar i pochyleni nad butelkami z ciemnego\n", + "szkła obywatele tej dzielnicy, jedni zakładali się o wygranę lub\n", + "przegranę Anglii, drudzy o bankructwo Wokulskiego; jedni nazywali\n", + "geniuszem Bismarcka, drudzy — awanturnikiem Wokulskiego; jedni\n", + "krytykowali postępowanie prezydenta MacMahona, inni twierdzili, że\n", + "Wokulski jest zdecydowanym wariatem, jeżeli nie czymś gorszym…/\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Trigramowy neuronowy model języka\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Spróbujmy najpierw rozszerzyć nasz model na trigramy, to znaczy\n", + "będziemy przewidywać słowo $w_i$ na podstawie słów $w_{i-2}$ i\n", + "$w_{i-1}$.\n", + "\n", + "Najprostsze rozwiązanie polegałoby na zanurzeniu pary $(w_{i-2},\n", + "w_{i-1})$ w całości i postępowaniu jak w przypadku modelu bigramowego.\n", + "Byłoby to jednak zupełnie niepraktyczne, jako że:\n", + "\n", + "- liczba zanurzeń do wyuczenia byłaby olbrzymia ($|V|^2$ — byłoby to\n", + " ewentualnie akceptowalne dla modeli operujących na krótszych\n", + " jednostkach niż słowa, np. na znakach),\n", + "- w szczególności zanurzenia dla par $(v, u)$, $(u, v)$, $(u, u)$ i\n", + " $(v, v)$ nie miałyby ze sobą nic wspólnego.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Konketanacja zanurzeń\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Właściwsze rozwiązanie polega na zanurzeniu dalej pojedynczych słów i\n", + "następnie ich **konkatenowaniu**.\n", + "\n", + "Przypomnijmy, że konkatenacja wektorów $\\vec{x_1}$ i $\\vec{x_2}$ to wektor o rozmiarze\n", + "$|\\vec{x_1}| + |\\vec{x_2}|$ powstały ze „sklejania” wektorów $\\vec{x_1}$ i $\\vec{x_2}$.\n", + "Konkatenację wektorów $\\vec{x_1}$ i $\\vec{x_2}$ będziemy oznaczać za pomocą $[\\vec{x_1}, \\vec{x_2}]$.\n", + "\n", + "Przykład: jeśli $\\vec{x_1} = [-1, 2, 0]$ i $\\vec{x_2} = [3, -3]$,\n", + "wówczas $[\\vec{x_1}, \\vec{x_2}] = [-1, 2, 0, 3, -3]$\n", + "\n", + "Oznacza to, że nasza macierz „kontekstowa” $C$ powinna mieć w modelu trigramowym rozmiar nie\n", + "$|V| \\times m$, lecz $|V| \\times (m+m)$ = $|V| \\times 2m$ i wyjście będzie zdefiniowane za pomocą wzoru:\n", + "\n", + "$$\\vec{y} = \\operatorname{softmax}(C[E(w_{i-2}),E(w_{i-1})]),$$\n", + "\n", + "co można przedstawić za pomocą następującego schematu:\n", + "\n", + "![img](./08_Neuronowy_ngramowy_model/trigram1.drawio.png \"Diagram prostego bigramowego neuronowego modelu języka\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Rozbicie macierzy $C$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zamiast mnożyć macierz $C$ przez konkatenację dwóch wektorów, można\n", + "rozbić macierz $C$ na dwie, powiedzmy $C_{-2}$ i $C_{-1}$, przemnażać\n", + "je osobno przez odpowiadające im wektory i następnie **dodać** macierze,\n", + "tak aby:\n", + "\n", + "$$C[E(w_{i-2}),E(w_{i-1})] = C_{-2}E(w_{i-2}) + C_{-1}E(w_{i-1}).$$\n", + "\n", + "Macierze $C_{-2}$ i $C_{-1}$ będą miały rozmiar $|V| \\times m$.\n", + "\n", + "Przy tym podejściu możemy powiedzieć, że ostatni i przedostatni wyraz\n", + "mają swoje osobne macierze o potencjalnie różnych wagach — co ma sens,\n", + "jako że na inne aspekty zwracamy uwagę przewidując kolejne słowo na\n", + "podstawie wyrazu bezpośrednio poprzedzającego, a na inne — na\n", + "podstawie słowa występującego dwie pozycje wcześniej.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Uogólnienie na $n$-gramowy model języka dla dowolnego $n$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Łatwo uogólnić opisany wyżej trigramowy model języka dla dowolnego $n$.\n", + "Uogólniony model można przedstawić za pomocą wzoru:\n", + "\n", + "$$\\vec{y} = \\operatorname{softmax}(C[E(w_{i-n+1}),\\dots,E(w_{i-1})]),$$\n", + "\n", + "gdzie macierz $C$ ma rozmiar $|V| \\times nm$ lub za pomocą wzoru:\n", + "\n", + "$$\\vec{y} = \\operatorname{softmax}(C_{-(n-1)}E(w_{i-n+1}) + \\dots + C_{-1}E(w_{i-1}),$$\n", + "\n", + "gdzie macierze $C_{-(n-1)}$, …, $C_{-1}$ mają rozmiary $|V| \\times m$.\n", + "\n", + "Por. diagram:\n", + "\n", + "![img](./08_Neuronowy_ngramowy_model/ngram.drawio.png \"Diagram prostego n-gramowego neuronowego modelu języka\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dodanie kolejnej warstwy\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "W wypadku trigramowego czy — ogólniej — n-gramowego modelu języka dla\n", + "$n \\geq 3$ warto dodać kolejną (**ukrytą**) warstwę, na którą będziemy rzutować\n", + "skonkatenowane embeddingi, zanim zrzutujemy je do długiego wektora\n", + "prawdopodobieństw.\n", + "\n", + "Zakładamy, że warstwa ukryta zawiera $h$ neuronów. Wartość $h$ powinna być mniejsza\n", + "niż $nm$ (a może nawet od $m$).\n", + "\n", + "**Pytanie**: Dlaczego wartość $h > nm$ nie jest racjonalnym wyborem?\n", + "\n", + "**Pytanie**: Dlaczego dodanie kolejnej warstwy nie ma sensu dla modelu bigramowego?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Funkcja aktywacji\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Aby warstwa ukryta wnosiła coś nowego, na wyjściu z tej funkcji musimy (dlaczego?)\n", + "zastosować nieliniową **funkcji aktywacji**. Zazwyczaj jako funkcji\n", + "aktywacji w sieciach neuronowych używa się funkcji ReLU albo funkcji\n", + "sigmoidalnej. W prostych neuronowych modelach języka sprawdza się też\n", + "**tangens hiperboliczny** (tgh, w literaturze anglojęzycznej tanh):\n", + "\n", + "$$\\operatorname{tgh}(x) = \\frac{e^x - e^{-x}}{e^x + e^{-x}}.$$\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import torch\n", + "import torch.nn as nn\n", + "\n", + "x = torch.linspace(-5,5,100)\n", + "plt.xlabel(\"x\")\n", + "plt.ylabel(\"y\")\n", + "a = torch.Tensor(x.size()[0]).fill_(2.)\n", + "m = torch.stack([x, a])\n", + "plt.plot(x, nn.functional.tanh(m)[0])\n", + "fname = '08_Neuronowy_ngramowy_model/tanh.png'\n", + "plt.savefig(fname)\n", + "fname" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Tangens hiperboliczny zastosowany dla wektora\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tangens hiperboliczny wektora będzie po prostu wektorem tangensów\n", + "hiperbolicznych poszczególnych wartości.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "\n", + "v = torch.Tensor([-100, -2.0, 0.0, 0.5, 1000.0])\n", + "nn.functional.tanh(v)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[[[tensor](tensor)([-1.0000, -0.9640, 0.0000, 0.4621, 1.0000])]]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Wzór i schemat dwuwarstwowego n-gramowego neuronowego modelu języka\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Dwuwarstwowy model języka będzie określony następującym wzorem:\n", + "\n", + "$$\\vec{y} = \\operatorname{softmax}(C\\operatorname{tgh}(W[E(w_{i-n+1}),\\dots,E(w_{i-1})])),$$\n", + "\n", + "gdzie:\n", + "\n", + "- $W$ jest wyuczalną macierzą wag o rozmiarze $h \\times nm$,\n", + "- $C$ będzie macierzą o rozmiarze $|V| \\times h$.\n", + "\n", + "Zmodyfikowaną sieć można przedstawić za pomocą następującego schematu:\n", + "\n", + "![img](./08_Neuronowy_ngramowy_model/ngram-tgh.drawio.png \"Dwuwarstwowy n-gramowy neuronowy model języka\")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Liczba wag w modelu dwuwarstwowym\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Na wagi w modelu dwuwarstwowym składają się:\n", + "\n", + "- zanurzenia: $m|V|$,\n", + "- wagi warstwy ukrytej: $hnm$,\n", + "- wagi warstwy wyjściowej: $|V|h$,\n", + "\n", + "a zatem łącznie:\n", + "\n", + "$$m|V| + hnm + |V|h$$\n", + "\n", + "Jeśli $h \\approx m$ (co jest realistyczną opcją), wówczas otrzymamy oszacowanie:\n", + "\n", + "$$O(m|V| + nm^2).$$\n", + "\n", + "Zauważmy, że względem $n$ oznacza to bardzo korzystną złożoność\n", + "$O(n)$! Oznacza to, że nasz model może działać dla dużo większych\n", + "wartości $n$ niż tradycyjny, statystyczny n-gramowy model języka (dla którego\n", + "wartości $n > 5$ zazwyczaj nie mają sensu).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Model worka słów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jak stwierdziliśmy przed chwilą, dwuwarstwowy n-gramowy model języka\n", + "może działać dla stosunkowo dużego $n$. Zauważmy jednak, że istnieje\n", + "pewna słabość tego modelu. Otóż o ile intuicyjnie ma sens odróżniać\n", + "słowo poprzedzające, słowo występujące dwie pozycje wstecz i zapewne\n", + "trzy pozycje wstecz, a zatem uczyć się osobnych macierzy $C_{-1}$,\n", + "$C_{-2}$, $C_{-3}$ to różnica między wpływem słowa\n", + "występującego cztery pozycje wstecz i pięć pozycji wstecz jest już\n", + "raczej nieistotna; innymi słowy różnica między macierzami $C_{-4}$ i\n", + "$C_{-5}$ będzie raczej niewielka i sieć niepotrzebnie będzie uczyła\n", + "się dwukrotnie podobnych wag. Im dalej wstecz, tym różnica wpływu\n", + "będzie jeszcze mniej istotna, można np. przypuszczać, że różnica\n", + "między $C_{-10}$ i $C_{-13}$ nie powinna być duża.\n", + "\n", + "Spróbujmy najpierw zaproponować radykalne podejście, w którym nie\n", + "będziemy w ogóle uwzględniać pozycji słów (lub będziemy je uwzględniać\n", + "w niewielkim stopniu), później połączymy to z omówionym wcześniej\n", + "modelem $n$-gramowym.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Agregacja wektorów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zamiast patrzeć na kilka poprzedzających słów, można przewidywać na\n", + "podstawie **całego** ciągu słów poprzedzających odgadywane słowo. Zauważmy jednak, że\n", + "sieć neuronowa musi mieć ustaloną strukturę, nie możemy zmieniać jej\n", + "rozmiaru. Musimy zatem najpierw zagregować cały ciąg do wektora o\n", + "**stałej** długości. Potrzebujemy zatem pewnej funkcji agregującej $A$, takiej by\n", + "$A(w_1,\\dots,w_{i-1})$ było wektorem o stałej długości, niezależnie od $i$.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Worek słów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Najprostszą funkcją agregującą jest po prostu… suma. Dodajemy po\n", + "prostu zanurzenia słów:\n", + "\n", + "$$A(w_1,\\dots,w_{i-1}) = E(w_1) + \\dots + E(w_{i-1}) = \\sum_{j=1}^{i-1} E(w_j).$$\n", + "\n", + "**Uwaga**: zanurzenia słów nie zależą od pozycji słowa (podobnie było w wypadku n-gramowego modelu!).\n", + "\n", + "Jeśli rozmiar zanurzenia (embeddingu) wynosi $m$, wówczas rozmiar\n", + "wektora uzyskanego dla całego poprzedzającego tekstu wynosi również $m$.\n", + "\n", + "Proste dodawanie wydaje się bardzo „prostacką” metodą, a jednak\n", + "suma wektorów słów jest **zaskakująco skuteczną metodą zanurzenia\n", + "(embedowania) całych tekstów (doc2vec)**. Prostym wariantem dodawania jest obliczanie **średniej wektorów**:\n", + "\n", + "$$A(w_1,\\dots,w_{i-1}) = \\frac{E(w_1) + \\dots + E(w_{i-1})}{i-1} = \\frac{\\sum_{j=1}^{i-1} E(w_j)}{i-1}.$$\n", + "\n", + "Tak czy siak uzyskany wektor **nie zależy od kolejności słów**\n", + "(dodawanie jest przemienne i łączne!). Mówimy więc o **worku słów**\n", + "(*bag of words*, *BoW*) — co ma symbolizować fakt, że słowa są\n", + "przemieszane, niczym produkty w torbie na zakupy.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Schemat graficzny modelu typu worek słów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Po zanurzeniu całego poprzedzającego tekstu postępujemy podobnie jak w\n", + "modelu bigramowym — rzutujemy embedding na długi wektor wartości, na\n", + "którym stosujemy funkcję softmax:\n", + "\n", + "![img](./08_Neuronowy_ngramowy_model/bow1.drawio.png \"Model typu worek słów\")\n", + "\n", + "Odpowiada to wzorowi:\n", + "\n", + "$$y = \\operatorname{softmax}(C\\sum_{j=1}^{i-1} E(w_j)).$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Jak traktować powtarzające się słowa?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Według wzoru podanego wyżej, jeśli słowo w poprzedzającym tekście\n", + "pojawia się więcej niż raz, jego embedding zostanie zsumowany odpowiednią liczbę razy.\n", + "Na przykład embedding tekstu *to be or not to be* będzie wynosił:\n", + "\n", + "$$E(\\mathrm{to}) + E(\\mathrm{be}) + E(\\mathrm{or}) + E(\\mathrm{not}) + E(\\mathrm{to}) + E(\\mathrm{be}) = 2E(\\mathrm{to}) + 2E(\\mathrm{be}) + E(\\mathrm{or}) + E(\\mathrm{not}).$$\n", + "\n", + "Innymi słowy, choć w worku słów nie uwzględniamy kolejności słów, to\n", + "**liczba wystąpień** ma dla nas ciągle znaczenie. Można powiedzieć, że\n", + "traktujemy poprzedzający tekst jako **multizbiór** (struktura\n", + "matematyczna, w której nie uwzględnia się kolejności, choć zachowana\n", + "jest informacja o liczbie wystąpień).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Zbiór słów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Oczywiście moglibyśmy przy agregowaniu zanurzeń pomijać powtarzające\n", + "się słowa, a zatem zamiast multizbioru słów rozpatrywać po prostu ich zbiór:\n", + "\n", + "$$A(w_1,\\dots,w_{i-1}) = \\sum_{w \\in \\{w_1,\\dots,w_{i-1}\\}} E(w).$$\n", + "\n", + "Jest kwestią dyskusyjną, czy to lepsze czy gorsze podejście — w końcu\n", + "liczba wystąpień np. słów *Ukraina* czy *Polska* może wpływać w jakimś\n", + "stopniu na prawdopodobieństwo kolejnego słowa (*Kijów* czy\n", + "*Warszawa*?).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Worek słów a wektoryzacja tf\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wzór na sumę zanurzeń słów można przekształcić w taki sposób, by\n", + "sumować po wszystkich słowach ze słownika, zamiast po słowach rzeczywiście występujących w tekście:\n", + "\n", + "$$A(w_1,\\dots,w_{i-1}) = \\sum_{j=1}^{i-1} E(w_j) = \\sum_{w \\in V} \\#wE(w)$$\n", + "\n", + "gdzie $\\#w$ to liczba wystąpień słowa $w$ w ciagu $w_1,\\dots,w_{i-1}$ (w wielu przypadkach równa zero!).\n", + "\n", + "Jeśli teraz zanurzenia będziemy reprezentować jako macierz $E$ (por. poprzedni wykład),\n", + "wówczas sumę można przedstawić jako iloczyn macierzy $E$ i pewnego wektora:\n", + "\n", + "$$A(w_1,\\dots,w_{i-1}) = E(w) [\\#w^1,\\dots,\\#w^{|V|}]^T.$$\n", + "\n", + "(Odróżniamy $w^i$ jako $i$-ty wyraz w słowniku $V$ od $w_i$ jako $i$-tego wyraz w rozpatrywanym ciągu).\n", + "\n", + "Zwróćmy uwagę, że wektor $[\\#w_1,\\dots,\\#w_{|V|}]$ to po prostu\n", + "reprezentacja wektora poprzedzającego tekstu (tj. ciągu\n", + "$(w_1,\\dots,w_{i-1})$) przy użyciu schematu wektoryzacji tf (*term\n", + "frequency*). Przypomnijmy, że tf to reprezentacja tekstu przy użyciu\n", + "wektorów o rozmiarze $|V|$ — na każdej pozycji odnotowujemy liczbę wystąpień.\n", + "Wektory tf są **rzadkie**, tj. na wielu pozycjach zawierają zera.\n", + "\n", + "Innymi słowy, nasz model języka *bag of words* można przedstawić za pomocą wzoru:\n", + "\n", + "$$y = \\operatorname{softmax}(C\\operatorname{tf}(w_1,\\dots,w_{i-1})),$$\n", + "\n", + "co można zilustrować w następujący sposób:\n", + "\n", + "![img](./08_Neuronowy_ngramowy_model/bow2.drawio.png \"Model typu worek słów — alternatywna reprezentacja\")\n", + "\n", + "Można stwierdzić, że zanurzenie tekstu przekształca rzadki, długi wektor\n", + "tf w gęsty, krótki wektor.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ważenie słów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Czy wszystkie słowa są tak samo istotne? Rzecz jasna, nie:\n", + "\n", + "- jak już wiemy z naszych rozważań dotyczących n-gramowych modeli języka, słowa bezpośrednio\n", + " poprzedzające odgadywany wyraz mają większy wpływ niż słowa wcześniejsze;\n", + " intuicyjnie, wpływ słów stopniowo spada — tym bardziej, im bardziej słowo jest oddalone od słowa odgadywanego;\n", + "- jak wiemy z wyszukiwania informacji, słowa, które występują w wielu tekstach czy dokumentach, powinny mieć\n", + " mniejsze znaczenie, w skrajnym przypadku słowa występujące w prawie każdym tekście (*że*, *w*, *i* itd.) powinny\n", + " być praktycznie pomijane jako *stop words* (jeśli rozpatrywać je w „masie” worka słów — oczywiście\n", + " to, czy słowo poprzedzające odgadywane słowo to *że*, *w* czy *i* ma olbrzymie znaczenie!).\n", + "\n", + "Zamiast po prostu dodawać zanurzenia, można operować na sumie (bądź średniej) ważonej:\n", + "\n", + "$$\\sum_{j=1}^{i-1} \\omega(j, w_j)E(w_j),$$\n", + "\n", + "gdzie $\\omega(j, w_j)$ jest pewną wagą, która może zależeć od pozycji $j$ lub samego słowa $w_j$.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Uwzględnienie pozycji\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Można w pewnym stopniu złamać „workowatość” naszej sieci przez proste\n", + "uwzględnienie pozycji słowa, np. w taki sposób:\n", + "\n", + "$$\\omega(j, w_j) = \\beta^{i-j-1},$$\n", + "\n", + "dla pewnego hiperparametru $\\beta$. Na przykład jeśli $\\beta=0,9$,\n", + "wówczas słowo bezpośrednio poprzedzające dane słowo ma $1 / 0,9^9 \\approx 2,58$\n", + "większy wpływ niż słowo występujące 10 pozycji wstecz.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Odwrócona częstość dokumentowa\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Aby większą wagę przykładać do słów występujących w mniejszej liczbie\n", + "dokumentów, możemy użyć, znanej z wyszukiwania informacji,\n", + "odwrotnej częstości dokumentowej (*inverted document frequency*, *idf*):\n", + "\n", + "$$\\omega(j, w_j) = \\operatorname{idf}_S(w_j) = \\operatorname{log}\\frac{|S|}{\\operatorname{df}_S(w_j)},$$\n", + "\n", + "gdzie:\n", + "\n", + "- $S$ jest pewną kolekcją dokumentów czy tekstów, z którego pochodzi przedmiotowy ciąg słów,\n", + "- $\\operatorname{df}_S(w)$ to częstość dokumentowa słowa $w$ w kolekcji $S$, tzn. odpowiedź na pytanie,\n", + " w ilu dokumentach występuje $w$.\n", + "\n", + "Rzecz jasna, ten sposób ważenia oznacza tak naprawdę zastosowanie wektoryzacji tf-idf zamiast tf,\n", + "nasza sieć będzie dana zatem wzorem:\n", + "\n", + "$$y = \\operatorname{softmax}(C\\operatorname{tfidf}(w_1,\\dots,w_{i-1})).$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Bardziej skomplikowane sposoby ważenia słów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Można oczywiście połączyć odwrotną częstość dokumentową z uwzględnieniem pozycji słowa:\n", + "\n", + "$$\\omega(j, w_j) = \\beta^{i-j-1}\\operatorname{idf}_S(w_j).$$\n", + "\n", + "**Uwaga**: „wagi” $\\omega(j, w_j)$ nie są tak naprawdę wyuczalnymi\n", + "wagami (parametrami) naszej sieci neuronowej, terminologia może być\n", + "tutaj myląca. Z punktu widzenia sieci neuronowej $\\omega(j, w_j)$ są\n", + "stałe i **nie** są optymalizowane w procesie propagacji wstecznej. Innymi\n", + "słowy, tak zdefiniowane $\\omega(j, w_j)$ zależą tylko od:\n", + "\n", + "- hiperparametru $\\beta$, który może być optymalizowany już poza siecią (w procesie **hiperoptymalizacji**),\n", + "- wartości $\\operatorname{idf}_S(w_j)$ wyliczanych wcześniej na podstawie kolekcji $S$.\n", + "\n", + "**Pytanie**: czy wagi $\\omega(j, w_j)$ mogłyby sensownie uwzględniać\n", + "jakieś parametry wyuczalne z całą siecią?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modelowanie języka przy użyciu bardziej złożonych neuronowych sieci *feed-forward*\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Można połączyć zalety obu ogólnych podejść (n-gramowego modelu i worka\n", + "słów) — można **równocześnie** traktować w specjalny sposób (na\n", + "przykład) dwa poprzedzające wyrazy, wszystkie zaś inne wyrazy\n", + "reprezentować jako „tło” modelowane za pomocą worka słów lub podobnej\n", + "reprezentacji. Osiągamy to poprzez konkatenację wektora\n", + "poprzedzającego słowa, słowa występującego dwie pozycje wstecz oraz\n", + "zagregowanego zanurzenia całego wcześniejszego tekstu:\n", + "\n", + "$$y = \\operatorname{softmax}(C[E(w_{i-1}),E(w_{i-2}),A(w_1,\\dots,w_{i-3})]),$$\n", + "\n", + "czy lepiej z dodatkową warstwą ukrytą:\n", + "\n", + "$$y = \\operatorname{softmax}(C\\operatorname{tgh}(W[E(w_{i-1}),E(w_{i-2}),A(w_1,\\dots,w_{i-3})])),$$\n", + "\n", + "W tak uzyskanym dwuwarstwowym neuronowym modelu języka, łączącym model\n", + "trigramowy z workiem słów, macierz $W$ ma rozmiar $h \\times 3m$.\n", + "\n", + "**Pytanie**: jakie mamy możliwości, jeśli zamiast przewidywać kolejne słowo, mamy za zadanie\n", + "odgadywać słowo w luce (jak w wyzwaniach typu *word gap*)?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Literatura\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Skuteczny n-gramowy neuronowy model języka opisano po raz pierwszy\n", + "w pracy [A Neural Probabilistic Language Model](https://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf) autorstwa Yoshua Bengio i in.\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.2" + }, + "org": null + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/wyk/08_Neuronowy_ngramowy_model.pdf b/wyk/08_Neuronowy_ngramowy_model.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c997ccd8753779a62bd79de25331b95ec8d80761 GIT binary patch literal 298242 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�RLp^ALnC|LaC_Wq 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 Date: Sat, 14 May 2022 14:32:50 +0200 Subject: [PATCH 2/3] Atencja --- wyk/10_Atencja.ipynb | 1 + wyk/10_Atencja.org | 87 +++++++++++++++++++++ wyk/10_Atencja/simple-attention.drawio | 1 + wyk/10_Atencja/simple-attention.drawio.png | Bin 0 -> 79930 bytes 4 files changed, 89 insertions(+) create mode 100644 wyk/10_Atencja.ipynb create mode 100644 wyk/10_Atencja.org create mode 100644 wyk/10_Atencja/simple-attention.drawio create mode 100644 wyk/10_Atencja/simple-attention.drawio.png diff --git a/wyk/10_Atencja.ipynb b/wyk/10_Atencja.ipynb new file mode 100644 index 0000000..0f8a603 --- /dev/null +++ b/wyk/10_Atencja.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","metadata":{},"source":["## Atencja\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Sieci LSTM w roku 2017/2018 zostały wyparte przez nową, pod pewnymi\nwzględami prostszą, architekturę Transformer. Sieci Transformer oparte\nsą zasadniczo na prostej idei **atencji** (*attention*), pierwszy\nartykuł wprowadzający sieci Transformer nosił nawet tytuł\n[Attention Is All You Need]([https://arxiv.org/abs/1706.03762](https://arxiv.org/abs/1706.03762)).\n\nIntuicyjnie, atencja jest rodzajem uwagi, którą sieć może selektywnie\nkierować na wybrane miejsca (w modelowaniu języka: wybrane wyrazy).\n\nIdea atencji jest jednak wcześniejsza, powstała jako ulepszenie sieci\nrekurencyjnych. My omówimy ją jednak na jeszcze prostszym przykładzie\nużycia w modelowaniu języka za pomocą hybrydy modelu\nbigramowego i modelu worka słów.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Prosty przykład zastosowania atencji\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Wróćmy do naszego przykładu z Wykładu 8, w którym łączyliśmy $n$-gramowy\nmodel języka z workiem słów. Przyjmijmy bigramowy model języka ($n=2$), wówczas:\n\n$$y = \\operatorname{softmax}(C[E(w_{i-1}),A(w_1,\\dots,w_{i-2})]),$$\n\ngdzie $A$ była prostą agregacją (np. sumą albo średnią) embeddingów\n$E(w_1),\\dots,E(w_{i-2})$. Aby wyjść z prostego nieuporządkowanego\nmodelu worka słów, próbowaliśmy w prosty sposób uwzględnić pozycję\nwyrazów czy ich istotność (za pomocą odwrotnej częstości\ndokumentowej). Oba te sposoby niestety zupełnie nie uwzględniają kontekstu.\n\nInnymi słowy, chcielibyśmy mieć sumę ważoną zanurzeń:\n\n$$A(w_1,\\dots,j) = \\omega_1 E(w_1) + \\dots \\omega_j E(w_j) = \\sum_{k=1}^j \\omega_k E(w_k),$$\n\ntak by $\\omega_k$ w sposób bardziej zasadniczy zależały od lokalnego kontekstu, a\nnie tylko od pozycji $k$ czy słowa $w_k$. W naszym prostym przypadku\njako kontekst możemy rozpatrywać słowo bezpośrednio poprzedzające\nodgadywane słowa (kontekstem jest $w_{i-1}$).\n\nWygodnie również przyjąć, że $\\sum_{k=1}^j \\omega_k = 1$, wówczas mamy do czynienia ze średnią ważoną.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Nieznormalizowane wagi atencji\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Będziemy liczyć nieznormalizowane ****wagi atencji****\n$\\hat{\\alpha}_{k,j}$. Określają one, jak bardzo słowo $w_j$ „zwraca\nuwagę” na poszczególne, inne słowa. Innymi słowy, wagi je opisują, jak\nbardzo słowo $w_k$ pasuje do naszego kontekstu, czyli słowa $w_j$.\n\nNajprostszy sposób mierzenia dopasowania to po prostu iloczyn skalarn:\n\n$$\\hat{\\alpha}_{k,j} = E(w_k)E(w_j),$$\n\nmożna też alternatywnie złamać symetrię iloczynu skalarnego i\nwyliczać dopasowanie za pomocą prostej sieci feed-forward:\n\n$$\\hat{\\alpha}_{k,j} =\n\\vec{v}\\operatorname{tanh}(W_{\\alpha}[E(w_k),E(w_j)] +\n\\vec{b_{\\alpha}}).$$\n\nW drugim przypadku pojawiają się dodatkowe wyuczalne paramatery: macierz $W_{\\alpha}$, wektory\n$\\vec{b_{\\alpha}}$ i $\\vec{v}$.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Normalizacja wag atencji\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Jak już wspomniano, dobrze żeby wagi atencji sumowały się do 1. W tym celu możemy po prostu zastosować\nfunkcję softmax:\n\n$$\\alpha_{k,j} = \\operatorname{softmax}([\\hat{\\alpha}_{1,j},\\dots,\\hat{\\alpha}_{j-1,j}]).$$\n\nZauważmy jednak, że otrzymanego z funkcji softmax wektora\n$[\\alpha_{1,j},\\dots,\\alpha_{j-1,j}]$ tym razem nie interpretujemy jako rozkład prawdopodobieństwa.\nJest to raczej rozkład uwagi, atencji słowa $w_j$ względem innych słów.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Użycie wag atencji w prostym neuronowym modelu języka\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Teraz jako wagi $\\omega$ w naszym modelu języka możemy przyjąć:\n\n$$\\omega_k = \\alpha_{k,i-1}.$$\n\nOznacza to, że z naszego worka będziemy „wyjmowali” słowa w sposób\nselektywny w zależności od wyrazu, który bezpośrednio poprzedza\nsłowo odgadywane.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Diagram\n\n"]},{"cell_type":"markdown","metadata":{},"source":["![img](./10_Atencja/simple-attention.drawio.png \"Atencja użyta w prostym neuronowym modelu języka\")\n\n"]}],"metadata":{"org":null,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":0} \ No newline at end of file diff --git a/wyk/10_Atencja.org b/wyk/10_Atencja.org new file mode 100644 index 0000000..dde1008 --- /dev/null +++ b/wyk/10_Atencja.org @@ -0,0 +1,87 @@ + +* Atencja + +Sieci LSTM w roku 2017/2018 zostały wyparte przez nową, pod pewnymi +względami prostszą, architekturę Transformer. Sieci Transformer oparte +są zasadniczo na prostej idei *atencji* (/attention/), pierwszy +artykuł wprowadzający sieci Transformer nosił nawet tytuł +[Attention Is All You Need](https://arxiv.org/abs/1706.03762). + +Intuicyjnie, atencja jest rodzajem uwagi, którą sieć może selektywnie +kierować na wybrane miejsca (w modelowaniu języka: wybrane wyrazy). + +Idea atencji jest jednak wcześniejsza, powstała jako ulepszenie sieci +rekurencyjnych. My omówimy ją jednak na jeszcze prostszym przykładzie +użycia w modelowaniu języka za pomocą hybrydy modelu +bigramowego i modelu worka słów. + +** Prosty przykład zastosowania atencji + +Wróćmy do naszego przykładu z Wykładu 8, w którym łączyliśmy $n$-gramowy +model języka z workiem słów. Przyjmijmy bigramowy model języka ($n=2$), wówczas: + +$$y = \operatorname{softmax}(C[E(w_{i-1}),A(w_1,\dots,w_{i-2})]),$$ + +gdzie $A$ była prostą agregacją (np. sumą albo średnią) embeddingów +$E(w_1),\dots,E(w_{i-2})$. Aby wyjść z prostego nieuporządkowanego +modelu worka słów, próbowaliśmy w prosty sposób uwzględnić pozycję +wyrazów czy ich istotność (za pomocą odwrotnej częstości +dokumentowej). Oba te sposoby niestety zupełnie nie uwzględniają kontekstu. + +Innymi słowy, chcielibyśmy mieć sumę ważoną zanurzeń: + +$$A(w_1,\dots,j) = \omega_1 E(w_1) + \dots \omega_j E(w_j) = \sum_{k=1}^j \omega_k E(w_k),$$ + +tak by $\omega_k$ w sposób bardziej zasadniczy zależały od lokalnego kontekstu, a +nie tylko od pozycji $k$ czy słowa $w_k$. W naszym prostym przypadku +jako kontekst możemy rozpatrywać słowo bezpośrednio poprzedzające +odgadywane słowa (kontekstem jest $w_{i-1}$). + +Wygodnie również przyjąć, że $\sum_{k=1}^j \omega_k = 1$, wówczas mamy do czynienia ze średnią ważoną. + +*** Nieznormalizowane wagi atencji + +Będziemy liczyć nieznormalizowane **wagi atencji** +$\hat{\alpha}_{k,j}$. Określają one, jak bardzo słowo $w_j$ „zwraca +uwagę” na poszczególne, inne słowa. Innymi słowy, wagi je opisują, jak +bardzo słowo $w_k$ pasuje do naszego kontekstu, czyli słowa $w_j$. + +Najprostszy sposób mierzenia dopasowania to po prostu iloczyn skalarn: + +$$\hat{\alpha}_{k,j} = E(w_k)E(w_j),$$ + +można też alternatywnie złamać symetrię iloczynu skalarnego i +wyliczać dopasowanie za pomocą prostej sieci feed-forward: + +$$\hat{\alpha}_{k,j} = +\vec{v}\operatorname{tanh}(W_{\alpha}[E(w_k),E(w_j)] + +\vec{b_{\alpha}}).$$ + +W drugim przypadku pojawiają się dodatkowe wyuczalne paramatery: macierz $W_{\alpha}$, wektory +$\vec{b_{\alpha}}$ i $\vec{v}$. + +*** Normalizacja wag atencji + +Jak już wspomniano, dobrze żeby wagi atencji sumowały się do 1. W tym celu możemy po prostu zastosować +funkcję softmax: + +$$\alpha_{k,j} = \operatorname{softmax}([\hat{\alpha}_{1,j},\dots,\hat{\alpha}_{j-1,j}]).$$ + +Zauważmy jednak, że otrzymanego z funkcji softmax wektora +$[\alpha_{1,j},\dots,\alpha_{j-1,j}]$ tym razem nie interpretujemy jako rozkład prawdopodobieństwa. +Jest to raczej rozkład uwagi, atencji słowa $w_j$ względem innych słów. + +*** Użycie wag atencji w prostym neuronowym modelu języka + +Teraz jako wagi $\omega$ w naszym modelu języka możemy przyjąć: + +$$\omega_k = \alpha_{k,i-1}.$$ + +Oznacza to, że z naszego worka będziemy „wyjmowali” słowa w sposób +selektywny w zależności od wyrazu, który bezpośrednio poprzedza +słowo odgadywane. + +*** Diagram + +#+CAPTION: Atencja użyta w prostym neuronowym modelu języka +[[./10_Atencja/simple-attention.drawio.png]] diff --git a/wyk/10_Atencja/simple-attention.drawio b/wyk/10_Atencja/simple-attention.drawio new file mode 100644 index 0000000..76a6105 --- /dev/null +++ b/wyk/10_Atencja/simple-attention.drawio @@ -0,0 +1 @@ +7V3Ze6JIEP9rfDSfNKePozlmdpO5sjs7mZf5GCFKRNpBHDV//TYCCnQDrRwFSV4SKJqrzl9VF21PHC+2N66+nN1hw7R7aGBse+JlDyFBVTTyz6fsQooylALK1LWMkHYk3FvPZkgchNS1ZZirxEAPY9uzlkniBDuOOfESNN118SY57BHbybsu9alJEe4nuk1T/7MMbxZQNaQe6e9NazqL7kxeMDiy0KPB4SVWM93Am4C0fznxqieOXYy9YGuxHZu2z72ILwEHrjOOHh7MNR2P54Qvn+42n27m85vbD87X39dTT9Bu++HDrrxd9MKmQd4/3MWuN8NT7Oj21ZE6cvHaMUz/qgOydxxzi/GSEAVCfDI9bxcKU197mJBm3sIOj5pby/vun34hh3sP4cX87cttfGcX7tBvG7EVr92JmfOKSqg1ujs1vZxxoab67x+7QcjLGxMvTM/dkQGuaeue9SepH3qoZtPDuKMkyEYojBMEEz71H91eh3eiJHWUg8/UzczyzPulvufFhlhjkueZ/Ptjup65zX3j8GhfiIwyNOa+JIWEzdE0JC2kzWJmIQ5qYpMgdUWBCd/dXewkf/chup6/czxtv1de8TVOxRfEVmm+1gXNl+E1f8Dgk2KT244ssjH1N2yM5/31MqKT+xwOUTwlrPCSjFt5Lp6bY2xjl1Ac7Pi282jZdoqk29bUIbsTwmCT0Ec+Yy0SQt+FBxaWYewNjyWppDFWICxFSsoKDWlRKY1KClGSWuFHb6FvX64Q6FDBkIIwaFQMYqbBGNafyC5c/DzvjeWehnTDZ4Krbwy8xL8sc0+VVt5G9/Gs7f+d6z5xNDbMKe758ItEI2nz0/K35bHlkP/fAmLMBGM3Y9w/Iv1y05T0qS9VdfqCSiJkQnmUAa08aCjXozyPT3fztfTxs/jj4+N36Vb6130e9JEGijPiKOOAOQpwxgFYxM4qxBkpDFAIPCZYe7r+Mny4tv6aDb/J6GphjPoiDTyYTNVKwoz9qe9cV9/FBiyx5Xir2JU/+4Sjeskpz4TUVNqUGi8OtXLjpUFK+4InPuri4dXPV09ReFPPytVTULugn0Ox1PBGtJNG8J3STr4UrVHdREoXdLM/VPPG16NtqgyqbeeUBNrvC1WpCn2jFQql0gRBTSG44MnC01Ig7jRlyXv/NhUbKCNjZU5iTZkTk0mvt8ZWXUksQ/9VKZXriGkDCEyYMgCeSyE+Wzo5CtB3kvLjQOEZpSMBU29ZNXRGwh0k7T11ZPWFnnqZn7C/1KxbljL0sIGq2eZ+8Ftwl8rD1c3XH/rfWLqW1gzhXVxcvFz+95Vir18X/7GyHInoavQTr+/ej40vlx/eT/oqqNOHc/lxyJQDhZKYiclBuZkYcsACEYZCGl8IOcPNMt9T6Qo84JJ5nigLp9KUqkVeyoRlyoV60xktLNu2lqssRxdjub5aBh0Wj9bWF10t8wQia2KN4fekuvwePf24nrs7zy/3b3Q3LP/blmNhf+ulhiMBUUV4kZWHyDWFJHZBTqBkQ0lgSlixzHjbQ5eQ/isaPsjgVTZjtFScRpzZGZXZVsYWjhy2PFdyBELzapfEK4WsESpgDdMfc035JTIA9FIygFxV4fYDYtIJaMBJAYcDKFmuKcm2Jmo0TM6IdFxvJwirDrDniapu0K0kp1E4EXfRZdLaUVHBJnUXOb9Ykzu6npI9jbkMvNRXBGE5lkkrNi9gzQx4Zwe28DJIptwgq/erCozKfrxBV6ydaY3cAkhmZnkRofZeg3LyQk1AtHww1gKgyuzAagipolzmNIpU2Q8oMXiTCVXnnYWoZ3ljMdcbw2FU9tPSZRdKImeA1CoZ1wRKZT9QZ2qF5WDqGQEvQ1RvOLVFOFVQKdOGBqoZca0tQBW2bbYJoBo596JpI4Exh1BP22G5Rmf6s5K2z7sW2E1BPTc1e9bkvCtbAC0ocveFYYor8MlDxAaA5KEgs4JPHtBJdW7hVSUPKD9Ctix5QKw0ECZ5yGIcWPKAutfY21DykCWqt+ShRckDojvagJOHAhQAnTwg2Ba0BpIH7p4zxOg5q+e7kFISk2A/QzvPQ6OqXTSvUEXejy8CC4MSqngCuOzJ45nu9dQR2dDt5UzvqZd+XwV5tnHHu6tLZZkk+0/iTIHR5tYo0JRoXNlSU63S4njdKLDFnTAXlGVx81ducWLb7K2LDToqWGjkLZYCGyprqu9EQ/VbDl+3qaJUDzi4rYqdmaWs0OQQY528HDwIZnIvKSnklU0071gsm7KfaZeTTWdm+2IxTiHMjQe5i4FyIGQEuv3eZ9O1CNt8/1m1uBkL9+WEHzBpD6ng51jms4PdBQkwz35Zy/9URvdMZ/LU7k9lyuV2SCuOX7UtdcYUjdxFQ4TCmpG0irEmaG1NBl6qVwWJfPzCAe2aiB4z5gvvP13/c/fuOyW06mfvCpfTS6bCjA/7a1u5lM0surzxmqMGXJQALQEKcXfCuyzXYafOhZLYSstbkZBBKxLSaRWJfSHirUDPKNAfvrGBKkLIoIlu16yTt3ghgybI0gkrEsWt89UX81OLREDbpgI6z520TTXfOKs0Mt4qlAIbAukmfS4jeyvEo0Hb7KyDdQy4GDjkNU/YHiG6bEgJufkcOdXv3mclZ402u8pdnC+GKuHJ3FWiIaTqy3SV6BCGPGthrqKwkxZ8yRW6ytmGWhwUmrWMFoEv3sQIzDK4G0dhyxYKaCkKaFZX5pYN6DyfzOpGa7vXotYVhPZa0c9CNqzh8B5I5i2cwsJSGWTVhvwPC+FRaBT72++XD5reyG8psFWItwgJrOn1/LRoOXedmqOE13ylM/lXhRqs8OZRMqgGK13Mo1C6xACOSEB/1iOZR6HWJ1Lcy3fAzjApoN9In5UcN/BTW6VWDoSdzVA7E4daYKQKLwJTEaiRshBYELFGbQxdcjpyMVrImk1LGGvkjOXecOSahmMFS/UHv8yLY91kvbHU02j/+GKm7/pI4RBUsz1mKmKoOnRafVBouLwaZJmX01bCqpVNZNfF2IsduyHvNLvDhumP+B8= \ No newline at end of file diff --git a/wyk/10_Atencja/simple-attention.drawio.png b/wyk/10_Atencja/simple-attention.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..350632717d9cbce5ff57133962f4db65dd424ed1 GIT binary patch literal 79930 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 q@(B{tSX)i)KQ>R~+X}3|BHl=F#S7V-IY Date: Sat, 28 May 2022 14:15:35 +0200 Subject: [PATCH 3/3] Atencja --- wyk/09_Rekurencyjny_model_jezyka.ipynb | 415 ++++++++++++++++++++++++- wyk/10_Atencja.org | 214 ++++++++++++- 2 files changed, 621 insertions(+), 8 deletions(-) diff --git a/wyk/09_Rekurencyjny_model_jezyka.ipynb b/wyk/09_Rekurencyjny_model_jezyka.ipynb index e053d57..2617202 100644 --- a/wyk/09_Rekurencyjny_model_jezyka.ipynb +++ b/wyk/09_Rekurencyjny_model_jezyka.ipynb @@ -1 +1,414 @@ -{"cells":[{"cell_type":"markdown","metadata":{},"source":["## Model języka oparty na rekurencyjnej sieci neuronowej\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Podejście rekurencyjne\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Na poprzednim wykładzie rozpatrywaliśmy różne funkcje\n$A(w_1,\\dots,w_{i-1})$, dzięki którym możliwe było „skompresowanie” ciągu słów\n(a właściwie ich zanurzeń) o dowolnej długości w wektor o stałej długości.\n\nFunkcję $A$ moglibyśmy zdefiniować w inny sposób, w sposób ****rekurencyjny****.\n\nOtóż moglibyśmy zdekomponować funkcję $A$ do\n\n- pewnego stanu początkowego $\\vec{s_0} \\in \\mathcal{R}^p$,\n- pewnej funkcji rekurencyjnej $R : \\mathcal{R}^p \\times \\mathcal{R}^m \\rightarrow \\mathcal{R}^p$.\n\nWówczas funkcję $A$ można będzie zdefiniować rekurencyjnie jako:\n\n$$A(w_1,\\dots,w_t) = R(A(w_1,\\dots,w_{t-1}), E(w_t)),$$\n\nprzy czym dla ciągu pustego:\n\n$$A(\\epsilon) = \\vec{s_0}$$\n\nPrzypomnijmy, że $m$ to rozmiar zanurzenia (embeddingu). Z kolei $p$ to rozmiar wektora stanu\n(często $p=m$, ale nie jest to konieczne).\n\nPrzy takim podejściu rekurencyjnym wprowadzamy niejako „strzałkę\nczasu”, możemy mówić o przetwarzaniu krok po kroku.\n\nW wypadku modelowania języka możemy końcowy wektor stanu zrzutować do wektora o rozmiarze słownika\ni zastosować softmax:\n\n$$\\vec{y} = \\operatorname{softmax}(CA(w_1,\\dots,w_{i-1})),$$\n\ngdzie $C$ jest wyuczalną macierzą o rozmiarze $|V| \\times p$.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Worek słów zdefiniowany rekurencyjnie\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Nietrudno zdefiniować model „worka słów” w taki rekurencyjny sposób:\n\n- $p=m$,\n- $\\vec{s_0} = [0,\\dots,0]$,\n- $R(\\vec{s}, \\vec{x}) = \\vec{s} + \\vec{x}.$\n\nDodawanie (również wektorowe) jest operacją przemienną i łączną, więc\nto rekurencyjne spojrzenie niewiele tu wnosi. Można jednak zastosować\ninną funkcję $R$, która nie jest przemienna — w ten sposób wyjdziemy poza\nnieuporządkowany worek słów.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Związek z programowaniem funkcyjnym\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Zauważmy, że stosowane tutaj podejście jest tożsame z zastosowaniem funkcji typu `fold`\nw językach funkcyjnych:\n\n![img](./09_Rekurencyjny_model_jezyka/fold.png \"Opis funkcji foldl w języku Haskell\")\n\nW Pythonie odpowiednik `fold` jest funkcja `reduce` z pakietu `functools`:\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"18"}],"source":["from functools import reduce\n\ndef product(ns):\n return reduce(lambda a, b: a * b, ns, 1)\n\nproduct([2, 3, 1, 3])"]},{"cell_type":"markdown","metadata":{},"source":["### Sieci rekurencyjne\n\n"]},{"cell_type":"markdown","metadata":{},"source":["W jaki sposób „złamać” przemienność i wprowadzić porządek? Jedną z\nnajprostszych operacji nieprzemiennych jest konkatenacja — możemy\ndokonać konkatenacji wektora stanu i bieżącego stanu, a następnie\nzastosować jakąś prostą operację (na wyjściu musimy mieć wektor o\nrozmiarze $p$, nie $p + m$!), dobrze przy okazji „złamać” też\nliniowość operacji. Możemy po prostu zastosować rzutowanie (mnożenie\nprzez macierz) i jakąś prostą funkcję aktywacji (na przykład sigmoidę):\n\n$$R(\\vec{s}, \\vec{e}) = \\sigma(W[\\vec{s},\\vec{e}] + \\vec{b}).$$\n\nDodatkowo jeszcze wprowadziliśmy wektor obciążeń $\\vec{b}$, a zatem wyuczalne wagi obejmują:\n\n- macierz $W \\in \\mathcal{R}^p \\times \\mathcal{R}^{p+m}$,\n- wektor obciążeń $b \\in \\mathcal{R}^p$.\n\nOlbrzymią zaletą sieci rekurencyjnych jest fakt, że liczba wag nie zależy od rozmiaru wejścia!\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Zwykła sieć rekurencyjna\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Wyżej zdefiniową sieć nazywamy „zwykłą” siecią rekurencyjną (*Vanilla RNN*).\n\n**Uwaga**: przez RNN czasami rozumie się taką „zwykłą” sieć\nrekurencyjną, a czasami szerszą klasę sieci rekurencyjnych\nobejmujących również sieci GRU czy LSTM (zob. poniżej).\n\n![img](./09_Rekurencyjny_model_jezyka/rnn.drawio.png \"Schemat prostego modelu języka opartego na zwykłej sieci rekurencyjnych\")\n\n**Uwaga**: powyższy schemat nie obejmuje już „całego” działania sieci,\n tylko pojedynczy krok czasowy.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Praktyczna niestosowalność prostych sieci RNN\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Niestety w praktyce proste sieci RNN sprawiają duże trudności jeśli\nchodzi o propagację wsteczną — pojawia się zjawisko zanikającego\n(rzadziej: eksplodującego) gradientu. Dlatego zaproponowano różne\nmodyfikacje sieci RNN. Zacznijmy od omówienia stosunkowo prostej sieci GRU.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Sieć GRU\n\n"]},{"cell_type":"markdown","metadata":{},"source":["GRU (*Gated Recurrent Unit*) to sieć z dwiema ****bramkami**** (*gates*):\n\n- bramką resetu (*reset gate*) $\\Gamma_\\gamma \\in \\mathcal{R}^p$ — która określa, w jakim\n stopniu sieć ma pamiętać albo zapominać stan z poprzedniego kroku,\n- bramką aktualizacji (*update gate*) $\\Gamma_u \\in \\mathcal{R}^p$ — która określa wpływ\n bieżącego wyrazu na zmianę stanu.\n\nTak więc w skrajnym przypadku:\n\n- jeśli $\\Gamma_\\gamma = [0,\\dots,0]$, sieć całkowicie zapomina\n informację płynącą z poprzednich wyrazów,\n- jeśli $\\Gamma_u = [0,\\dots,0]$, sieć nie bierze pod uwagę\n bieżącego wyrazu.\n\nZauważmy, że bramki mogą selektywnie, na każdej pozycji wektora stanu,\nsterować przepływem informacji. Na przykład $\\Gamma_\\gamma =\n[0,1,\\dots,1]$ oznacza, że pierwsza pozycja wektora stanu jest\nzapominana, a pozostałe — wnoszą wkład w całości.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Wzory\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Najpierw zdefiniujmy pośredni stan $\\vec{\\xi} \\in \\mathcal{R}^p$:\n\n$$\\vec{\\xi_t} = \\operatorname{tanh}(W_{\\xi}[\\Gamma_\\gamma \\bullet \\vec{s_{t-1}}, E(w_t)] + b_{\\xi}),$$\n\ngdzie $\\bullet$ oznacza iloczyn Hadamarda (nie iloczyn skalarny!) dwóch wektorów:\n\n$$[x_1,\\dots,x_n] \\bullet [y_1,\\dots,y_n] = [x_1 y_1,\\dots,x_n y_n].$$\n\nJak widać, obliczanie $\\vec{\\xi_t}$ bardzo przypomina zwykłą sieć rekurencyjną,\njedyna różnica polega na tym, że za pomocą bramki $\\Gamma_\\gamma$\nmodulujemy wpływ poprzedniego stanu.\n\nOstateczna wartość stanu jest średnią ważoną poprzedniego stanu i bieżącego stanu pośredniego:\n\n$$\\vec{s_t} = \\Gamma_u \\bullet \\vec{\\xi_t} + (1 - \\Gamma_u) \\bullet \\vec{s_{t-1}}.$$\n\nSkąd się biorą bramki $\\Gamma_\\gamma$ i $\\Gamma_u$? Również z poprzedniego stanu i z biężacego wyrazu.\n\n$$\\Gamma_\\gamma = \\sigma(W_\\gamma[\\vec{s_{t-1}},E(w_t)] + \\vec{b_\\gamma}),$$\n\n$$\\Gamma_u = \\sigma(W_u[\\vec{s_{t-1}},E(w_t)] + \\vec{b_u}),$$\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Sieć LSTM\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Architektura LSTM (*Long Short-Term Memory*), choć powstała wcześniej\nniż GRU, jest od niej nieco bardziej skomplikowana.\n\n- zamiast dwóch bramek LSTM zawiera ****trzy bramki****: bramkę wejścia (*input gate*),\n bramkę wyjścia (*output gate*) i bramkę zapominania (*forget gate*),\n- oprócz ukrytego stanu $\\vec{s_t}$ sieć LSTM posiada również ****komórkę pamięci**** (*memory cell*),\n $\\vec{c_t}$, komórka pamięci, w przeciwieństwie do stanu, zmienia się wolniej (intuicyjnie:\n *jeśli nie zrobimy nic specjalnego, wartość komórki pamięci się nie zmieni*).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Wzory\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Komórka pamięci modulowana jest za pomocą bramki zapominania ($\\Gamma_f$) i bramki\nwejścia ($\\Gamma_i$), bramki te określają na ile uwzględniamy, odpowiednio,\npoprzednią wartość komórki pamięci $\\vec{c_{t-1}}$ i wejście, a\nwłaściwie wejście w połączeniu z poprzednim stanem:\n\n$$\\vec{c_t} = \\Gamma_f \\bullet \\vec{c_{t-1}} + \\Gamma_i \\bullet \\vec{\\xi_t},$$\n\ngdzie wektor pomocniczy $\\vec{\\xi_t}$ wyliczany jest w następujący sposób:\n\n$$\\vec{\\xi_t} = \\operatorname{tanh}(W_{\\xi}[\\vec{s_{t-1}}, E(w_t)] + \\vec{b_\\xi}.$$\n\nNowa wartość stanu sieci nie zależy bezpośrednio od poprzedniej wartości stanu, lecz\njest równa komórce pamięci modulowanej bramką wyjścia:\n\n$$\\vec{h_t} = \\Gamma_o \\bullet \\operatorname{tanh}(\\vec{c_t}).$$\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Obliczanie bramek\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Wartości wszystkie trzech bramek są liczone w identyczny sposób (wzory\nróżnią się tylko macierzami wag i wektorem obciążeń):\n\n$$\\Gamma_f = \\sigma(W_f[\\vec{s_{t-1}}, E(w_t)] + \\vec{b_f}),$$\n\n$$\\Gamma_i = \\sigma(W_i[\\vec{s_{t-1}}, E(w_t)] + \\vec{b_i}),$$\n\n$$\\Gamma_o = \\sigma(W_o[\\vec{s_{t-1}}, E(w_t)] + \\vec{b_o}).$$\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Wartości początkowe\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Początkowe wartości stanu i komórki pamięci mogą być ustawione na zero:\n\n$$\\vec{s_0} = \\vec{0},$$\n\n$$\\vec{c_0} = \\vec{0}.$$\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Podsumowanie\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Sieci LSTM dominowały w zagadnieniach przetwarzania języka naturalnego\n(ogólniej: przetwarzania sekwencji) do czasu pojawienia się\narchitektury Transformer w 2017 roku.\n\nNa sieci LSTM oparty był ELMo, jeden z pierwszych dużych\n****pretrenowanych modeli języka****, dostrajanych później pod konkretne\nzadania (na przykład klasyfikację tekstu), zob. artykuł [Deep\ncontextualized word\nrepresentations]([https://arxiv.org/pdf/1802.05365.pdf](https://arxiv.org/pdf/1802.05365.pdf)). Dokładniej\nmówiąc, ELMo był siecią ****BiLSTM****, połączeniem dwóch sieci, jednej\ndziałającej z lewej strony na prawą, drugiej — z prawej do lewej.\n\n"]}],"metadata":{"org":null,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":0} \ No newline at end of file +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model języka oparty na rekurencyjnej sieci neuronowej\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Podejście rekurencyjne\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Na poprzednim wykładzie rozpatrywaliśmy różne funkcje\n", + "$A(w_1,\\dots,w_{i-1})$, dzięki którym możliwe było „skompresowanie” ciągu słów\n", + "(a właściwie ich zanurzeń) o dowolnej długości w wektor o stałej długości.\n", + "\n", + "Funkcję $A$ moglibyśmy zdefiniować w inny sposób, w sposób ****rekurencyjny****.\n", + "\n", + "Otóż moglibyśmy zdekomponować funkcję $A$ do\n", + "\n", + "- pewnego stanu początkowego $\\vec{s_0} \\in \\mathcal{R}^p$,\n", + "- pewnej funkcji rekurencyjnej $R : \\mathcal{R}^p \\times \\mathcal{R}^m \\rightarrow \\mathcal{R}^p$.\n", + "\n", + "Wówczas funkcję $A$ można będzie zdefiniować rekurencyjnie jako:\n", + "\n", + "$$A(w_1,\\dots,w_t) = R(A(w_1,\\dots,w_{t-1}), E(w_t)),$$\n", + "\n", + "przy czym dla ciągu pustego:\n", + "\n", + "$$A(\\epsilon) = \\vec{s_0}$$\n", + "\n", + "Przypomnijmy, że $m$ to rozmiar zanurzenia (embeddingu). Z kolei $p$ to rozmiar wektora stanu\n", + "(często $p=m$, ale nie jest to konieczne).\n", + "\n", + "Przy takim podejściu rekurencyjnym wprowadzamy niejako „strzałkę\n", + "czasu”, możemy mówić o przetwarzaniu krok po kroku.\n", + "\n", + "W wypadku modelowania języka możemy końcowy wektor stanu zrzutować do wektora o rozmiarze słownika\n", + "i zastosować softmax:\n", + "\n", + "$$\\vec{y} = \\operatorname{softmax}(CA(w_1,\\dots,w_{i-1})),$$\n", + "\n", + "gdzie $C$ jest wyuczalną macierzą o rozmiarze $|V| \\times p$.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Worek słów zdefiniowany rekurencyjnie\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nietrudno zdefiniować model „worka słów” w taki rekurencyjny sposób:\n", + "\n", + "- $p=m$,\n", + "- $\\vec{s_0} = [0,\\dots,0]$,\n", + "- $R(\\vec{s}, \\vec{x}) = \\vec{s} + \\vec{x}.$\n", + "\n", + "Dodawanie (również wektorowe) jest operacją przemienną i łączną, więc\n", + "to rekurencyjne spojrzenie niewiele tu wnosi. Można jednak zastosować\n", + "inną funkcję $R$, która nie jest przemienna — w ten sposób wyjdziemy poza\n", + "nieuporządkowany worek słów.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Związek z programowaniem funkcyjnym\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zauważmy, że stosowane tutaj podejście jest tożsame z zastosowaniem funkcji typu `fold`\n", + "w językach funkcyjnych:\n", + "\n", + "![img](./09_Rekurencyjny_model_jezyka/fold.png \"Opis funkcji foldl w języku Haskell\")\n", + "\n", + "W Pythonie odpowiednik `fold` jest funkcja `reduce` z pakietu `functools`:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "18" + ] + } + ], + "source": [ + "from functools import reduce\n", + "\n", + "def product(ns):\n", + " return reduce(lambda a, b: a * b, ns, 1)\n", + "\n", + "product([2, 3, 1, 3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sieci rekurencyjne\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "W jaki sposób „złamać” przemienność i wprowadzić porządek? Jedną z\n", + "najprostszych operacji nieprzemiennych jest konkatenacja — możemy\n", + "dokonać konkatenacji wektora stanu i bieżącego stanu, a następnie\n", + "zastosować jakąś prostą operację (na wyjściu musimy mieć wektor o\n", + "rozmiarze $p$, nie $p + m$!), dobrze przy okazji „złamać” też\n", + "liniowość operacji. Możemy po prostu zastosować rzutowanie (mnożenie\n", + "przez macierz) i jakąś prostą funkcję aktywacji (na przykład sigmoidę):\n", + "\n", + "$$R(\\vec{s}, \\vec{e}) = \\sigma(W[\\vec{s},\\vec{e}] + \\vec{b}).$$\n", + "\n", + "Dodatkowo jeszcze wprowadziliśmy wektor obciążeń $\\vec{b}$, a zatem wyuczalne wagi obejmują:\n", + "\n", + "- macierz $W \\in \\mathcal{R}^p \\times \\mathcal{R}^{p+m}$,\n", + "- wektor obciążeń $b \\in \\mathcal{R}^p$.\n", + "\n", + "Olbrzymią zaletą sieci rekurencyjnych jest fakt, że liczba wag nie zależy od rozmiaru wejścia!\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Zwykła sieć rekurencyjna\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wyżej zdefiniową sieć nazywamy „zwykłą” siecią rekurencyjną (*Vanilla RNN*).\n", + "\n", + "**Uwaga**: przez RNN czasami rozumie się taką „zwykłą” sieć\n", + "rekurencyjną, a czasami szerszą klasę sieci rekurencyjnych\n", + "obejmujących również sieci GRU czy LSTM (zob. poniżej).\n", + "\n", + "![img](./09_Rekurencyjny_model_jezyka/rnn.drawio.png \"Schemat prostego modelu języka opartego na zwykłej sieci rekurencyjnych\")\n", + "\n", + "**Uwaga**: powyższy schemat nie obejmuje już „całego” działania sieci,\n", + " tylko pojedynczy krok czasowy.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Praktyczna niestosowalność prostych sieci RNN\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Niestety w praktyce proste sieci RNN sprawiają duże trudności jeśli\n", + "chodzi o propagację wsteczną — pojawia się zjawisko zanikającego\n", + "(rzadziej: eksplodującego) gradientu. Dlatego zaproponowano różne\n", + "modyfikacje sieci RNN. Zacznijmy od omówienia stosunkowo prostej sieci GRU.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sieć GRU\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "GRU (*Gated Recurrent Unit*) to sieć z dwiema ****bramkami**** (*gates*):\n", + "\n", + "- bramką resetu (*reset gate*) $\\Gamma_\\gamma \\in \\mathcal{R}^p$ — która określa, w jakim\n", + " stopniu sieć ma pamiętać albo zapominać stan z poprzedniego kroku,\n", + "- bramką aktualizacji (*update gate*) $\\Gamma_u \\in \\mathcal{R}^p$ — która określa wpływ\n", + " bieżącego wyrazu na zmianę stanu.\n", + "\n", + "Tak więc w skrajnym przypadku:\n", + "\n", + "- jeśli $\\Gamma_\\gamma = [0,\\dots,0]$, sieć całkowicie zapomina\n", + " informację płynącą z poprzednich wyrazów,\n", + "- jeśli $\\Gamma_u = [0,\\dots,0]$, sieć nie bierze pod uwagę\n", + " bieżącego wyrazu.\n", + "\n", + "Zauważmy, że bramki mogą selektywnie, na każdej pozycji wektora stanu,\n", + "sterować przepływem informacji. Na przykład $\\Gamma_\\gamma =\n", + "[0,1,\\dots,1]$ oznacza, że pierwsza pozycja wektora stanu jest\n", + "zapominana, a pozostałe — wnoszą wkład w całości.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Wzory\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Najpierw zdefiniujmy pośredni stan $\\vec{\\xi} \\in \\mathcal{R}^p$:\n", + "\n", + "$$\\vec{\\xi_t} = \\operatorname{tanh}(W_{\\xi}[\\Gamma_\\gamma \\bullet \\vec{s_{t-1}}, E(w_t)] + b_{\\xi}),$$\n", + "\n", + "gdzie $\\bullet$ oznacza iloczyn Hadamarda (nie iloczyn skalarny!) dwóch wektorów:\n", + "\n", + "$$[x_1,\\dots,x_n] \\bullet [y_1,\\dots,y_n] = [x_1 y_1,\\dots,x_n y_n].$$\n", + "\n", + "Jak widać, obliczanie $\\vec{\\xi_t}$ bardzo przypomina zwykłą sieć rekurencyjną,\n", + "jedyna różnica polega na tym, że za pomocą bramki $\\Gamma_\\gamma$\n", + "modulujemy wpływ poprzedniego stanu.\n", + "\n", + "Ostateczna wartość stanu jest średnią ważoną poprzedniego stanu i bieżącego stanu pośredniego:\n", + "\n", + "$$\\vec{s_t} = \\Gamma_u \\bullet \\vec{\\xi_t} + (1 - \\Gamma_u) \\bullet \\vec{s_{t-1}}.$$\n", + "\n", + "Skąd się biorą bramki $\\Gamma_\\gamma$ i $\\Gamma_u$? Również z poprzedniego stanu i z biężacego wyrazu.\n", + "\n", + "$$\\Gamma_\\gamma = \\sigma(W_\\gamma[\\vec{s_{t-1}},E(w_t)] + \\vec{b_\\gamma}),$$\n", + "\n", + "$$\\Gamma_u = \\sigma(W_u[\\vec{s_{t-1}},E(w_t)] + \\vec{b_u}),$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sieć LSTM\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Architektura LSTM (*Long Short-Term Memory*), choć powstała wcześniej\n", + "niż GRU, jest od niej nieco bardziej skomplikowana.\n", + "\n", + "- zamiast dwóch bramek LSTM zawiera ****trzy bramki****: bramkę wejścia (*input gate*),\n", + " bramkę wyjścia (*output gate*) i bramkę zapominania (*forget gate*),\n", + "- oprócz ukrytego stanu $\\vec{s_t}$ sieć LSTM posiada również ****komórkę pamięci**** (*memory cell*),\n", + " $\\vec{c_t}$, komórka pamięci, w przeciwieństwie do stanu, zmienia się wolniej (intuicyjnie:\n", + " *jeśli nie zrobimy nic specjalnego, wartość komórki pamięci się nie zmieni*).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Wzory\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Komórka pamięci modulowana jest za pomocą bramki zapominania ($\\Gamma_f$) i bramki\n", + "wejścia ($\\Gamma_i$), bramki te określają na ile uwzględniamy, odpowiednio,\n", + "poprzednią wartość komórki pamięci $\\vec{c_{t-1}}$ i wejście, a\n", + "właściwie wejście w połączeniu z poprzednim stanem:\n", + "\n", + "$$\\vec{c_t} = \\Gamma_f \\bullet \\vec{c_{t-1}} + \\Gamma_i \\bullet \\vec{\\xi_t},$$\n", + "\n", + "gdzie wektor pomocniczy $\\vec{\\xi_t}$ wyliczany jest w następujący sposób:\n", + "\n", + "$$\\vec{\\xi_t} = \\operatorname{tanh}(W_{\\xi}[\\vec{s_{t-1}}, E(w_t)] + \\vec{b_\\xi}.$$\n", + "\n", + "Nowa wartość stanu sieci nie zależy bezpośrednio od poprzedniej wartości stanu, lecz\n", + "jest równa komórce pamięci modulowanej bramką wyjścia:\n", + "\n", + "$$\\vec{h_t} = \\Gamma_o \\bullet \\operatorname{tanh}(\\vec{c_t}).$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Obliczanie bramek\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wartości wszystkie trzech bramek są liczone w identyczny sposób (wzory\n", + "różnią się tylko macierzami wag i wektorem obciążeń):\n", + "\n", + "$$\\Gamma_f = \\sigma(W_f[\\vec{s_{t-1}}, E(w_t)] + \\vec{b_f}),$$\n", + "\n", + "$$\\Gamma_i = \\sigma(W_i[\\vec{s_{t-1}}, E(w_t)] + \\vec{b_i}),$$\n", + "\n", + "$$\\Gamma_o = \\sigma(W_o[\\vec{s_{t-1}}, E(w_t)] + \\vec{b_o}).$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Wartości początkowe\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Początkowe wartości stanu i komórki pamięci mogą być ustawione na zero:\n", + "\n", + "$$\\vec{s_0} = \\vec{0},$$\n", + "\n", + "$$\\vec{c_0} = \\vec{0}.$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Podsumowanie\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sieci LSTM dominowały w zagadnieniach przetwarzania języka naturalnego\n", + "(ogólniej: przetwarzania sekwencji) do czasu pojawienia się\n", + "architektury Transformer w 2017 roku.\n", + "\n", + "Na sieci LSTM oparty był ELMo, jeden z pierwszych dużych\n", + "****pretrenowanych modeli języka****, dostrajanych później pod konkretne\n", + "zadania (na przykład klasyfikację tekstu), zob. artykuł [Deep\n", + "contextualized word\n", + "representations]([https://arxiv.org/pdf/1802.05365.pdf](https://arxiv.org/pdf/1802.05365.pdf)). Dokładniej\n", + "mówiąc, ELMo był siecią ****BiLSTM****, połączeniem dwóch sieci, jednej\n", + "działającej z lewej strony na prawą, drugiej — z prawej do lewej.\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.2" + }, + "org": null + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/wyk/10_Atencja.org b/wyk/10_Atencja.org index dde1008..e976b7c 100644 --- a/wyk/10_Atencja.org +++ b/wyk/10_Atencja.org @@ -23,17 +23,17 @@ model języka z workiem słów. Przyjmijmy bigramowy model języka ($n=2$), wów $$y = \operatorname{softmax}(C[E(w_{i-1}),A(w_1,\dots,w_{i-2})]),$$ gdzie $A$ była prostą agregacją (np. sumą albo średnią) embeddingów -$E(w_1),\dots,E(w_{i-2})$. Aby wyjść z prostego nieuporządkowanego +$E(w_1),\dots,E(w_{i-2})$. Aby wyjść z nieuporządkowanego modelu worka słów, próbowaliśmy w prosty sposób uwzględnić pozycję wyrazów czy ich istotność (za pomocą odwrotnej częstości -dokumentowej). Oba te sposoby niestety zupełnie nie uwzględniają kontekstu. +dokumentowej). Oba te sposoby niestety zupełnie nie uwzględniają *kontekstu*. Innymi słowy, chcielibyśmy mieć sumę ważoną zanurzeń: -$$A(w_1,\dots,j) = \omega_1 E(w_1) + \dots \omega_j E(w_j) = \sum_{k=1}^j \omega_k E(w_k),$$ +$$A(w_1,\dots,j) = \omega_1 E(w_1) + \dots + \omega_j E(w_j) = \sum_{k=1}^j \omega_k E(w_k),$$ tak by $\omega_k$ w sposób bardziej zasadniczy zależały od lokalnego kontekstu, a -nie tylko od pozycji $k$ czy słowa $w_k$. W naszym prostym przypadku +nie tylko od pozycji $k$ czy słowa $w_k$. W naszym uproszczonym przypadku jako kontekst możemy rozpatrywać słowo bezpośrednio poprzedzające odgadywane słowa (kontekstem jest $w_{i-1}$). @@ -43,10 +43,10 @@ Wygodnie również przyjąć, że $\sum_{k=1}^j \omega_k = 1$, wówczas mamy do Będziemy liczyć nieznormalizowane **wagi atencji** $\hat{\alpha}_{k,j}$. Określają one, jak bardzo słowo $w_j$ „zwraca -uwagę” na poszczególne, inne słowa. Innymi słowy, wagi je opisują, jak +uwagę” na poszczególne, inne słowa. Innymi słowy, wagi opisują, jak bardzo słowo $w_k$ pasuje do naszego kontekstu, czyli słowa $w_j$. -Najprostszy sposób mierzenia dopasowania to po prostu iloczyn skalarn: +Najprostszy sposób mierzenia dopasowania to po prostu iloczyn skalarny: $$\hat{\alpha}_{k,j} = E(w_k)E(w_j),$$ @@ -78,10 +78,210 @@ Teraz jako wagi $\omega$ w naszym modelu języka możemy przyjąć: $$\omega_k = \alpha_{k,i-1}.$$ Oznacza to, że z naszego worka będziemy „wyjmowali” słowa w sposób -selektywny w zależności od wyrazu, który bezpośrednio poprzedza +selektywny, w zależności od wyrazu, który bezpośrednio poprzedza słowo odgadywane. *** Diagram #+CAPTION: Atencja użyta w prostym neuronowym modelu języka [[./10_Atencja/simple-attention.drawio.png]] + +** Atencja jako „miękka” baza danych + +O atencji można myśleć metaforycznie jako o odpytywaniu „miękkiej”, wektorowej +bazy danych. Możemy sobie wyobrazić, że słowa $w_1,\dots,w_{j-1}$ są +naszą bazą danych, a słowo $w_j$ (z którego kierujemy „snop” uwagi) +jest *zapytaniem* (/query/). To zapytanie dopasowujemy do *kluczy* +(/keys/), w najprostszym ujęciu po prostu słów $w_1,\dots,w_{j-1}$ (a +właściwie ich zanurzeń). Jeśli klucz pasuje do zapytania, odpowiednia +wartość (/value/) jest wydobywana z bazy. Nasza baza jest jednak +„miękka”, nie — zerojedynkowa, zapytanie pasuje klucza w pewnym +stopniu, mniej lub bardziej. + +W najprostszym ujęciu wartości są tym samym co klucze, czyli z naszej +bazy wydobywamy te same zanurzenia słów, których używamy jako kluczy. +Można jednak skomplikować schemat rozróżniając klucze i wartości — +mogą one powstawać przez rzutowanie podstawowe zanurzenia różnymi +macierzami: + +$$\vec{k_i} = W_k E(w_i),$$ + +$$\vec{v_i} = W_v E(w_i).$$ + +Również samo zapytanie może powstać przez rzutowanie: + +$$\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 +$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. + +Teraz nieznormalizowane wagi atencji przyjmą postać: + +$$\hat{\alpha}_{i,j} = \vec{q_i}^T\vec{k_j} = (W_q E(w_i))(W_k E(k_j)).$$ + +Zauważmy, że ciąg $\hat{\alpha}_{1,j},\dots,\hat{\alpha}_{j-1,j}$ można potraktować jako wektor +$\hat{\vec{\alpha}_{*,j}}$ i wyliczać w postaci zwartej: + +$$\hat{\vec{\alpha}_{*,j}} = \vec{k_j}^T K$$ + +gdzie $K$ to macierz kluczy złożona z wektorów +$\vec{k_1},\dots,\vec{k_{j-1}}$, tj. macierz o rozmiarze $d_k \times (j-1)$. + +Wektor znormalizowanych wag atencji będzie miał wówczas postać: + +$$\vec{\alpha}_{*,j} = \operatorname{softmax}(\vec{k_j}^T K).$$ + +Dokonajmy teraz agregacji wartości — obliczeniamy średnią wektorów +wartości (\vec{v_i}) ważoną atencją: + +$$A(w_1,\dots,j-1) = \alpha_{1,j} \vec{v_1} + \dots + \alpha_{j-1,j} \vec{v_{j-1}} = \sum_{i=1}^{j-1} \alpha_{i,j} v_i.$$ + +Jeśli $j-1$ wektorów wartości ułożyłem w macierz $V$ (o rozmiarze +$(j-1) \times d_v$), powyższy wzór będziemy mogli zapisać jako iloczyn wektora wag atencji i macierzy $V$: + +$$A(w_1,\dots,j-1) = \vec{\alpha}_{*,j}^T V = \operatorname{softmax}(\vec{k_j}^T K)^T V.$$ + +Sposób patrzenia na atencję przez pryzmat trójki +zapytania-klucze-wartości okaże się niezwykle ważny w wypadku modelu Transformer (zob. kolejny wykład). + +** Atencja jako składnik sieci rekurencyjnej + +Atencję wprowadzono pierwotnie jako uzupełnienie sieci rekurencyjnej. +Potrzeba ta pojawiła się na początku rozwoju *neuronowego tłumaczenia +maszynowego* (/neural machine translation/, /NMT/), czyli tłumaczenia +maszynowego (automatycznego) realizowanego za pomocą sieci neuronowych. + +Neuronowe tłumaczenie maszynowe jest właściwie rozszerzeniem idei +modelowania języka na biteksty (teksty równoległe). Omówmy najpierw +podstawy generowania tekstu. + +*** Model języka jako generator + +Jak pamiętamy, model języka $M$ wylicza prawdopodobieństwo tekstu $w_1,\dots,w_N$: + +$$P_M(w_1,\dots,w_N) = ?.$$ + +Zazwyczaj jest to równoważne obliczaniu rozkładu prawdopodobieństwa kolejnego słowa: + +$$P_M(w_j|w_1,\dots,w_{j-1}) = ?.$$ + +Załóżmy, że mamy pewien początek (*prefiks*) tekstu o długości $p$: +$w_1,\dots,w_p$. Powiedzmy, że naszym celem jest *wygenerowanie* +dokończenia czy kontynuacji tego tekstu (nie określamy z góry tej +długości tej kontynuacji). + +Najprostszy sposób wygenerowania pierwszego wyrazu dokończenia polega +na wzięciu wyrazu maksymalizującego prawdopodobieństwo według modelu języka: + +$$w_{p+1} = \operatorname{argmax}_w P_M(w|w_1,\dots,w_p).$$ + +*Pytanie*: Dlaczego \operatorname{argmax}, a nie \operatorname{max}? + +Słowo $w_{p+1}$ możemy dołączyć do prefiksu i powtórzyć procedurę: + +$$w_{p+2} = \operatorname{argmax}_w P_M(w|w_1,\dots,w_p,w_{p+1}),$$ + +i tak dalej. + +*Pytanie*: Kiedy zakończymy procedurę generowania? + +Omawiana procedura jest najprostszym sposobem, czasami nie daje +najlepszego wyniku, na przykład może pojawić się efekt „jąkania” +(model generuje w kółko ten sam wyraz), dlatego opracowano bardziej +wymyślne sposoby generowania w oparciu o modele języka. Omówimy je później. + +*** Zastosowania generatora opartego na modelu języka + +Mogłoby się wydawać, że generator tekstu ma raczej ograniczone +zastosowanie (generowanie fake newsów?). Okazuje się jednak, że +zaskakująco wiele zadań przetwarzania języka naturalnego można +przedstawić jako zadanie generowania tekstu. Przykładem jest tłumaczenie maszynowe. + +*** Tłumaczenie maszynowe jako zadanie generowania tekstu + +W tłumaczeniu maszynowym (tłumaczeniu automatycznym, ang. /machine +translation/) na wejściu podawany jest tekst (na ogół pojedyncze +zdanie) źródłowy (/source sentence/) $S = (u_1,\dots,u_|S|)$, celem +jest uzyskanie tekstu docelowego (/target sentence/) +$T=(w_1,\dots,w_|T|). Zakładamy, że $S$ jest tekstem w pewnym języku +źródłowym (/source language/), zaś $T$ — w innym języku, języku +docelowym (/target language/). + +Współczesne tłumaczenie maszynowe jest oparte na metodach +statystycznych — system uczy się na podstawie obszernego zbioru +odpowiadających sobie zdań w obu językach. Taki zbiór nazywamy +korpusem równoległym (/parallel corpus/). Duży zbiór korpusów +równoległych dla wielu języków można znaleźć na stronie projektu [OPUS](https://opus.nlpl.eu/). +Zobaczmy na przykład fragment EUROPARL (protokoły Parlamentu Europejskiego): + +#+BEGIN_SRC +$ wget 'https://opus.nlpl.eu/download.php?f=Europarl/v8/moses/en-pl.txt.zip' -O en-pl.txt.zip +$ unzip en-pl.txt.zip +$ paste Europarl.en-pl.en Europarl.en-pl.pl | shuf -n 5 +The adoption of these amendments by the Committee on the Environment meant that we could place more emphasis on patients' rights to information, rather than make it an option for the pharmaceutical industries to provide that information. Przyjęcie tych poprawek przez Komisję Ochrony Środowiska Naturalnego oznaczało, że mogliśmy położyć większy nacisk na prawo pacjentów do informacji, zamiast uczynić zeń możliwość, z której branża farmaceutyczna może skorzystać w celu dostarczenia informacji. +I hope that the High Representative - who is not here today - will raise this episode with China and also with Nepal, whose own nascent democracy is kept afloat partly by EU taxpayers' money in the form of financial aid. Mam nadzieję, że nieobecna dzisiaj wysoka przedstawiciel poruszy tę kwestię w rozmowach z Chinami, ale również z Nepalem, którego młoda demokracja funkcjonuje częściowo dzięki finansowej pomocy pochodzącej z pieniędzy podatników w UE. +Immunity and privileges of Renato Brunetta (vote) Wniosek o obronę immunitetu parlamentarnego Renata Brunetty (głosowanie) +The 'new Member States' - actually, the name continues to be sort of conditional, making it easier to distinguish between the 'old' Member States and those that acceded to the EU after two enlargement rounds, owing to their particular historical background and perhaps the fact that they are poorer than the old ones."Nowe państwa członkowskie” - ta nazwa nadal ma w pewnym sensie charakter warunkowy i ułatwia rozróżnienie pomiędzy "starszymi” państwami członkowskimi oraz tymi, które przystąpiły do UE po dwóch rundach rozszerzenia, które wyróżnia ich szczególna historia, a zapewne także fakt, że są uboższe, niż starsze państwa członkowskie. +The number of armed attacks also rose by 200% overall. Także liczba ataków zbrojnych wzrosła łącznie o 200 %. +#+END_SRC + +Zauważmy, że możemy taki tekst modelować po prostu traktując jako +jeden. Innymi słowy, nie modelujemy tekstu angielskiego ani polskiego, +tylko angielsko-polską mieszankę, to znaczy uczymy model, który najpierw modeluje prawdopodobieństwo +po stronie źródłowej (powiedzmy — angielskiej): + +#+BEGIN_SRC +The number of armed attacks also ? +#+END_SRC + +W momencie napotkania specjalnego tokenu końca zdania źródłowego (powiedzmy ~~) model +powinien nauczyć się, że musi przerzucić się na modelowanie tekstu w języku docelowym (powiedzmy — polskim): + +#+BEGIN_SRC +The number of armed attacks also rose by 200% overall.Także liczba ataków ? +#+END_SRC + +W czasie uczenia wykorzystujemy korpus równoległy traktując go po prostu jako zwykły ciągły tekst +(dodajemy tylko specjalne tokeny końca zdania źródłowego i końca zdania docelowego). + +W fazie inferencji (w tłumaczeniu maszynowym tradycyjnie nazywaną +*dekodowaniem*) zamieniamy nasz model języka w generator i podajemy +tłumaczone zdanie jako prefiks, doklejając tylko token ~~. + +**** Neuronowe modele języka jako translatory + +Jako że N-gramowego modelu języka ani modelu opartego na worku słów +nie da się użyć w omawiany sposób w tłumaczeniu maszynowym +(dlaczego?), jako pierwszych użyto w neuronowym tłumaczeniu maszynowym +sieci LSTM, przy użyciu omawianego wyżej sposobu. + +System tłumaczenia oparte na sieciach LSTM działały zaskakująco +dobrze, zważywszy na to, że cała informacja o zdaniu źródłowym musi +zostać skompresowana do wektora o stałym rozmiarze. (Dlaczego? W +momencie osiągnięcia tokenu ~~ cały stan sieci to kombinacja +właściwego stanu $\vec{s_i}$ i komórki pamięci $\vec{c_i}$.) + +Neuronowe tłumaczenie oparte na sieciach LSTM działa względnie dobrze +dla krótkich zdań, dla dłuższych rezultaty są gorsze — po prostu sieć +nie jest w stanie skompresować w wektorze o stałej długości znaczenia +całego zdania. Na początku rozwoju neuronowego tłumaczenia maszynowego +opracowano kilka metod radzenia sobie z tym problemem (np. zaskakująco +dobrze działa odwrócenie zdania źródłowego — siec LSTM łatwiej zacząć +generować zdanie docelowe, jeśli niedawno „widziała” początek zdania +źródłowego, przynajmniej dla pary języków o podobnym szyku). + +Najlepsze efekty dodało dodanie atencji do modelu LSTM + +**** Atencja w sieciach rekurencyjnych + +Funkcję rekurencyjną można rozbudować o trzeci argument, w którym +podany będzie wynik działania atencji $A'$ względem ostatniego wyrazu, tj.: + +$$A(w_1,\dots,w_t) = R(A(w_1,\dots,w_{t-1}), A'(w_1,\dots,w_{t-1}), E(w_t)),$$ + +W czasie tłumaczenia model może kierować swoją uwagę na wyrazy +powiązane z aktualnie tłumaczonym fragmentem (zazwyczaj — po prostu odpowiedniki).