diff --git a/cw/08_Model_neuronowy_typu_word2vec.ipynb b/cw/08_Model_neuronowy_typu_word2vec.ipynb
new file mode 100644
index 0000000..3c6a62b
--- /dev/null
+++ b/cw/08_Model_neuronowy_typu_word2vec.ipynb
@@ -0,0 +1,159 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
+ "
\n",
+ "
Modelowanie Języka
\n",
+ " 8. Model neuronowy typu word2vec [ćwiczenia]
\n",
+ " Jakub Pokrywka (2022)
\n",
+ "\n",
+ "\n",
+ "![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadania"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Proszę wykonać zadanie 1 lub zadanie 2 (nie oba naraz). Zadanie 3 można zrobić niezależnie."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadanie 1\n",
+ "\n",
+ "Wzorując się na materiałach z wykładu stworzyć 5-gramowy model neuronowy oparty na jednym ze schematów z wykładu, np.\n",
+ "\n",
+ "\n",
+ "![img](bow1.drawio.png \"Model typu worek słów\")\n",
+ "\n",
+ "\n",
+ "Warunkiem koniecznym jest, żeby przewidywać słowo środkowe, np. Mając tekst ['Ala', 'ma', '[MASK]'\n",
+ " 'i', 'psa'] chcemy przewidzieć kontekst środkowego słowa (tutaj '[MASK]')\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "Warunki zaliczenia:\n",
+ "- wynik widoczny na platformie zarówno dla dev i dla test\n",
+ "- wynik dla dev i test lepszy (niższy) niż 6.50 (liczone przy pomocy geval)\n",
+ "- deadline do końca dnia 08.05\n",
+ "- commitując rozwiązanie proszę również umieścić rozwiązanie w pliku /run.py (czyli na szczycie katalogu). Można przekonwertować jupyter do pliku python przez File → Download as → Python. Rozwiązanie nie musi być w pythonie, może być w innym języku.\n",
+ "- zadania wykonujemy samodzielnie\n",
+ "- w nazwie commita podaj nr indeksu\n",
+ "- w tagach podaj **neural-network** oraz **5gram**!\n",
+ "- zadanie tym razem jest dla polskiego odpowiednika word-gap https://gonito.net/challenge-my-submissions/retro-gap\n",
+ "- metryka to LogLossHashed (praktycznie to samo, co PerlpexityHased). Przelicznik, to LogLossHased = log(PerplexityHashed). Podając równe prawd. dla każdego słowa dostaniemy 6.93, bo log(1024) = 6.93\n",
+ "\n",
+ "Punktacja:\n",
+ "- podstawa: 60 punktów\n",
+ "- 40 punktów z najlepszy wynik z 2 grup\n",
+ "- 20 punktów z 3 kolejno najlepszych wyników z 2 grup\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Jak stworzyć model?\n",
+ "- warto bazować na kodzie ze wykładu 7 Zanurzenia słów\n",
+ "- elementy, które na pewno trzeba będzie wykorzystać to: nn.Embedding, nn.Linear, nn.Softmax\n",
+ "- w odróżnieniu do materiałów z wykładu lepiej nie korzystać z nn.Sequential, tylko wszystki operacje zapisywać w model.forward. Przy użyciu sequential może być problem np. z dodawaniem lub konkatenacją tensorów"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### W jaki sposób uzyskać lepszy wynik?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "- Po pierwsze proszę stosować sie do rad z poprzednich cwiczeń (trenowanie przez kilka epok i monitorowanie wyniku na zbiorze deweloperskim)\n",
+ "- dobry start to zawsze zaczęcie od jak najprostszego modelu (czyli 1 warstwa liniowa, zwykłe dodawanie embeddingów słów) i dopiero później go rozbudowywać monitorując wynik. Jest to rada uniwersalna w uczeniu maszynowym.\n",
+ "- Poza tym warto wypróbować przynajmniej kilka modeli z wykładu. Mając zaimplementowany cały kod dla jednego modelu, wystarczy jedynie delikatnie zmienić architekturę modelu i wytrenować go od nowa. Cała reszta kodu zostaje bez zmian.\n",
+ "- warto spróbować dodanie np 2 warstw liniowych (lub nawet 3) zamiast jednej warstwy (koniecznie trzeba dodać między nimi funkcję aktywacji, np RELU).\n",
+ "- poza tym można zmieniać różne parametry (np. wielkość słownika, wielkość warstwy ukrytej, różne funkcje aktywacji)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadanie 2\n",
+ "\n",
+ "Proszę zrobić parameter Hyperparameter Tuning dla zadania 1 i zaprezentować na forum grupy razem z wnioskami\n",
+ "\n",
+ "- wymóg wyniku najlepszego modelu, conajwyżej 6.10\n",
+ "- wnioski nie muszą być specjalnie rozbudowane, prezentacja może trwać 3-5minut lub dłużej\n",
+ "- należy wybrać dla siebie metodę hypermarameter tuningu\n",
+ "- należy stworzyć conajmniej 10 modeli, należy pokazać wyniku dla conajmniej paru\n",
+ "- oczywiście kod musi być automatyczny (a nie ręcznie zmieniamy paratery), natomiast nie ma wymogu korzystania ze specjalnych bibliotek\n",
+ "- podstawa punktów 100\n",
+ "- za wynik lepszy (niższy) niż 5.50 +20 punktów\n",
+ "- użycie GPU na dowolnym cloud lub od WMI + 30 punktów\n",
+ "- termin 16.05 na zajęciach\n",
+ "- punkty przyznam na MS TEAMS, ale proszę zgłosić te rozwiązanie na gonito (nie trzeba w żadnym challenge ani z konkretymi tagami)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadanie 3\n",
+ "\n",
+ "Zaangażowanie się w pygonito.\n",
+ "\n",
+ "- https://github.com/filipggg/pygonito\n",
+ "- dobra okazja, żeby nauczyć się tworzyć paczki pythonowe\n",
+ "- wsparcie ode mnie lub prof. Gralińskiego przy tworzeniu\n",
+ "- może się przydać przy pracy magisterskiej (jeżeli wyzwanie będzie na gonito)\n",
+ "- ilość punktów zależy od zakresu pracy. Sczególnie warto samemu zaproponować co zrobić) Zakres prac i punktów do dogdania\n",
+ "- w celu ustalenia szczegółów proszę sie zgłosić do mnie\n",
+ "- termin dowolny"
+ ]
+ }
+ ],
+ "metadata": {
+ "author": "Jakub Pokrywka",
+ "email": "kubapok@wmi.amu.edu.pl",
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "lang": "pl",
+ "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.9.7"
+ },
+ "subtitle": "0.Informacje na temat przedmiotu[ćwiczenia]",
+ "title": "Ekstrakcja informacji",
+ "year": "2021"
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/wyk/07_Zanurzenia_slow.ipynb b/wyk/07_Zanurzenia_slow.ipynb
new file mode 100644
index 0000000..122c577
--- /dev/null
+++ b/wyk/07_Zanurzenia_slow.ipynb
@@ -0,0 +1,992 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
+ "\n",
+ "
Modelowanie języka
\n",
+ " 7. Zanurzenia słów [wykład]
\n",
+ " Filip Graliński (2022)
\n",
+ "\n",
+ "\n",
+ "![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)\n",
+ "\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\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": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/media/kuba/ssdsam/anaconda3/envs/lmzajecia/lib/python3.10/site-packages/torch/_masked/__init__.py:223: UserWarning: Failed to initialize NumPy: No module named 'numpy' (Triggered internally at /opt/conda/conda-bld/pytorch_1646755897462/work/torch/csrc/utils/tensor_numpy.cpp:68.)\n",
+ " example_input = torch.tensor([[-3, -2, -1], [0, 1, 2]])\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "16"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "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": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['', '', '', 'w', 'policyjny']"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "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": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'out' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "Input \u001b[0;32mIn [4]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 20\u001b[0m vocab\u001b[38;5;241m.\u001b[39mset_default_index(vocab[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 21\u001b[0m ixs \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mtensor(vocab\u001b[38;5;241m.\u001b[39mforward([\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpies\u001b[39m\u001b[38;5;124m'\u001b[39m]))\n\u001b[0;32m---> 22\u001b[0m \u001b[43mout\u001b[49m[\u001b[38;5;241m0\u001b[39m][vocab[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mjest\u001b[39m\u001b[38;5;124m'\u001b[39m]]\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'out' is not defined"
+ ]
+ }
+ ],
+ "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": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!shuf < opensubtitlesA.pl.txt > opensubtitlesA.pl.shuf.txt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "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": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2, 72)"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from torch.utils.data import DataLoader\n",
+ "\n",
+ "next(iter(train_dataset))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[tensor([ 2, 72, 615, 11, 92]), tensor([ 72, 615, 11, 92, 4])]"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from torch.utils.data import DataLoader\n",
+ "\n",
+ "next(iter(DataLoader(train_dataset, batch_size=5)))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/media/kuba/ssdsam/anaconda3/envs/lmzajecia/lib/python3.10/site-packages/torch/nn/modules/container.py:141: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n",
+ " input = module(input)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0 tensor(10.2158, device='cuda:0', grad_fn=)\n",
+ "100 tensor(6.9743, device='cuda:0', grad_fn=)\n",
+ "200 tensor(6.2186, device='cuda:0', grad_fn=)\n",
+ "300 tensor(5.6430, device='cuda:0', grad_fn=)\n",
+ "400 tensor(5.3539, device='cuda:0', grad_fn=)\n",
+ "500 tensor(5.0689, device='cuda:0', grad_fn=)\n",
+ "600 tensor(4.9418, device='cuda:0', grad_fn=)\n",
+ "700 tensor(4.8142, device='cuda:0', grad_fn=)\n",
+ "800 tensor(4.6436, device='cuda:0', grad_fn=)\n",
+ "900 tensor(4.6770, device='cuda:0', grad_fn=)\n",
+ "1000 tensor(4.6069, device='cuda:0', grad_fn=)\n",
+ "1100 tensor(4.5514, device='cuda:0', grad_fn=)\n",
+ "1200 tensor(4.5288, device='cuda:0', grad_fn=)\n",
+ "1300 tensor(4.4578, device='cuda:0', grad_fn=)\n",
+ "1400 tensor(4.5290, device='cuda:0', grad_fn=)\n",
+ "1500 tensor(4.5229, device='cuda:0', grad_fn=)\n",
+ "1600 tensor(4.4973, device='cuda:0', grad_fn=)\n",
+ "1700 tensor(4.3793, device='cuda:0', grad_fn=)\n",
+ "1800 tensor(4.5056, device='cuda:0', grad_fn=)\n",
+ "1900 tensor(4.3709, device='cuda:0', grad_fn=)\n",
+ "2000 tensor(4.3841, device='cuda:0', grad_fn=)\n",
+ "2100 tensor(4.4515, device='cuda:0', grad_fn=)\n",
+ "2200 tensor(4.3367, device='cuda:0', grad_fn=)\n",
+ "2300 tensor(4.4187, device='cuda:0', grad_fn=)\n",
+ "2400 tensor(4.3672, device='cuda:0', grad_fn=)\n",
+ "2500 tensor(4.3117, device='cuda:0', grad_fn=)\n",
+ "2600 tensor(4.2908, device='cuda:0', grad_fn=)\n",
+ "2700 tensor(4.3188, device='cuda:0', grad_fn=)\n",
+ "2800 tensor(4.2870, device='cuda:0', grad_fn=)\n",
+ "2900 tensor(4.2855, device='cuda:0', grad_fn=)\n",
+ "3000 tensor(4.2927, device='cuda:0', grad_fn=)\n",
+ "3100 tensor(4.3358, device='cuda:0', grad_fn=)\n",
+ "3200 tensor(4.2719, device='cuda:0', grad_fn=)\n",
+ "3300 tensor(4.2606, device='cuda:0', grad_fn=)\n",
+ "3400 tensor(4.2953, device='cuda:0', grad_fn=)\n",
+ "3500 tensor(4.3175, device='cuda:0', grad_fn=)\n",
+ "3600 tensor(4.2448, device='cuda:0', grad_fn=)\n",
+ "3700 tensor(4.2430, device='cuda:0', grad_fn=)\n",
+ "3800 tensor(4.2586, device='cuda:0', grad_fn=)\n",
+ "3900 tensor(4.2905, device='cuda:0', grad_fn=)\n",
+ "4000 tensor(4.2455, device='cuda:0', grad_fn=)\n",
+ "4100 tensor(4.2214, device='cuda:0', grad_fn=)\n",
+ "4200 tensor(4.2325, device='cuda:0', grad_fn=)\n",
+ "4300 tensor(4.3036, device='cuda:0', grad_fn=)\n",
+ "4400 tensor(4.2335, device='cuda:0', grad_fn=)\n",
+ "4500 tensor(4.2377, device='cuda:0', grad_fn=)\n",
+ "4600 tensor(4.2109, device='cuda:0', grad_fn=)\n",
+ "4700 tensor(4.2942, device='cuda:0', grad_fn=)\n",
+ "4800 tensor(4.2234, device='cuda:0', grad_fn=)\n",
+ "4900 tensor(4.1918, device='cuda:0', grad_fn=)\n",
+ "5000 tensor(4.3084, device='cuda:0', grad_fn=)\n",
+ "5100 tensor(4.1666, device='cuda:0', grad_fn=)\n",
+ "5200 tensor(4.2307, device='cuda:0', grad_fn=)\n",
+ "5300 tensor(4.2050, device='cuda:0', grad_fn=)\n",
+ "5400 tensor(4.1853, device='cuda:0', grad_fn=)\n",
+ "5500 tensor(4.1917, device='cuda:0', grad_fn=)\n",
+ "5600 tensor(4.1453, device='cuda:0', grad_fn=)\n",
+ "5700 tensor(4.2423, device='cuda:0', grad_fn=)\n",
+ "5800 tensor(4.1972, device='cuda:0', grad_fn=)\n",
+ "5900 tensor(4.2143, device='cuda:0', grad_fn=)\n",
+ "6000 tensor(4.2172, device='cuda:0', grad_fn=)\n",
+ "6100 tensor(4.2463, device='cuda:0', grad_fn=)\n",
+ "6200 tensor(4.1756, device='cuda:0', grad_fn=)\n",
+ "6300 tensor(4.1223, device='cuda:0', grad_fn=)\n",
+ "6400 tensor(4.1852, device='cuda:0', grad_fn=)\n",
+ "6500 tensor(4.1559, device='cuda:0', grad_fn=)\n",
+ "6600 tensor(4.1833, device='cuda:0', grad_fn=)\n",
+ "6700 tensor(4.2090, device='cuda:0', grad_fn=)\n",
+ "6800 tensor(4.1896, device='cuda:0', grad_fn=)\n",
+ "6900 tensor(4.2057, device='cuda:0', grad_fn=)\n",
+ "7000 tensor(4.1523, device='cuda:0', grad_fn=)\n",
+ "7100 tensor(4.2645, device='cuda:0', grad_fn=)\n",
+ "7200 tensor(4.1974, device='cuda:0', grad_fn=)\n",
+ "7300 tensor(4.2031, device='cuda:0', grad_fn=)\n",
+ "7400 tensor(4.1613, device='cuda:0', grad_fn=)\n",
+ "7500 tensor(4.2018, device='cuda:0', grad_fn=)\n",
+ "7600 tensor(4.2197, device='cuda:0', grad_fn=)\n",
+ "7700 tensor(4.1976, device='cuda:0', grad_fn=)\n",
+ "7800 tensor(4.1650, device='cuda:0', grad_fn=)\n",
+ "7900 tensor(4.1380, device='cuda:0', grad_fn=)\n",
+ "8000 tensor(4.1014, device='cuda:0', grad_fn=)\n",
+ "8100 tensor(4.2058, device='cuda:0', grad_fn=)\n",
+ "8200 tensor(4.1514, device='cuda:0', grad_fn=)\n",
+ "8300 tensor(4.1187, device='cuda:0', grad_fn=)\n",
+ "8400 tensor(4.2438, device='cuda:0', grad_fn=)\n",
+ "8500 tensor(4.2094, device='cuda:0', grad_fn=)\n",
+ "8600 tensor(4.2077, device='cuda:0', grad_fn=)\n",
+ "8700 tensor(4.0819, device='cuda:0', grad_fn=)\n",
+ "8800 tensor(4.1766, device='cuda:0', grad_fn=)\n",
+ "8900 tensor(4.1805, device='cuda:0', grad_fn=)\n",
+ "9000 tensor(4.1847, device='cuda:0', grad_fn=)\n",
+ "9100 tensor(4.1929, device='cuda:0', grad_fn=)\n",
+ "9200 tensor(4.1434, device='cuda:0', grad_fn=)\n",
+ "9300 tensor(4.1678, device='cuda:0', grad_fn=)\n",
+ "9400 tensor(4.1699, device='cuda:0', grad_fn=)\n",
+ "9500 tensor(4.0885, device='cuda:0', grad_fn=)\n",
+ "9600 tensor(4.1544, device='cuda:0', grad_fn=)\n",
+ "9700 tensor(4.1828, device='cuda:0', grad_fn=)\n",
+ "9800 tensor(4.1314, device='cuda:0', grad_fn=)\n",
+ "9900 tensor(4.1473, device='cuda:0', grad_fn=)\n",
+ "10000 tensor(4.0948, device='cuda:0', grad_fn=)\n",
+ "10100 tensor(4.1396, device='cuda:0', grad_fn=)\n",
+ "10200 tensor(4.1999, device='cuda:0', grad_fn=)\n",
+ "10300 tensor(4.1027, device='cuda:0', grad_fn=)\n",
+ "10400 tensor(4.2049, device='cuda:0', grad_fn=)\n",
+ "10500 tensor(4.1470, device='cuda:0', grad_fn=)\n",
+ "10600 tensor(4.0974, device='cuda:0', grad_fn=)\n",
+ "10700 tensor(4.1239, device='cuda:0', grad_fn=)\n",
+ "10800 tensor(4.1381, device='cuda:0', grad_fn=)\n",
+ "10900 tensor(4.0569, device='cuda:0', grad_fn=)\n",
+ "11000 tensor(4.1138, device='cuda:0', grad_fn=)\n",
+ "11100 tensor(4.2053, device='cuda:0', grad_fn=)\n",
+ "11200 tensor(4.1404, device='cuda:0', grad_fn=)\n",
+ "11300 tensor(4.0741, device='cuda:0', grad_fn=)\n",
+ "11400 tensor(4.0090, device='cuda:0', grad_fn=)\n",
+ "11500 tensor(4.1568, device='cuda:0', grad_fn=)\n",
+ "11600 tensor(4.1498, device='cuda:0', grad_fn=)\n",
+ "11700 tensor(4.1052, device='cuda:0', grad_fn=)\n",
+ "11800 tensor(4.0600, device='cuda:0', grad_fn=)\n",
+ "11900 tensor(4.1274, device='cuda:0', grad_fn=)\n",
+ "12000 tensor(4.1346, device='cuda:0', grad_fn=)\n",
+ "12100 tensor(4.1024, device='cuda:0', grad_fn=)\n",
+ "12200 tensor(4.0966, device='cuda:0', grad_fn=)\n",
+ "12300 tensor(4.1036, device='cuda:0', grad_fn=)\n",
+ "12400 tensor(4.0127, device='cuda:0', grad_fn=)\n",
+ "12500 tensor(4.0575, device='cuda:0', grad_fn=)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "12600 tensor(4.1542, device='cuda:0', grad_fn=)\n",
+ "12700 tensor(4.1810, device='cuda:0', grad_fn=)\n",
+ "12800 tensor(4.1948, device='cuda:0', grad_fn=)\n",
+ "12900 tensor(4.1085, device='cuda:0', grad_fn=)\n",
+ "13000 tensor(4.1283, device='cuda:0', grad_fn=)\n",
+ "13100 tensor(4.1548, device='cuda:0', grad_fn=)\n",
+ "13200 tensor(4.1015, device='cuda:0', grad_fn=)\n",
+ "13300 tensor(4.1342, device='cuda:0', grad_fn=)\n",
+ "13400 tensor(4.0724, device='cuda:0', grad_fn=)\n",
+ "13500 tensor(4.1006, device='cuda:0', grad_fn=)\n",
+ "13600 tensor(4.0998, device='cuda:0', grad_fn=)\n",
+ "13700 tensor(4.1021, device='cuda:0', grad_fn=)\n",
+ "13800 tensor(4.1175, device='cuda:0', grad_fn=)\n",
+ "13900 tensor(4.1017, device='cuda:0', grad_fn=)\n",
+ "14000 tensor(4.1877, device='cuda:0', grad_fn=)\n",
+ "14100 tensor(4.1664, device='cuda:0', grad_fn=)\n",
+ "14200 tensor(4.1582, device='cuda:0', grad_fn=)\n",
+ "14300 tensor(4.1526, device='cuda:0', grad_fn=)\n",
+ "14400 tensor(4.1208, device='cuda:0', grad_fn=)\n",
+ "14500 tensor(4.0752, device='cuda:0', grad_fn=)\n",
+ "14600 tensor(4.1907, device='cuda:0', grad_fn=)\n",
+ "14700 tensor(4.0496, device='cuda:0', grad_fn=)\n",
+ "14800 tensor(4.1371, device='cuda:0', grad_fn=)\n",
+ "14900 tensor(4.1215, device='cuda:0', grad_fn=)\n",
+ "15000 tensor(4.1059, device='cuda:0', grad_fn=)\n",
+ "15100 tensor(4.0888, device='cuda:0', grad_fn=)\n",
+ "15200 tensor(4.1359, device='cuda:0', grad_fn=)\n",
+ "15300 tensor(4.1328, device='cuda:0', grad_fn=)\n",
+ "15400 tensor(4.1044, device='cuda:0', grad_fn=)\n",
+ "15500 tensor(4.1167, device='cuda:0', grad_fn=)\n",
+ "15600 tensor(4.0449, device='cuda:0', grad_fn=)\n",
+ "15700 tensor(4.1159, device='cuda:0', grad_fn=)\n",
+ "15800 tensor(4.1082, device='cuda:0', grad_fn=)\n",
+ "15900 tensor(4.1653, device='cuda:0', grad_fn=)\n",
+ "16000 tensor(4.1111, device='cuda:0', grad_fn=)\n",
+ "16100 tensor(4.0870, device='cuda:0', grad_fn=)\n",
+ "16200 tensor(4.1085, device='cuda:0', grad_fn=)\n",
+ "16300 tensor(4.1216, device='cuda:0', grad_fn=)\n",
+ "16400 tensor(4.1307, device='cuda:0', grad_fn=)\n",
+ "16500 tensor(4.0872, device='cuda:0', grad_fn=)\n",
+ "16600 tensor(4.0754, device='cuda:0', grad_fn=)\n",
+ "16700 tensor(4.0067, device='cuda:0', grad_fn=)\n",
+ "16800 tensor(4.0413, device='cuda:0', grad_fn=)\n",
+ "16900 tensor(4.1242, device='cuda:0', grad_fn=)\n",
+ "17000 tensor(4.1169, device='cuda:0', grad_fn=)\n",
+ "17100 tensor(4.0942, device='cuda:0', grad_fn=)\n",
+ "17200 tensor(4.1518, device='cuda:0', grad_fn=)\n",
+ "17300 tensor(4.0968, device='cuda:0', grad_fn=)\n",
+ "17400 tensor(4.0476, device='cuda:0', grad_fn=)\n",
+ "17500 tensor(4.0230, device='cuda:0', grad_fn=)\n",
+ "17600 tensor(4.1268, device='cuda:0', grad_fn=)\n",
+ "17700 tensor(4.0388, device='cuda:0', grad_fn=)\n",
+ "17800 tensor(4.1741, device='cuda:0', grad_fn=)\n",
+ "17900 tensor(4.1147, device='cuda:0', grad_fn=)\n",
+ "18000 tensor(4.2020, device='cuda:0', grad_fn=)\n",
+ "18100 tensor(4.0304, device='cuda:0', grad_fn=)\n",
+ "18200 tensor(4.1171, device='cuda:0', grad_fn=)\n",
+ "18300 tensor(4.0945, device='cuda:0', grad_fn=)\n",
+ "18400 tensor(4.1019, device='cuda:0', grad_fn=)\n",
+ "18500 tensor(4.1301, device='cuda:0', grad_fn=)\n",
+ "18600 tensor(4.0979, device='cuda:0', grad_fn=)\n",
+ "18700 tensor(4.0755, device='cuda:0', grad_fn=)\n",
+ "18800 tensor(4.0760, device='cuda:0', grad_fn=)\n",
+ "18900 tensor(4.0553, device='cuda:0', grad_fn=)\n",
+ "19000 tensor(4.1530, device='cuda:0', grad_fn=)\n",
+ "19100 tensor(4.1403, device='cuda:0', grad_fn=)\n",
+ "19200 tensor(4.1449, device='cuda:0', grad_fn=)\n",
+ "19300 tensor(4.0105, device='cuda:0', grad_fn=)\n",
+ "19400 tensor(4.0742, device='cuda:0', grad_fn=)\n",
+ "19500 tensor(4.0666, device='cuda:0', grad_fn=)\n",
+ "19600 tensor(4.1549, device='cuda:0', grad_fn=)\n",
+ "19700 tensor(4.0930, device='cuda:0', grad_fn=)\n",
+ "19800 tensor(4.1271, device='cuda:0', grad_fn=)\n",
+ "19900 tensor(4.1169, device='cuda:0', grad_fn=)\n",
+ "20000 tensor(4.1053, device='cuda:0', grad_fn=)\n",
+ "20100 tensor(4.1070, device='cuda:0', grad_fn=)\n",
+ "20200 tensor(4.0848, device='cuda:0', grad_fn=)\n",
+ "20300 tensor(4.1330, device='cuda:0', grad_fn=)\n",
+ "20400 tensor(3.9828, device='cuda:0', grad_fn=)\n",
+ "20500 tensor(4.1411, device='cuda:0', grad_fn=)\n",
+ "20600 tensor(4.0537, device='cuda:0', grad_fn=)\n",
+ "20700 tensor(4.1171, device='cuda:0', grad_fn=)\n",
+ "20800 tensor(4.0510, device='cuda:0', grad_fn=)\n",
+ "20900 tensor(4.1230, device='cuda:0', grad_fn=)\n",
+ "21000 tensor(4.1241, device='cuda:0', grad_fn=)\n",
+ "21100 tensor(4.1600, device='cuda:0', grad_fn=)\n",
+ "21200 tensor(4.0699, device='cuda:0', grad_fn=)\n",
+ "21300 tensor(4.0870, device='cuda:0', grad_fn=)\n",
+ "21400 tensor(4.0774, device='cuda:0', grad_fn=)\n",
+ "21500 tensor(4.1492, device='cuda:0', grad_fn=)\n",
+ "21600 tensor(4.0883, device='cuda:0', grad_fn=)\n",
+ "21700 tensor(4.0358, device='cuda:0', grad_fn=)\n",
+ "21800 tensor(4.0569, device='cuda:0', grad_fn=)\n",
+ "21900 tensor(4.0832, device='cuda:0', grad_fn=)\n",
+ "22000 tensor(4.0827, device='cuda:0', grad_fn=)\n",
+ "22100 tensor(4.0534, device='cuda:0', grad_fn=)\n",
+ "22200 tensor(4.0173, device='cuda:0', grad_fn=)\n",
+ "22300 tensor(4.0549, device='cuda:0', grad_fn=)\n",
+ "22400 tensor(4.0613, device='cuda:0', grad_fn=)\n",
+ "22500 tensor(4.1058, device='cuda:0', grad_fn=)\n",
+ "22600 tensor(4.1230, device='cuda:0', grad_fn=)\n",
+ "22700 tensor(4.1114, device='cuda:0', grad_fn=)\n",
+ "22800 tensor(4.0541, device='cuda:0', grad_fn=)\n",
+ "22900 tensor(4.0732, device='cuda:0', grad_fn=)\n",
+ "23000 tensor(4.0983, device='cuda:0', grad_fn=)\n",
+ "23100 tensor(4.0547, device='cuda:0', grad_fn=)\n",
+ "23200 tensor(4.1198, device='cuda:0', grad_fn=)\n",
+ "23300 tensor(4.0687, device='cuda:0', grad_fn=)\n",
+ "23400 tensor(4.0676, device='cuda:0', grad_fn=)\n",
+ "23500 tensor(4.0834, device='cuda:0', grad_fn=)\n",
+ "23600 tensor(4.0996, device='cuda:0', grad_fn=)\n",
+ "23700 tensor(4.0791, device='cuda:0', grad_fn=)\n",
+ "23800 tensor(4.0700, device='cuda:0', grad_fn=)\n",
+ "23900 tensor(4.0388, device='cuda:0', grad_fn=)\n",
+ "24000 tensor(4.0625, device='cuda:0', grad_fn=)\n",
+ "24100 tensor(4.1095, device='cuda:0', grad_fn=)\n",
+ "24200 tensor(4.1589, device='cuda:0', grad_fn=)\n",
+ "24300 tensor(4.1565, device='cuda:0', grad_fn=)\n",
+ "24400 tensor(4.1396, device='cuda:0', grad_fn= |