From 10981fc2bc624c92188f44008a79514297665ec4 Mon Sep 17 00:00:00 2001 From: Filip Gralinski Date: Wed, 26 May 2021 13:29:45 +0200 Subject: [PATCH 1/2] CRF cd. --- wyk/09_neurozoo.ipynb | 1361 ++++++++++++++-------- wyk/09_neurozoo.org | 414 ++++++- wyk/img-feed-forward.png | Bin 0 -> 21213 bytes wyk/img-linear-regression.png | Bin 0 -> 14971 bytes wyk/img-logistic-regression-aardvark.png | Bin 0 -> 15488 bytes wyk/img-logistic-regression-hashing.png | Bin 0 -> 15248 bytes wyk/img-logistic-regression.png | Bin 0 -> 15050 bytes 7 files changed, 1275 insertions(+), 500 deletions(-) create mode 100644 wyk/img-feed-forward.png create mode 100644 wyk/img-linear-regression.png create mode 100644 wyk/img-logistic-regression-aardvark.png create mode 100644 wyk/img-logistic-regression-hashing.png create mode 100644 wyk/img-logistic-regression.png diff --git a/wyk/09_neurozoo.ipynb b/wyk/09_neurozoo.ipynb index 6d8aa72..6acddca 100644 --- a/wyk/09_neurozoo.ipynb +++ b/wyk/09_neurozoo.ipynb @@ -8,6 +8,56 @@ "\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Kilka uwag dotyczących wektorów\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wektor wierszowy $\\left[x_1,\\dots,x_n\\right]$ czy kolumnowy $\\left[\\begin{array}{c}\n", + " x_1 \\\\ \\vdots \\\\ x_n\\end{array}\\right]$?\n", + "\n", + "Często zakłada się wektor kolumny, będziemy używać **transpozycji**, by otrzymać wektor\n", + "wierszowy $\\vec{x}^T = \\left[x_1,\\dots,x_n\\right]$.\n", + "\n", + "W praktyce, np. w PyTorchu, może to nie mieć wielkiego znaczenia:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[2]:\n", + "tensor([ 1.0000, -0.5000, 2.0000])" + ] + } + ], + "source": [ + "import torch\n", + "x = torch.tensor([1.0, -0.5, 2.0])\n", + "x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Musimy tylko uważać, jeśli przemnażamy wektor przez macierz!\n", + "\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -32,14 +82,12 @@ "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor(0.6457)" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[1]:\n", + "tensor(0.6457)" + ] } ], "source": [ @@ -53,32 +101,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'sigmoid.png'" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", @@ -123,18 +148,16 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([0.6457, 0.7311, 0.0067])" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[38]:\n", + "tensor([0.6457, 0.7311, 0.0067])" + ] } ], "source": [ @@ -153,18 +176,16 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([0.5000, 0.4502, 0.5987])" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[49]:\n", + "tensor([0.5000, 0.4502, 0.5987])" + ] } ], "source": [ @@ -184,18 +205,16 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([0.5000, 0.6225, 0.5744])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[48]:\n", + "tensor([0.5000, 0.6225, 0.5744])" + ] } ], "source": [ @@ -245,6 +264,411 @@ "\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Iloczyn skalarny — przypomnienie\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\\left[1.0, -0.5, 2.0\\right]\n", + " \\left[\\begin{array}{c}\n", + " 3.0 \\\\\n", + " 1.5 \\\\\n", + " 0.0\\end{array}\\right]\n", + " =\n", + " 1.0 \\cdot 3.0 + -0.5 \\cdot 1.5 + 2.0 \\cdot 0.0 = 2.25$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Intuicje\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- $\\vec{a}^T \\vec{b}$ mierzy jak bardzo $\\vec{a}$ „pasuje” do\n", + " $\\vec{b}$,\n", + "- … zwłaszcza gdy znormalizujemy wektory dzieląc przez $|\\vec{a}|$ i $|\\vec{b}|$:\n", + " $\\frac{\\vec{a}^T \\vec{b}}{|\\vec{a}||\\vec{b}|} = \\cos \\theta$,\n", + " gdzie $\\theta$ to kąt pomiędzy $\\vec{a}$ and $\\vec{b}$ (podobieństwo kosinusowe!)\n", + "- co, jeśli if $\\vec{a}^T \\vec{b} = 0$? — $\\vec{a}$ i $\\vec{b}$ są prostopadłe, np.\n", + " $\\left[1, 2\\right] \\cdot \\left[-2, -1\\right]^T = 0$\n", + "- a co, jeśli $\\vec{a}^T \\vec{b} = -1$ — wektor są skierowane w przeciwnym kierunku, jeśli dodatkowo $|\\vec{a}|=|\\vec{b}|=1$, np.\n", + " $\\left[\\frac{\\sqrt{2}}{2},\\frac{\\sqrt{2}}{2}\\right] \\cdot \\left[-\\frac{\\sqrt{2}}{2},-\\frac{\\sqrt{2}}{2}\\right]^T = -1$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### W PyTorchu\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[3]:\n", + "tensor(2.2500)" + ] + } + ], + "source": [ + "import torch\n", + "x = torch.tensor([1.0, -0.5, 2.0])\n", + "y = torch.tensor([3.0, 1.5, 0.0])\n", + "x @ y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Regresja liniowa jako element sieci neuronowej\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Przypomnijmy sobie wzór na regresję liniową:\n", + "\n", + "$$y = w_0 + w_1x_1 + w_2x_2 + \\dots + w_{|V|}x_{|v|}$$\n", + "\n", + "Jeśli wprowadzimy sztuczny element wektora $\\vec{x}$ ustawiony zawsze na 1 ($x_0 = 1$), wówczas\n", + "wzór może przyjąc bardziej zwartą postać:\n", + "\n", + "$$y = \\sum_{i=0}^{|V|} w_ix_i = \\vec{w}\\vec{x}$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### PyTorch\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Implementacja w PyTorchu\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zakładamy, że wektor wejściowy **nie** obejmuje dodatkowego elementu $x_0 = 1$.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[11]:\n", + "tensor(0., dtype=torch.float64, grad_fn=)" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "\n", + "class MyLinearRegressor(nn.Module):\n", + " def __init__(self, vlen):\n", + " super(MyLinearRegressor, self).__init__()\n", + " self.register_parameter(name='w', param=torch.nn.Parameter(\n", + " torch.zeros(vlen, dtype=torch.double, requires_grad=True)))\n", + " self.register_parameter(name='b', param=torch.nn.Parameter(\n", + " torch.tensor(0., dtype=torch.double, requires_grad=True)))\n", + "\n", + " def forward(self, x):\n", + " return self.b + x @ self.w\n", + "\n", + "regressor = MyLinearRegressor(3)\n", + "regressor(torch.tensor([0.3, 0.4, 1.0], dtype=torch.double))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Gotowy moduł w PyTorchu\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Możemy skorzystać z ogólniejszej konstrukcji — warstwy liniowej (ale,\n", + "uwaga!, na wyjściu będzie wektor jednoelementowy).\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[18]:\n", + "tensor([0.1882], grad_fn=)" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "\n", + "regressor = torch.nn.Linear(in_features=3, out_features=1, bias=True)\n", + "regressor(torch.tensor([0.3, 0.4, 1.0]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Zastosowania\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Bezpośrednio możemy zastosować do zadania regresji dla tekstu (np.\n", + "przewidywanie roku publikacji tekstu).\n", + "\n", + "![img](./img-linear-regression.png)\n", + "\n", + "W połączeniu z sigmoidą otrzymamy regresją logistyczną, np. dla zadania klasyfikacji tekstu:\n", + "\n", + "$$p(c|\\vec{x}) = \\sigma(w_0 + w_1x_1 + w_2x_2 + \\dots + w_{|V|}x_{|v})\n", + "= \\sigma(\\Sigma_{i=0}^{|V|} w_ix_i) = \\sigma(\\vec{w}\\vec{x})$$\n", + "\n", + "![img](./img-logistic-regression.png)\n", + "\n", + "Tak sieć będzie aktywowana dla tekstu aardvark in Aachen:\n", + "\n", + "![img](./img-logistic-regression-aardvark.png)\n", + "\n", + "Regresje logistyczną (liniową zresztą też) dla tekstu możemy połączyć z trikiem z haszowaniem:\n", + "\n", + "$$p(c|\\vec{x}) = \\sigma(w_0 + w_1x_1 + w_2x_2 + \\dots + w_{2^b}x_{2^b})\n", + "= \\sigma(\\Sigma_{i=0}^{2^b} w_ix_i) = \\sigma(\\vec{w}\\vec{x})$$ \n", + "{\\small hashing function $H : V \\rightarrow \\{1,\\dots,2^b\\}$,\n", + " e.g. MurmurHash3}\n", + "\n", + "![img](./img-logistic-regression-hashing.png)\n", + "\n", + "****Pytanie:**** Jaki tekst otrzyma na pewno taką samą klasę jak aardvark in Aachen?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Wagi\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Liczba wag jest równa rozmiarowi wektora wejściowego (oraz opcjonalnie\n", + "obciążenie).\n", + "\n", + "Każda waga odpowiada wyrazowi ze słownika, możemy więc interpretować\n", + "wagi jako jednowymiarowy parametr opisujący słowa.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Warstwa liniowa\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Mnożenie macierzy przez wektor — przypomnienie\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Mnożenie macierzy przez wektor można interpretować jako zrównolegloną operację mnożenie wektora przez wektor.\n", + "\n", + "$$\\left[\\begin{array}{ccc}\n", + " \\alert<2>{1.0} & \\alert<2>{-2.0} & \\alert<2>{3.0} \\\\\n", + " \\alert<3>{-2.0} & \\alert<3>{0.0} & \\alert<3>{10.0}\\end{array}\\right]\n", + " \\left[\\begin{array}{c}\n", + " \\alert<2-3>{1.0} \\\\\n", + " \\alert<2-3>{-0.5} \\\\\n", + " \\alert<2-3>{2.0}\\end{array}\\right]\n", + " =\n", + " \\left[\\begin{array}{c}\n", + " \\uncover<2->{\\alert<2>{8.0}} \\\\\n", + " \\uncover<3->{\\alert<3>{18.0}}\\end{array}\\right]$$\n", + "\n", + "Jeśli przemnożymy macierz $n \\times m$ przez wektor kolumnowy o długości\n", + "$m$, otrzymamy wektor o rozmiarze $n$.\n", + "\n", + "W PyTorchu:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "m = torch.tensor([[1.0, -2.0, 3.0],\n", + " [-2.0, 0.0, 10.0]])\n", + "x = torch.tensor([1.0, -0.5, 2.0])\n", + "m @ x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[[file:# Out[19]:\n", + "\n", + " tensor([ 8., 18.])]]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Definicja warstwy liniowej\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Warstwa liniowa polega na przemnożeniu wejścia przez macierz. Można\n", + "to intepretować jako zrównolegloną operację regresji liniowej (równolegle\n", + "uczymy czy wykonujemy $n$ regresji liniowych).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### PyTorch\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Warstwa liniowa, która przyjmuje wektor o rozmiarze 3 i zwraca wektor o rozmiarze 2.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[23]:\n", + "tensor([-1.1909, -0.5831], grad_fn=)" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "\n", + "regressor = torch.nn.Linear(in_features=3, out_features=2, bias=True)\n", + "regressor(torch.tensor([0.3, 0.4, 1.0]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Pytanie**: Ile wag (parametrów) ma powyżej użyta warstwa?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Zastosowania\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Warstwa liniowa jest podstawowym elementem sieci neuronowych —\n", + "począwszy od prostych sieci neuronowych feed-forward, gdzie warstwy\n", + "liniowe łączymy używając funkcji aktywacji (np. sigmoidy).\n", + "\n", + "Oto przykład prostej dwuwarstwowej sieci neuronowej do klasyfikacji binarnej.\n", + "\n", + "![img](./img-feed-forward.png)\n", + "\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -297,18 +721,16 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([0.1182, 0.0022, 0.0059, 0.8737])" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[75]:\n", + "tensor([0.1182, 0.0022, 0.0059, 0.8737])" + ] } ], "source": [ @@ -382,26 +804,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": {}, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - ":3: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", - " nn.functional.softmax(torch.tensor([0.6, 1.0, -5.0]))\n" + "# Out[5]:\n", + "tensor([0.4007, 0.5978, 0.0015])" ] - }, - { - "data": { - "text/plain": [ - "tensor([0.4007, 0.5978, 0.0015])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -420,27 +832,19 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - ":3: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", - " nn.functional.softmax(torch.tensor([[0.6, 1.0], [-2.0, 3.5]]))\n" + "# Out[6]:\n", + "#+BEGIN_EXAMPLE\n", + " tensor([[0.4013, 0.5987],\n", + " [0.0041, 0.9959]])\n", + "#+END_EXAMPLE" ] - }, - { - "data": { - "text/plain": [ - "tensor([[0.4013, 0.5987],\n", - " [0.0041, 0.9959]])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -459,19 +863,19 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([[0.9309, 0.0759],\n", - " [0.0691, 0.9241]])" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[8]:\n", + "#+BEGIN_EXAMPLE\n", + " tensor([[0.9309, 0.0759],\n", + " [0.0691, 0.9241]])\n", + "#+END_EXAMPLE" + ] } ], "source": [ @@ -490,18 +894,16 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([0.3021, 0.2473, 0.4506])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[10]:\n", + "tensor([0.3021, 0.2473, 0.4506])" + ] } ], "source": [ @@ -521,18 +923,16 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([0.5000, 0.6225, 0.5744])" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[48]:\n", + "tensor([0.5000, 0.6225, 0.5744])" + ] } ], "source": [ @@ -581,32 +981,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'softmax3.png'" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", @@ -638,32 +1015,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'softmax3d.png'" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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c+TeU4iiyOeff86ll15KamoqGo2G008/ndNPP53o6OhZs96+1olLex0aGpJz6Z6mk7qD3W6npKRkr6bXJGLn5+ePs9ZWq3VGxjSJosijjz5KcXExr7/++l6ppnN97ssuu4ywsDD+9a9/zcZTzJF7JvCPf/yDY489loKCAhobG1m9ejVvv/02SqWS0047jZUrV85YkEsUxXE55T1xIV2LZlQqlZxLn+gFWK1WSktL95pCKXgm9kRMHNMUEhIiV5dNdQQRRZEnn3ySL7/8klWrVu2V+ndXfPvttxx22GHj6gLuueceTj755Jl6ijlyzxZEUaStrU0musVi4bTTTmPFihUkJyfvFtFno05cwujoqJxikwQoIiMjUSqVezVvDuPbRH05X08c0xQQECD3pru626Io8txzz/HBBx/w9ttv75UKxX2AOXLvDYiiSGdnJ2vWrGHNmjUMDg5yyimnsHLlSq/nYe2NOnEJZrMZg8FAR0cHQ0NDREVFkZqauleqs3aX2BMxsZxXo9EQEBCAVqvliy++YPXq1axdu3bWesz3A8yRe1+gq6uLd955hzVr1tDV1cVJJ53EihUrPBaCSKN2goOD91oUXlIonTdvHjabDYPBgNlsJjw8nOjo6N2qLJsOkrTVnhLbHUZGRiguLubWW2+ls7OTW265hQsuuGBWI/77GHPk3tfo6+uTxSdaWlo4/vjjOeOMM2QBB6vVKvea761AlieFUpvNRk9PD52dnRiNRrmneybG+ErEdlWImWmsWbOGp59+mueff54vvvgCrVbLRRddNCvPtR9gjtz7EwYGBuSe9NraWg455BA2bNjA888/T2Zm5l7Zg7cKpe4EKKKioqado+UOvb291NTUkJ+fP2vEfu+993j00Ufl1OVsYP369dx0003Y7Xauvvpqfv/738/K83iJOXLvr6iqquLUU08lMzOT1tZWjjrqKFasWMHSpUv3O4VST8McvMmlS1JMs0ns9evX889//pP333/fbbvtTMBut5ORkcEnn3xCQkICRUVFvPbaazNZK+4rfnoCiT8XVFRU8Prrr7N06VJGR0f5+OOPeeGFF7jppps47LDDWLFiBcuXL5+xogvXum1fGzIUCgVhYWGyuIE03qi+vh6dTifn0ifuVSJ2QUHBrKWiPvvsM+677z4++OCDWSM2wMaNG0lPT5fnip9//vm8++67+5Lcs4I5yz2LMJvNfPbZZ6xatYoff/yRgw8+mJUrV3LYYYftdhGGFKGe6bptdxFrKcU2NDQ068T++uuvufvuu3n//fdnPY23atUq1q9fzzPPPAPAyy+/zI8//shjjz02q887BWbFcu+9Vhov8cADDyAIgjyR8acMPz8/Tj75ZJ577jlKSko477zzWLduHcuXL+e6667jo48+wmw2e71eT0+PHMia6bSQIAgEBgaSlpbGsmXLyMjIwGq1smnTJnket6eJrXuK7777jjvvvJO1a9futb72ifgJSTJ5jf3KLW9paeGTTz7xeaDeTwFqtZrjjjuO4447DpvNxrfffsuqVav4wx/+QG5uLitXruSYY47xSFpJoXQ2racr9Ho9o6OjqFQqioqK6Ovro7KyUh7mEBUVNSM92j/++CO33XYba9euJS4ubgZ2Pj0SEhJoaWmR/7+1tXWvPffexH7llp999tn84Q9/YMWKFWzatImIiIi9+fT7BHa7ne+//17uSc/KymLlypUcf/zxciFKe3s7ra2te02hFJz5/YaGhkmNLhaLRVZpkYY5REdH71ZTyJYtW7jhhht4991391oDDzjThBkZGXz22WfEx8dTVFTEq6++yqJFi/baHibgwA6orV27lvj4ePLy8vb1VvYqlEolhx56KIceeigOh4PNmzfz1ltv8Y9//IN58+YRGRkpd0PtrS4oT8QG58SQ+Ph44uPjZZWWuro6uSlkKn10V5SWlnL99dezZs2avUpsAJVKxWOPPcYJJ5yA3W7nyiuv3JfEnjXsVct97LHH0tHRMennf//737nnnnv4+OOP5cqun4vl9gSHw8Fdd93F6tWrCQoKknvSTznllBmfKuoKidgFBQU+eQnu9NElAYqJufTKykquuuoq3nrrrb1WE7Cf46dvuT/99FO3Py8vL5eH64HzDFRYWMjGjRt/ahK1Mwar1YrNZqO8vByNRkNVVRWrVq1i5cqVhIWFsWLFCk499dQZvQG6nut9df9dVV8dDgd9fX10dnayY8cOWY4pMDCQxsZGrrrqKl577bU5Ys8y9qszt4Q5y+0ZUrfZqlWrWLt2LTqdjhUrVnDaaaftUU+6wWCQxSRm8lwvyTHt2LGDq666CovFws0338y111476+OPf0L4eaTCZhK/+93vyMrKIjc3lzPOOIP+/v59vaU9hiAIZGRkcOedd/L999/zzDPPYLFYuOSSSzjppJN4/PHH2blzp9t0jyfMFrGl/YaEhMgNLPfddx/9/f3cdtttM/o8c5iM/dJyzxQ+/vhjjj76aFQqFbfffjsA999//z7e1exAFEVaW1vlnnSbzcZpp53G6aefPmVPemdnJ83NzbMaiW9paeG8887jySefZNmyZbPyHK743e9+x3vvvYdGoyEtLY3nn39+xmrU//CHPxARESHrlt91111ER0fz61//ek+Wnast3xO8/fbbrFq1iv/973/7eiuzDlEU6ejokHvSh4eHOeWUU1ixYsW4nnSJ2AUFBbMWid+5cyfnnHMOjz76KIceeuisPMdEzOZNvbGxkTPPPJMtW7bgcDiYP38+Gzdu3FPt+Z9+QG1f4rnnnuO8887b19vYKxAEgdjYWG644QZuuOEGurq6ePvtt7n99tvp6enhpJNOQqVSYbPZuPXWW2eN2B0dHZx33nk8/PDDe43YAMcff7z874MOOohVq1bN2NopKSmEh4ezdetWOjs7KSgo2CtDJXYHP3nLPVV6bcWKFfK/N23axJo1aw7IMkNf0Nvby1133cW7775LfHw8xxxzDGecccaU44V2B11dXZx11lnce++9Myne7zNOO+00zjvvPC6++OIZW/ONN95gw4YNdHR0cNlll82EltqcW747ePHFF3niiSf47LPPZmWkzU8NAwMDXH755bz00ks4HA7WrVvH6tWrqaur47jjjmPlypXk5+fvEdF7eno466yz+POf/zyTIoLjsC9v6haLhZycHKxWKzU1NTPR1jtHbl+xfv16brnlFr766isiIyP39Xb2awwPD/PBBx+watUqtm3bxtFHH82KFSsoKiry6eLt7+/nzDPP5I477pBJti8w2zf1a6+9lpCQEO67776ZWG523ElRFKf6+kkjLS1NTEhIEPPy8sS8vDzxl7/85W6v9eGHH4oZGRliWlqaeO+9987gLvc/jIyMiG+//bZ40UUXiYsWLRKvu+46cf369eLAwIBoNBo9frW3t4vLly8X33rrrX26/w8//FBcsGCBaDAYZmV9u90u5uXlidXV1TO15HQ83K2vA5rcMwWbzSbOmzdPrKurE81ms5ibmytWVlbu623tFZhMJnHdunXi5ZdfLi5atEi8+uqrxXXr1on9/f3jiN3Z2Skefvjh4quvvrqvtzyjN/WJqKysFFNTU8VbbrllxtYUZ4ncB7RbPlP4/vvv+fOf/8xHH30EwL333gvAHXfcsS+3tddhtVplqeFvv/2WoqIiVq5cybJly7jooou47LLLuOyyy/b1Nn+KmKtQ21doa2sjMTFR/v+EhATa2tr24Y72DdRqNccffzxPPvkkpaWlXH755XzyySfk5ORw/PHHzxF7P8PPJs+9J3Dn3fzcU2oqlYojjzySI488koceemivj/iZw/SYI7cX+Lkod+wuZksJdQ57hjm33AsUFRVRU1NDQ0MDFouF119/ndNPP31fb+tniQNJY2+2MUduL+Cq3LFgwQLOPffcGVHuaGlp4aijjmLBggUsWrSIRx55ZAZ2e+DiQNbYmw3MRcv3Idrb22lvb6ewsJChoSEWL17MO++8c8DpZ88UDmCNvblo+YGG2NhYCgsLAQgMDGTBggU/yyi8N/i5auztCeYCavsJGhsb2bp1617pd95f4Y3G3hy8x5xbvh9geHiYI444grvuuoszzzxzX29nv0N5eTnHHHOMXCMuZSsOII29ucaRAxFWq5VTTz2VE044gVtuuWVfb+cngQNQY2/uzH2gQRRFrrrqKhYsWDBH7DnMOOYs9z7Et99+y2GHHUZOTo7cP33PPffMSA+03W5nyZIlxMfHs27duj1ebw6zijmZpQMNhx56qE8qpb7gkUceYcGCBQwODs7K+nPY//Gzd8uLi4vJzc3FZDJhNBpZtGgRFRUV+3pbe4TW1lbef/99rr766n29lTnsQ0znlv8sIAjC3wAt4A+0iqJ47z7e0h5BEIRVwL1AIHCrKIqn7uMtzWEfYM4td+IvQDFgAvZIgHpfQxCEUwGDKIqbBUE4ch9vZw77ED97t3wMYUAATkun3cd72VMcApwuCEIj8DpwtCAIr+zbLc1hX2DOLQcEQViLkwipQKwoijfu4y3NCMYs95xb/jPFz94tFwThUsAmiuKrgiAogQ2CIBwtiuLn+3pvc5jDnmDOcs9hDgco5s7cc5jDAYo5cs9hDgco5sg9hzkcoJgj9xzmcIBijtxzmMMBijlyz2EOByjmyD2HORygmCP3HOZwgOL/AaJgSf7ygNsrAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", @@ -764,18 +1118,16 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([-1.1971, -1.3971, -0.7971])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[25]:\n", + "tensor([-1.1971, -1.3971, -0.7971])" + ] } ], "source": [ @@ -814,25 +1166,25 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'zimowe': 0,\n", - " 'moto': 1,\n", - " 'tenis': 2,\n", - " 'pilka-reczna': 3,\n", - " 'sporty-walki': 4,\n", - " 'koszykowka': 5,\n", - " 'siatkowka': 6,\n", - " 'pilka-nozna': 7}" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[85]:\n", + "#+BEGIN_EXAMPLE\n", + " {'zimowe': 0,\n", + " 'moto': 1,\n", + " 'tenis': 2,\n", + " 'pilka-reczna': 3,\n", + " 'sporty-walki': 4,\n", + " 'koszykowka': 5,\n", + " 'siatkowka': 6,\n", + " 'pilka-nozna': 7}\n", + "#+END_EXAMPLE" + ] } ], "source": [ @@ -870,9 +1222,17 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[8]:" + ] + } + ], "source": [ "import torch.nn as nn\n", "from torch import optim\n", @@ -895,18 +1255,16 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor(2.3026)" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[9]:\n", + "tensor(2.3026)" + ] } ], "source": [ @@ -931,245 +1289,14 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 1, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/lib/python3.9/site-packages/torch/nn/modules/container.py:119: UserWarning: Implicit dimension choice for log_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.0415690578520298 2.0784528255462646 0 0 tensor([[0.1251, 0.1250, 0.1249, 0.1248, 0.1250, 0.1251, 0.1252, 0.1249]],\n", - " grad_fn=) MŚ w hokeju: mocny początek Finów w Danii. Francja podniosła się po laniu od Rosjan Reprezentacja Finlandii po niepowodzeniach na ostatnich igrzyskach olimpijskich rozpoczęła dobrze tegoroczny turniej mistrzostw świata elity od pewnej wygranej z Koreą Południową. Francuzi zdobyli pierwsze punkty po pokonaniu Białorusi.\n", - "2.078942060470581 2.065171003341675 50 4 tensor([[0.1260, 0.1263, 0.1243, 0.1247, 0.1268, 0.1240, 0.1240, 0.1238]],\n", - " grad_fn=) Fotorelacja: Ważenie przed galą KSW 27 - Cage Time Prezentujemy fotorelację z oficjalnej ceremonii ważenia przed sobotnią galą KSW 27 - Cage Time.\n", - "2.06972599029541 2.1077024936676025 100 5 tensor([[0.1271, 0.1261, 0.1257, 0.1251, 0.1266, 0.1215, 0.1224, 0.1254]],\n", - " grad_fn=) Wisła podpisała swój najważniejszy kontrakt Gdyby nie firma Can-Pack S.A. nie byłoby w ostatnich latach wielkich sukcesów koszykarek z Krakowa. We wtorek ogłoszono przedłużenie umowy i koszykarki spod znaku Białej Gwiazdy nadal będą występować pod nazwą Wisła Can-Pack Kraków.\n", - "2.0650651454925537 2.0973997116088867 150 5 tensor([[0.1307, 0.1282, 0.1242, 0.1246, 0.1255, 0.1228, 0.1176, 0.1265]],\n", - " grad_fn=) Basket 90 znalazł nową podkoszową. W poprzednim sezonie grała w polskim klubie Nie trzeba było długo czekać na koszykarkę, która wypełni podkoszową lukę w Baskecie 90 Gdynia. Nową zawodniczką ekipy z Trójmiasta została Niemka Sonja Greinacher, która ostatni sezon spędziła w Wiśle CanPack Kraków.\n", - "2.0588021278381348 2.043689727783203 200 0 tensor([[0.1295, 0.1279, 0.1258, 0.1220, 0.1227, 0.1241, 0.1217, 0.1263]],\n", - " grad_fn=) Wicemistrzyni olimpijska zakończyła karierę Olga Wiłuchina podjęła decyzję o zakończeniu sportowej kariery. Największymi sukcesami rosyjskiej biathlonistki są dwa srebrne medale wywalczone na igrzyskach olimpijskich w Soczi.\n", - "2.0487422943115234 2.101975679397583 250 5 tensor([[0.1223, 0.1301, 0.1216, 0.1232, 0.1244, 0.1222, 0.1264, 0.1297]],\n", - " grad_fn=) Duże wzmocnienie reprezentacji Polski. Wraca Maciej Lampe Maciej Lampe dołączył już do reprezentacji Polski, która przygotowuje się do eliminacyjnych meczów z Litwą oraz Kosowem. 33-latek wraca do kadry po dwuletniej przerwie.\n", - "2.037230968475342 2.0833020210266113 300 5 tensor([[0.1307, 0.1343, 0.1224, 0.1174, 0.1203, 0.1245, 0.1220, 0.1284]],\n", - " grad_fn=) Kibice Celtów mogą spać spokojnie. Kyrie Irving planuje zostać w Bostonie Rozgrywający Boston Celtics, Kyrie Irving, przyznał, że w następne lato zamierza przedłużyć swoją umowę z klubem, o ile ten nadal będzie go uwzględniał w swoich planach.\n", - "2.036482095718384 2.0419692993164062 350 6 tensor([[0.1260, 0.1288, 0.1273, 0.1187, 0.1147, 0.1228, 0.1298, 0.1320]],\n", - " grad_fn=) We włoskiej Serie A nie ma żartów. Kolejny trener stracił posadę Brak cierpliwości włodarzy włoskich klubów charakteryzuje tegoroczne rozgrywki Serie A. Ostatnio z rolą szkoleniowca Exprivia Molfetta pożegnał się Vincenzo Di Pinto. Nie jest on pierwszym trenerem, który po 7. kolejce rozgrywek stracił posadę.\n", - "2.027297258377075 2.080472707748413 400 3 tensor([[0.1276, 0.1222, 0.1308, 0.1249, 0.1144, 0.1190, 0.1309, 0.1303]],\n", - " grad_fn=) Polska B rozpoczyna turniej w Płocku Od piątku do niedzieli w płockiej Orlen Arenie odbędzie się turniej z udziałem reprezentacji Polski B. Wezmą w nim też udział druga reprezentacja Danii, a także pierwsze kadry Wysp Owczych i Estonii.\n", - "2.007331371307373 2.0565202236175537 450 0 tensor([[0.1279, 0.1289, 0.1230, 0.1234, 0.1223, 0.1171, 0.1308, 0.1266]],\n", - " grad_fn=) Najpiękniesze polskie sportsmenki! Sprawdź kto znalazł się w zestawieniu! Przygotowaliśmy dla was zestawienie 20 najpiękniejszych polskich sportsmenek! Zgadzacie się z naszym wyborem? Swoje typy wpisujcie w komentarzach! Razem wybierzemy tę najładniejszą.\n", - "2.0114476680755615 1.9756197929382324 500 0 tensor([[0.1387, 0.1302, 0.1213, 0.1187, 0.1179, 0.1192, 0.1241, 0.1299]],\n", - " grad_fn=) Aleksander Zniszczoł został ojcem. Urodziła mu się córka Piątek był niezwykle ważnym dniem w życiu Aleksandra Zniszczoła. Polskiemu skoczkowi narciarskiemu urodziła się córka. Pochwalił się jej zdjęciem na Instagramie.\n", - "2.0088744163513184 2.0376784801483154 550 1 tensor([[0.1344, 0.1303, 0.1194, 0.1186, 0.1222, 0.1192, 0.1287, 0.1271]],\n", - " grad_fn=) Rajd Azorów: czołówka miała problemy. Łukjaniuk się broni Aleksiej Łukjaniuk pod nieobecność Kajetana Kajetanowicza obronił pozycję lidera klasyfikacji generalnej Rajdu Azorów. Do czołowej dziesiątki przebił się Łukasz Habaj.\n", - "1.996506929397583 2.0374131202697754 600 4 tensor([[0.1278, 0.1271, 0.1198, 0.1233, 0.1304, 0.1189, 0.1224, 0.1303]],\n", - " grad_fn=) Andrzej Kostyra: Ciosy muszą się kumulować Podczas sobotniej gali Tomasz Adamek zmierzy się z Arturem Szpilką. Andrzej Kostyra większe szanse daje temu pierwszemu, ale zauważa też pewne mankamenty.\n", - "1.9676146507263184 2.062831163406372 650 3 tensor([[0.1316, 0.1252, 0.1289, 0.1271, 0.1153, 0.1162, 0.1209, 0.1348]],\n", - " grad_fn=) IO 2016: skład Chorwacji na przygotowania do Rio. Na liście Lovro Mihić, Manuel Strlek i Ivan Cupić Chorwacki selekcjoner Żeljko Babić powołał kadrę na przygotowania do igrzysk olimpijskich w Rio de Janeiro. Na liście nazwisk nie zabrakło \"polskich\" akcentów. Na zgrupowanie pojadą Manuel Strlek, Lovro Mihić, Filip Ivić i Ivan Cupić.\n", - "1.9686769247055054 1.9732800722122192 700 2 tensor([[0.1150, 0.1331, 0.1390, 0.1131, 0.1125, 0.1158, 0.1246, 0.1468]],\n", - " grad_fn=) Andy Murray: Kostka boli, ale wszystko z nią w porządku W swoim felietonie dla BBC Andy Murray ocenił środowy pojedynek II rundy z Andriejem Rublowem i cieszył się z sukcesu Daniela Evansa w Australian Open 2017. Lider rankingu ATP przyznał, że z jego kostką jest wszystko w porządku.\n", - "1.975778341293335 1.8176090717315674 750 1 tensor([[0.1206, 0.1624, 0.1202, 0.1145, 0.1110, 0.1177, 0.1233, 0.1301]],\n", - " grad_fn=) Daniel Ricciardo sugeruje Red Bullowi wybór silnika Daniel Ricciardo przyznał, że patrząc na obecny rozwój jednostki napędowej Renault, byłby gotowy zaufać francuskiemu producentowi także w kolejnym sezonie F1.\n", - "1.9462422132492065 2.1149277687072754 800 3 tensor([[0.1257, 0.1381, 0.1296, 0.1206, 0.1066, 0.1248, 0.1234, 0.1312]],\n", - " grad_fn=) Kamil Mokrzki jako jedyny gracz Gwardii Opole dobił do granicy 100 goli 24-letni rozgrywający opolan był najlepszym strzelcem zespołu w sezonie 2015/2016. Drugiego w wewnętrznej klasyfikacji Antoniego Łangowskiego wyprzedził o 10 trafień.\n", - "1.976908564567566 2.0184948444366455 850 4 tensor([[0.1225, 0.1332, 0.1265, 0.1110, 0.1329, 0.1158, 0.1144, 0.1439]],\n", - " grad_fn=) Deontay Wilder rzucił wyzwanie Anthony'emu Joshui. \"Aż krew się we mnie gotuje!\" - Anthony Joshua to facet, z którym chcę walczyć - mówi Deontay Wilder. Mistrz świata organizacji WBC wyzwał Anglika na pojedynek i liczy na to, że ten potraktuje jego propozycję na poważnie.\n", - "1.9368045330047607 2.0249950885772705 900 2 tensor([[0.1283, 0.1323, 0.1320, 0.1175, 0.1187, 0.1193, 0.1178, 0.1341]],\n", - " grad_fn=) Ronaldo, Bouchard, Bolt. Gwiazdy sportu wybierają stroje na Halloween Znani sportowcy wzięli udział w zabawie w wymyślaniu kostiumów na wieczór halloweenowych szaleństw. Kto zaprezentował najbardziej oryginalne przebranie?\n", - "1.9382176399230957 1.9976595640182495 950 4 tensor([[0.1245, 0.1259, 0.1214, 0.1200, 0.1357, 0.1182, 0.1261, 0.1283]],\n", - " grad_fn=) Andrzej Kostyra stworzył \"idealnego polskiego boksera\". Jest dużo cech Tomasza Adamka Andrzej Kostyra, ekspert bokserski, stworzył model \"idealnego polskiego pięściarza\". Wymienił najlepsze cechy poszczególnych bokserów. Najwięcej jest Tomasza Adamka.\n", - "1.9289162158966064 1.93954336643219 1000 1 tensor([[0.1224, 0.1438, 0.1319, 0.1217, 0.1120, 0.1137, 0.1201, 0.1346]],\n", - " grad_fn=) Rajd Niemiec: Andreas Mikkelsen i Jari-Matti Latvala najszybsi na shakedown W czwartek kierowcy mieli do pokonania odcinek testowy przed Rajdem Niemiec. Na mecie okazało się, że Andreas Mikkelsen i Jari-Matti Latvala uzyskali identyczny czas.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.9244329929351807 1.9046193361282349 1050 4 tensor([[0.1264, 0.1245, 0.1287, 0.1161, 0.1489, 0.1108, 0.1173, 0.1274]],\n", - " grad_fn=) Była rywalka Joanny Jędrzejczyk na dopingu. Czeka ją zawieszenie Była pretendenta to tytułu mistrzyni UFC w wadze słomkowej, Jessica Penne (MMA 12-5) została zawieszona przez Amerykańską Agencję Antydopingową za stosowanie niedozwolonego środka. Amerykankę czeka 1,5-roczne zawieszenie.\n", - "1.9093575477600098 1.8683863878250122 1100 2 tensor([[0.1120, 0.1147, 0.1544, 0.1150, 0.1141, 0.1240, 0.1093, 0.1566]],\n", - " grad_fn=) Finał WTA Sydney: Radwańska - Konta na żywo. Transmisja TV, stream online W piątek Agnieszka Radwańska zmierzy się z Johanną Kontą w ramach finału WTA Sydney. Transmisja TV na antenie TVP 1 i TVP Sport. Stream online w sport.tvp.pl.\n", - "1.9156808853149414 1.9488784074783325 1150 7 tensor([[0.1212, 0.1255, 0.1152, 0.1314, 0.1246, 0.1175, 0.1223, 0.1424]],\n", - " grad_fn=) Piękne zachowanie piłkarza Borussii. Pomógł kibicowi Takim zachowaniem piłkarze zyskują ogromny szacunek u kibiców. Christian Pulisić uratował fana, którym podczas próby zrobienia wspólnego zdjęcia z zawodnikiem Borussii Dortmund zajęła się ochrona.\n", - "1.865915060043335 2.0229783058166504 1200 4 tensor([[0.1118, 0.1370, 0.1273, 0.1281, 0.1323, 0.1156, 0.1209, 0.1271]],\n", - " grad_fn=) W przyszłym roku dojdzie do walki Joshua - Kliczko. \"Umowa jest dogadana\" Po fiasku wcześniejszych negocjacji wreszcie osiągnięto porozumienie. W przyszłym roku Anthony Joshua zmierzy się z Władimirem Kliczką, a w stawce będą dwa pasy mistrzowskie - informują menadżerowie obu pięściarzy. Został tylko jeden warunek.\n", - "1.8945144414901733 1.8897364139556885 1250 4 tensor([[0.1133, 0.1289, 0.1184, 0.1151, 0.1511, 0.1224, 0.1233, 0.1275]],\n", - " grad_fn=) MMA: Bartosz Fabiński zasila powracającą Fighters Arenę Bartosz Fabiński wystąpi na gali Fighters Arena 9, która 8 czerwca odbędzie się w Józefowie. Dla zawodnika z Warszawy będzie to już czwarta walka w tym roku.\n", - "1.8801826238632202 1.9434046745300293 1300 7 tensor([[0.1161, 0.1170, 0.1131, 0.1465, 0.1035, 0.1276, 0.1331, 0.1432]],\n", - " grad_fn=) Oficjalnie: Polski mecz w Serie A! Godzinę przed pierwszym gwizdkiem (20:45) meczu między Sampdorią, a Napoli potwierdziły się doniesienia włoskiej prasy. Po raz pierwszy w obecnym sezonie to samo spotkanie Serie A rozpocznie w wyjściowej jedenastce aż 4 polskich piłkarzy.\n", - "1.8571587800979614 1.7821911573410034 1350 1 tensor([[0.1144, 0.1683, 0.1177, 0.1231, 0.1154, 0.1158, 0.1183, 0.1272]],\n", - " grad_fn=) Bernie Ecclestone: Ferrari ma lepszy bolid Zdaniem Berniego Ecclestone'a, sezon 2017 będzie należeć do Ferrari. Włoski zespół ma spore szanse na pierwszy mistrzowski tytuł wśród konstruktorów od wielu lat.\n", - "1.8645442724227905 1.7102112770080566 1400 1 tensor([[0.1178, 0.1808, 0.1133, 0.1189, 0.1132, 0.1201, 0.1122, 0.1236]],\n", - " grad_fn=) Sauber potwierdza brak Pascala Wehrleina na testach. Kto go zastąpi? Po czwartkowych medialnych doniesieniach, w piątek zespół Sauber F1 Team oficjalnie potwierdził, iż Pascal Wehrlein opuści pierwszą turę przedsezonowych testów pod Barceloną.\n", - "1.8554599285125732 1.6869465112686157 1450 6 tensor([[0.1019, 0.1060, 0.1191, 0.1386, 0.0958, 0.1353, 0.1851, 0.1181]],\n", - " grad_fn=) Polski Cukier Muszynianka Enea - Giacomini Budowlani: przełamać pasmo porażek W 7. kolejce Orlen Ligi siatkarki Polskiego Cukru Muszynianki Enea Muszyna podejmą Giacomini Budowlani Toruń. Przyjezdne w czterech ostatnich meczach rozgrywek nie wygrały nawet seta i tą złą serię chcą przerwać w Małopolsce.\n", - "1.8279104232788086 1.714797019958496 1500 6 tensor([[0.1144, 0.1189, 0.1099, 0.1389, 0.0904, 0.1316, 0.1800, 0.1159]],\n", - " grad_fn=) Przyjmująca zostaje w Toruniu. Budowlani zamknęli skład W sezonie 2017/2018 Orlen Ligi w Budowlanych Toruń nadal będzie występować Marina Paulava. Ta siatkarka zamknęła skład zespołu.\n", - "1.8161158561706543 1.6653008460998535 1550 7 tensor([[0.1023, 0.1056, 0.1212, 0.1180, 0.1061, 0.1216, 0.1361, 0.1891]],\n", - " grad_fn=) Borussia Dortmund - Red Bull Salzburg na żywo. Transmisja TV, stream online W czwartek, w ramach 1/8 finału Ligi Europy, odbędzie się mecz Borussia Dortmund - Red Bull Salzburg. Transmisja TV na antenie Eurosport 1. Stream online na platformie Eurosport Player i Ipla TV. Relacja LIVE w WP SportoweFakty.\n", - "1.8106026649475098 1.7794651985168457 1600 0 tensor([[0.1687, 0.1026, 0.1228, 0.1103, 0.1031, 0.1189, 0.1177, 0.1559]],\n", - " grad_fn=) PŚ w Lahti: konkurs drużynowy na żywo. Transmisja TV, stream online za darmo W sobotę, w ramach Pucharu Świata w skokach narciarskich w Lahti odbędzie się konkurs drużynowy. Transmisja TV na antenie TVP 1 i Eurosport. Stream online za darmo w WP Pilot. Relacja LIVE w WP SportoweFakty.\n", - "1.8139138221740723 1.8474551439285278 1650 5 tensor([[0.0952, 0.1068, 0.1138, 0.1381, 0.1080, 0.1576, 0.1367, 0.1438]],\n", - " grad_fn=) Panathinaikos ma dość Euroligi. Wielki klub chce się wycofać z rozgrywek! Koszykarska Euroliga bez Panathinaikosu Ateny? To bardzo możliwy scenariusz. Właściciel klubu - Dimitrios Giannakopoulos - zapowiedział wycofanie drużyny ze stolicy Grecji z elitarnych rozgrywek.\n", - "1.7931458950042725 1.8012076616287231 1700 4 tensor([[0.1271, 0.1361, 0.1166, 0.1189, 0.1651, 0.1104, 0.0992, 0.1267]],\n", - " grad_fn=) Tomasz Adamek wrócił na salę treningową. Zobacz, w jakiej formie jest \"Góral\" (wideo) Coraz więcej wskazuje na to, że Tomasz Adamek raz jeszcze powróci na ring. Były mistrz świata kategorii półciężkiej i junior ciężkiej regularnie pojawia się na sali treningowej. W jakiej formie jest 40-latek?\n", - "1.7960119247436523 1.8428459167480469 1750 0 tensor([[0.1584, 0.1005, 0.1063, 0.1628, 0.1017, 0.1219, 0.1320, 0.1165]],\n", - " grad_fn=) 18 zawodników w finskiej kadrze. Aino-Kaisa Saarinen poza reprezentacją Finowie ogłosili skład reprezentacji na nadchodzący Puchar Świata w biegach narciarskich. W drużynie znalazło się 8 zawodniczek i 10 zawodników.\n", - "1.807226300239563 1.7165520191192627 1800 4 tensor([[0.1068, 0.1123, 0.1059, 0.1050, 0.1797, 0.1230, 0.1325, 0.1348]],\n", - " grad_fn=) FEN 19: karta walk skompletowana Znamy ostatnie, dziesiąte zestawienie na gali Fight Exclusive Night 19 \"Bitwa o Wrocław\". W kategorii do 70 kilogramów w formule K-1 zmierzą się ze sobą Marcin Stopka (2-2) i Krzysztof Kottas (0-0).\n", - "1.812751293182373 1.8602548837661743 1850 1 tensor([[0.1217, 0.1556, 0.1244, 0.1248, 0.1093, 0.1198, 0.1167, 0.1277]],\n", - " grad_fn=) Rajd Nadwiślański: Grzegorz Grzyb Liderem Grzegorz Grzyb i Robert Hundla zostali liderami Rajdu Nadwiślańskiego po przejechaniu dwóch sobotnich odcinków specjalnych.\n", - "1.8123970031738281 2.012942314147949 1900 3 tensor([[0.1353, 0.1215, 0.1276, 0.1336, 0.1160, 0.1320, 0.1176, 0.1163]],\n", - " grad_fn=) Bundesliga: Berlińskie TGV. Kolejna stacja w Hanowerze Füchse Berlin w niedzielę powalczy w Hanowerze o dziewiąte kolejne zwycięstwo w sezonie. Takiego otwarcia „Lisy” nie miały jeszcze nigdy. Z kolei wieczorem polski pojedynek w Magdeburgu: Piotr Chrapkowski vs Andrzej Rojewski. Oba mecze w Sportklubie.\n", - "1.803969383239746 1.9510834217071533 1950 4 tensor([[0.1261, 0.1341, 0.1076, 0.1294, 0.1421, 0.1202, 0.1165, 0.1240]],\n", - " grad_fn=) Utytułowany pięściarz zakończył karierę Czterokrotny obrońca tytułu mistrza świata kategorii super średniej Mikkel Kessler ogłosił zakończenie kariery pięściarskiej. To najbardziej utytułowany zawodnik w historii duńskiego boksu.\n", - "1.7355947494506836 1.9419602155685425 2000 6 tensor([[0.1116, 0.0959, 0.1303, 0.1196, 0.1004, 0.1257, 0.1434, 0.1731]],\n", - " grad_fn=) KMŚ 2017: ZAKSA - Sarmayeh Bank Teheran na żywo. Gdzie oglądać transmisję TV i online? We wtorek, ZAKSA Kędzierzyn-Koźle zmierzy się z Sarmayeh Bank Teheran w ramach Klubowych Mistrzostw Świata w siatkówce. Transmisja TV na antenie Polsat Sport. Stream online w Ipla TV. Relacja LIVE w WP SportoweFakty za darmo.\n", - "1.7900081872940063 1.9909334182739258 2050 1 tensor([[0.1211, 0.1366, 0.1348, 0.1286, 0.1105, 0.1252, 0.1181, 0.1251]],\n", - " grad_fn=) Wakacyjny freestyle Przygońskiego i Pawlusiaka na pustyni Pędzące po wydmach dakarowe MINI, specjalnie dostosowany snowboard, lina i dwóch utalentowanych sportowców - tak w skrócie można opisać projekt \"Przygoński & Pawlusiak Dune Freestyle\".\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.732917308807373 1.869311809539795 2100 5 tensor([[0.1091, 0.1430, 0.1048, 0.1265, 0.1092, 0.1542, 0.1102, 0.1428]],\n", - " grad_fn=) Martynas Sajus: Sobin jest bardziej doświadczonym graczem, ale w przyszłości będę od niego lepszy Pojedynek Josipa Sobina z Martynasem Sajusem może być jednym ze smaczków piątkowego spotkania Anwilu z Polpharmą. Który ze środkowych da więcej swojej ekipie? - On jest bardziej doświadczony, ale w przyszłości to ja będę lepszy - śmieje się Sajus.\n", - "1.7519197463989258 1.5113999843597412 2150 2 tensor([[0.0979, 0.1257, 0.2206, 0.1103, 0.1044, 0.1174, 0.1050, 0.1187]],\n", - " grad_fn=) Łukasz Iwanek: Każda tenisistka może być Williams, nie każda może zostać Radwańską (komentarz) W II rundzie Australian Open najlepsza polska tenisistka została stłamszona przez rywalkę uderzającą szybko i celnie. Każda tenisistka może w pojedynczym meczu zostać Sereną Williams, nie każda może być Agnieszką Radwańską.\n", - "1.7391284704208374 1.7576707601547241 2200 5 tensor([[0.1100, 0.0950, 0.1158, 0.1438, 0.0986, 0.1724, 0.1352, 0.1291]],\n", - " grad_fn=) Kolejny występ Przemysława Karnowskiego w Lidze Letniej NBA Kolejny występ w rozgrywkach Ligi Letniej NBA zanotował Przemysław Karnowski. Polak, który reprezentuje Charlotte Hornets, w przegranym meczu z Indianą Pacers (77:84) zdobył cztery punkty i miał trzy zbiórki.\n", - "1.6613290309906006 1.5939650535583496 2250 1 tensor([[0.1039, 0.2031, 0.1056, 0.1095, 0.1230, 0.1114, 0.1109, 0.1326]],\n", - " grad_fn=) Niebieskie flagi mogą zniknąć z F1 Formuła 1 rozważa, czy nie zrezygnować ze stosowania niebieskich flag podczas wyścigu. W ostatnich sezonach kierowcy często narzekali, iż rywale nie stosowali się do takiej sygnalizacji.\n", - "1.6618765592575073 1.8819133043289185 2300 5 tensor([[0.1059, 0.1279, 0.1030, 0.1496, 0.1200, 0.1523, 0.1245, 0.1168]],\n", - " grad_fn=) Nemanja Jaramaz nowym zawodnikiem Anwilu Włocławek! Doskonale znany na polskich parkietach z występów w drużynie ze Zgorzelca Nemanja Jaramaz został nowym zawodnikiem Anwilu Włocławek. Kontrakt z Serbem będzie obowiązywał do końca bieżącego sezonu.\n", - "1.7553699016571045 1.767181396484375 2350 5 tensor([[0.1026, 0.1128, 0.1074, 0.1354, 0.1201, 0.1708, 0.1244, 0.1264]],\n", - " grad_fn=) TOP5 zagrań minionej nocy NBA (wideo) 3 mecze odbyły się w nocy z wtorku na środę w NBA, dlatego liga miała mniejszy wybór do zestawienia najlepszych akcji. Na czele listy TOP5 zagrań znalazły się rzuty z elektryzującej końcówki spotkania Dallas Mavericks-Portland Trail Blazers.\n", - "1.7372195720672607 1.911428689956665 2400 2 tensor([[0.1144, 0.1585, 0.1479, 0.1187, 0.1099, 0.1224, 0.1075, 0.1208]],\n", - " grad_fn=) Roger Federer będzie występował w Bazylei aż do 2019 roku Roger Federer potwierdził, że na pewno do sezonu 2019 będzie występował w turnieju Swiss Indoors Basel, który jest organizowany pod koniec października w jego rodzinnej miejscowości.\n", - "1.6716208457946777 1.7947263717651367 2450 4 tensor([[0.1103, 0.1306, 0.1188, 0.1233, 0.1662, 0.1171, 0.1099, 0.1239]],\n", - " grad_fn=) Łukasz Wichowski przed DSF Kickboxing Challenge: Będzie ciężka walka i duże widowisko Już w sobotę odbędzie się gala DSF Kickboxing Challenge: Bitwa w Piasecznie. Walką wieczoru będzie starcie Łukasza Wichowskiego z Piotrem Kołakowskim. - To dodatkowa mobilizacja - mówi Wichowski.\n", - "1.6898037195205688 1.8188705444335938 2500 5 tensor([[0.1094, 0.1339, 0.1127, 0.1308, 0.1144, 0.1622, 0.1076, 0.1290]],\n", - " grad_fn=) Specjaliści od dzikich kart. Co GTK Gliwice może wnieśc do PLK? GTK Gliwice prawdopodobnie będzie 17. zespołem w ekstraklasie. Przybliżamy sylwetkę ekipy ze Śląska, dla której gra w PLK będzie absolutnym debiutem.\n", - "1.6765027046203613 1.7608693838119507 2550 7 tensor([[0.1264, 0.1094, 0.1139, 0.1419, 0.1052, 0.1027, 0.1286, 0.1719]],\n", - " grad_fn=) Agent Oezila przerywa milczenie i oskarża reprezentantów Niemiec Erkut Sogut, agent Mesuta Oezila przemówił na temat zakończenia kariery reprezentacyjnej przez pomocnika. Oberwało się trzem reprezentantom Niemiec.\n", - "1.6664674282073975 1.6870511770248413 2600 5 tensor([[0.0995, 0.1290, 0.0842, 0.1347, 0.1221, 0.1851, 0.1054, 0.1400]],\n", - " grad_fn=) NBA: ci koszykarze nie mają jeszcze kontraktu Dobiega końca lipiec, a wciąż bez kontraktów na kolejny sezon pozostaje kilku zawodników o znanych nazwiskach. Najbardziej znany to oczywiście LeBron James, ale on akurat lada moment ma podpisać nową umowę z Cleveland Cavaliers.\n", - "1.66078519821167 1.0688396692276 2650 2 tensor([[0.0996, 0.0816, 0.3434, 0.1018, 0.0990, 0.0843, 0.0997, 0.0906]],\n", - " grad_fn=) ATP Toronto: Tuzin zwycięstw nad Gaelem Monfilsem. Novak Djoković zmierza po kolejne trofeum Novak Djoković powalczy w niedzielę z Keiem Nishikorim o triumf w turnieju ATP World Tour Masters 1000 na kortach twardych w Toronto. W sobotnim półfinale Serb pewnie rozprawił się z Gaelem Monfilsem, zwyciężając Francuza 6:3, 6:2.\n", - "1.6436724662780762 1.9171333312988281 2700 6 tensor([[0.1121, 0.1252, 0.0957, 0.1340, 0.1205, 0.1321, 0.1470, 0.1334]],\n", - " grad_fn=) Joanna Wołosz: Mamy prawo do małego dołka Chemik Police poniósł trzecią ligową porażkę, tym razem ze zdecydowanie niżej notowanym Atomem Trefl Sopot. Kryzys mistrza Polski? Joanna Wołosz uspokaja zaniepokojonych kibiców.\n", - "1.6387537717819214 2.009342670440674 2750 4 tensor([[0.1320, 0.1551, 0.1222, 0.1034, 0.1341, 0.1161, 0.1032, 0.1340]],\n", - " grad_fn=) Legenda MMA czuje się jak wrak człowieka. Przeszedł 22 operacje Po raz pierwszy trafił na stół operacyjny jako dziecko. Antonio Rodrigo Nogueira wpadł pod koła ciężarówki, walczył o życie. Później musiał poddawać się zabiegom po kontuzjach odniesionych na treningach i w walkach. - Jestem cały rozbity - przyznaje.\n", - "1.6333057880401611 1.2051695585250854 2800 2 tensor([[0.1204, 0.1072, 0.2996, 0.1030, 0.0922, 0.0858, 0.0877, 0.1041]],\n", - " grad_fn=) Ostatni sprawdzian Kamila Majchrzaka przed Rolandem Garrosem. Polak zagra w Niemczech Kamil Majchrzak weźmie udział w turnieju ATP Challenger Tour na kortach ziemnych w niemieckim Heilbronn. Dla Polaka będzie to ostatni sprawdzian przed eliminacjami do wielkoszlemowego Rolanda Garrosa 2018.\n", - "1.627921462059021 1.3342788219451904 2850 7 tensor([[0.1052, 0.0826, 0.1170, 0.1082, 0.0921, 0.1132, 0.1185, 0.2633]],\n", - " grad_fn=) Real Sociedad - Atletico Madryt na żywo. Gdzie oglądać transmisję TV i stream online? W czwartek, w ramach Primera Division, odbędzie się spotkanie Real Sociedad - Atletico Madryt. Transmisja TV na antenie Eleven Sports 1. Stream online w WP Pilot. Relacja LIVE w WP SportoweFakty.\n", - "1.6219871044158936 1.3970237970352173 2900 1 tensor([[0.1192, 0.2473, 0.1046, 0.0930, 0.0986, 0.1155, 0.1034, 0.1184]],\n", - " grad_fn=) Williams został w tyle za rywalami. \"Nie odrobiliśmy swojej pracy domowej\" Problemy Williamsa w tym sezonie zdają się nie mieć końca. Paddy Lowe jest zdania, że na sytuację wpływa zacięta rywalizacja w Formule 1. - Obecnie każdy z zespołów funkcjonuje na bardzo wysokim poziomie - twierdzi Brytyjczyk.\n", - "1.6522719860076904 1.618353247642517 2950 5 tensor([[0.1019, 0.1230, 0.0985, 0.1354, 0.1012, 0.1982, 0.1130, 0.1287]],\n", - " grad_fn=) Basket 90 Gdynia zamknął \"zagraniczną\" kadrę na nowy sezon Basket 90 Gdynia zakończył poszukiwania zawodniczek zagranicznych na sezon 2016/2017. Ostatnią koszykarką spoza granic naszego kraju, która związała się z ekipą z Trójmiasta, jest Litwinka Monika Grigalauskyte.\n", - "1.637782096862793 1.4863955974578857 3000 3 tensor([[0.0879, 0.0816, 0.1089, 0.2262, 0.0699, 0.1200, 0.1660, 0.1395]],\n", - " grad_fn=) Liga Mistrzów: Paris Saint-Germain HB kolejnym uczestnikiem Final Four Paris Saint-Germain HB zremisował z MOL-Pickiem Szeged 30:30 w rewanżowym meczu ćwierćfinałowym Ligi Mistrzów 2016/2017, tym samym zdobywając awans do turnieju finałowego w Kolonii.\n", - "1.619870662689209 1.955154538154602 3050 5 tensor([[0.0999, 0.1600, 0.1024, 0.1031, 0.1241, 0.1415, 0.1173, 0.1517]],\n", - " grad_fn=) Chewbacca ma nową twarz. Jak koszykarz z Finlandii trafił do \"Gwiezdnych Wojen\" Zbliżający się weekend będzie tym, w którym miliony fanów \"Gwiezdnych Wojen\" zaczną szturmować kina, by obejrzeć 8. część sagi. Wielu z nich nie wie, że za maską Chewbakki od niedawna skrywa się nowa twarz - fińskiego koszykarza, Joonasa Suotamo.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.6506901979446411 1.7881494760513306 3100 7 tensor([[0.1112, 0.1332, 0.0891, 0.1127, 0.1326, 0.1294, 0.1245, 0.1673]],\n", - " grad_fn=) Ireneusz Mamrot liczy na przełamanie. \"Jest sportowa złość, która musi się przełożyć na naszą korzyść\" - Nie ma zdenerwowania, ale jest duża sportowa złość. To musi się przełożyć na naszą korzyść - mówi przed sobotnim pojedynkiem z Koroną Kielce trener Jagiellonii Białystok, Ireneusz Mamrot. - Nie można wiecznie mieć gorszego okresu - dodaje.\n", - "1.508833408355713 1.5515254735946655 3150 2 tensor([[0.1030, 0.1194, 0.2119, 0.1182, 0.1020, 0.1099, 0.1084, 0.1272]],\n", - " grad_fn=) Roland Garros: bogaty program gier na środę. Matkowski czeka na dokończenie meczu z braćmi Bryanami Przez ostatnie dwa dni tenisiści niemal nie rywalizowali na kortach Rolanda Garrosa. Plan gier na 11. dzień turnieju jest naprawdę bogaty.\n", - "1.6437448263168335 1.6302305459976196 3200 4 tensor([[0.0948, 0.1278, 0.1326, 0.1141, 0.1959, 0.1060, 0.1182, 0.1106]],\n", - " grad_fn=) Deontaya Wildera czekają dwie operacje. Na ring wróci w 2017 roku Deontay Wilder bez problemów pokonał Chrisa Arreolę w Birmingham i obronił pas mistrza świata federacji WBC. Podczas pojedynku \"Brązowy Bombardier\" nabawił się jednak dwóch kontuzji, które na dłuższy okres wykluczą go z walk.\n", - "1.4642627239227295 1.6695131063461304 3250 5 tensor([[0.0890, 0.0942, 0.0919, 0.1390, 0.1155, 0.1883, 0.1545, 0.1275]],\n", - " grad_fn=) Sfrustrowany Tweety Carter: Powinienem zatrzymać Irelanda W ramach 20. kolejki PLK PGE Turów przegrał na własnym parkiecie z Treflem Sopot 79:81. - To bardzo, bardzo frustrująca porażka - mówi Tweety Carter, który zawiódł w ostatniej minucie tego starcia.\n", - "1.6304278373718262 1.61961829662323 3300 1 tensor([[0.1347, 0.1980, 0.1101, 0.1148, 0.1029, 0.1226, 0.1072, 0.1097]],\n", - " grad_fn=) Rajd Estonii: Kajetanowicz utrzymuje podium Polska załoga Kajetan Kajetanowicz - Jarosław Baran jest coraz bliżej sięgnięcia po kolejne podium w wyścigach ERC. Po pewne zwycięstwo w Rajdzie Estonii zmierza Aleksiej Łukjaniuk.\n", - "1.5721299648284912 1.6800715923309326 3350 5 tensor([[0.0974, 0.1165, 0.1068, 0.1207, 0.0953, 0.1864, 0.1084, 0.1685]],\n", - " grad_fn=) Basket Poznań wrócił na właściwe tory? \"Do stacji końcowej jeszcze daleka droga\" I-ligowy Biofarm Basket Poznań jest projektem, który skupia wokół siebie wielu młodych graczy. W zespole możemy znaleźć także dwóch doświadczonych zawodników, a jednym z nich jest Tomasz Smorawiński.\n", - "1.5134963989257812 1.3521889448165894 3400 4 tensor([[0.1069, 0.1058, 0.1011, 0.1071, 0.2587, 0.1109, 0.1051, 0.1044]],\n", - " grad_fn=) Łukasz Rambalski i Wojciech Wierzbicki w karcie walk gali FEN 10 Do ciekawej walki dojdzie na gali FEN 10, 9 stycznia w Lubinie. Jeden z najbardziej utytułowanych polskich zawodników kickboxingu, Łukasz Rambalski, zmierzy się z aktualnym zawodowym mistrzem Europy organizacji WAKO-PRO, Wojciechem Wierzbickim.\n", - "1.549106478691101 1.571334958076477 3450 5 tensor([[0.0968, 0.0769, 0.1763, 0.1565, 0.0749, 0.2078, 0.1182, 0.0928]],\n", - " grad_fn=) Świetny mecz Marcina Sroki. Sokół z Pogonią w finale turnieju w Prudniku Marcin Sroka zdobył 25 punktów i poprowadził Max Elektro Sokół Łańcut do zwycięstwa 95:69 nad BK NH Ostrava. W drugim półfinale międzynarodowego koszykarskiego turnieju w Prudniku gospodarze pokonali Jamalex Polonię 1912 Leszno.\n", - "1.5032646656036377 1.6780941486358643 3500 1 tensor([[0.1183, 0.1867, 0.1078, 0.1018, 0.1283, 0.1219, 0.1093, 0.1259]],\n", - " grad_fn=) Niki Lauda wspomina Jamesa Hunta. \"Jego cząstka żyje we mnie\" Przed laty rywalizacja Nikiego Laudy i Jamesa Hunta emocjonowała kibiców Formuły 1. Austriaka i Brytyjczyka, choć na torze byli rywalami, połączyła specjalna więź. - Jakaś cząstka Jamesa żyje teraz we mnie - mówi Lauda.\n", - "1.4585016965866089 1.3136595487594604 3550 1 tensor([[0.1022, 0.2688, 0.1059, 0.0846, 0.1267, 0.0953, 0.0952, 0.1213]],\n", - " grad_fn=) Eksperci o słowach Felipe Massy. \"Sam wykluczył się z walki o miejsce w Williamsie\" Felipe Massa w ostrych słowach skomentował możliwy powrót Roberta Kubicy do Formuły 1. - Wygląda na to, że Brazylijczyk sam wykluczył się z walki o miejsce w Williamsie - twierdzi Tiff Needell, były prowadzący \"Top Gear\".\n", - "1.634122371673584 1.5287344455718994 3600 3 tensor([[0.1117, 0.0900, 0.0921, 0.2168, 0.0921, 0.1187, 0.1387, 0.1400]],\n", - " grad_fn=) AMŚ: pierwsza wygrana Biało-Czerwonych. Polska rozbiła Chińskie Tajpej Reprezentacja Polski piłkarzy ręcznych odniosła pierwsze zwycięstwo na Akademickich Mistrzostwach Świata. Drużyna Piotra Przybeckiego zgodnie z oczekiwaniami pokonała Chińskie Tajpej (35:20).\n", - "1.4305871725082397 0.677993655204773 3650 2 tensor([[0.0742, 0.0567, 0.5076, 0.0746, 0.0622, 0.0691, 0.0898, 0.0657]],\n", - " grad_fn=) ATP Tokio: Kei Nishikori wygrał japońskie starcie. W II rundzie także Milos Raonić i Denis Shapovalov Faworyt gospodarzy Kei Nishikori w dwóch setach pokonał Yuichiego Sugitę w I rundzie rozgrywanego na kortach twardych w hali turnieju ATP World Tour 500 w Tokio. Do 1/8 finału awansowali też Kanadyjczycy - Milos Raonić i Denis Shapovalov.\n", - "1.5231139659881592 1.5078407526016235 3700 2 tensor([[0.1061, 0.1268, 0.2214, 0.0988, 0.0971, 0.1361, 0.1114, 0.1024]],\n", - " grad_fn=) James Blake jak Tommy Haas czy Feliciano Lopez. Został dyrektorem turnieju w Miami Organizatorzy turnieju Miami Open ogłosili, że nowym dyrektorem tych kobiecych i męskich zawodów został były amerykański tenisista, James Blake. Tym samym potwierdziły się medialne doniesienia z ostatnich tygodni.\n", - "1.4987030029296875 1.3921600580215454 3750 7 tensor([[0.1257, 0.0679, 0.0981, 0.1364, 0.0642, 0.1028, 0.1564, 0.2485]],\n", - " grad_fn=) Mundial 2018. Historyczny wyczyn reprezentacji Rosji! Takiego pogromu w meczu otwarcia jeszcze nie było Na inaugurację MŚ 2018 Rosja pokonała Arabię Saudyjską aż 5:0 i ustanowiła nowy rekord mundialu - nigdy wcześniej w meczu otwarcia mistrzostw świata nie padł tak wysoki wynik.\n", - "1.4943546056747437 1.572141408920288 3800 3 tensor([[0.1084, 0.1078, 0.1184, 0.2076, 0.0941, 0.1287, 0.1333, 0.1016]],\n", - " grad_fn=) Wojciech Gumiński odnalazł się w Azotach. \"Start w nowym klubie bywa trudny\" Przeciętny początek rozgrywek i znacznie lepsza druga połowa sezonu. Wojciech Gumiński zaczyna spełniać oczekiwania w Azotach Puławy, stał się czołowym strzelcem brązowych medalistów PGNiG Superligi.\n", - "1.497003436088562 1.9663035869598389 3850 2 tensor([[0.1422, 0.1162, 0.1400, 0.1578, 0.1107, 0.1187, 0.1132, 0.1012]],\n", - " grad_fn=) Rio 2016. To nie są igrzyska faworytów Tenisowe turnieje olimpijskie rządzą się swoimi prawami i wielkie niespodzianki są w nich na porządku dziennym, ale chyba mało kto przypuszczał, że w Rio de Janeiro dojdzie do aż tylu niespodziewanych rozstrzygnięć.\n", - "1.4387949705123901 1.7787644863128662 3900 5 tensor([[0.1041, 0.0926, 0.1015, 0.1573, 0.0961, 0.1688, 0.1598, 0.1197]],\n", - " grad_fn=) Niezawodny Klima, szalejący Obarek. Najlepsi gracze 18. kolejki I ligi Marcin Dymała oraz Maciej Klima to stali bywalce w naszym rankingu. Którzy zawodnicy znaleźli się jeszcze w najlepszej piątce 18. kolejki?\n", - "1.484657883644104 1.4367222785949707 3950 4 tensor([[0.0838, 0.1276, 0.1142, 0.1065, 0.2377, 0.1056, 0.1090, 0.1156]],\n", - " grad_fn=) Czołowy brytyjski pięściarz zaproponował pojedynek Tomaszowi Adamkowi Tomasz Adamek otrzymał propozycję walki z Davidem Pricem. Jak poinformował portal worldboxingnews.net, obóz brytyjskiego pięściarza złożył \"Góralowi\" atrakcyjną ofertę.\n", - "1.4598438739776611 1.393087387084961 4000 7 tensor([[0.0934, 0.1558, 0.0804, 0.0927, 0.1255, 0.1069, 0.0970, 0.2483]],\n", - " grad_fn=) Grzegorz Krychowiak na zakręcie. Mundial to ostatnia szansa Grzegorz Krychowiak znowu jest na zakręcie i musi szukać nowego klubu. Paris-Saint Germain chce się pozbyć Polaka na dobre. Mundial w Rosji to dla mistrzów Francji ostatnia szansa, żeby sprzedać go za godne pieniądze.\n", - "1.457613229751587 1.5666451454162598 4050 6 tensor([[0.0992, 0.1111, 0.0903, 0.1400, 0.0904, 0.1379, 0.2087, 0.1223]],\n", - " grad_fn=) ZAKSA Kędzierzyn-Koźle trenuje już niemal w komplecie Na początku tygodnia do kędzierzyńskiej drużyny dołączyli zawodnicy, którzy brali udział w mistrzostwach Europy. Wyjątkiem jest francuski rozgrywający Benjamin Toniutti.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.5241613388061523 1.2555674314498901 4100 1 tensor([[0.0736, 0.2849, 0.0687, 0.0741, 0.1105, 0.1044, 0.1124, 0.1713]],\n", - " grad_fn=) Krzysztof Hołowczyc trzyma kciuki za Kubicę. \"Ci, którzy nie chcą jego powrotu, po prostu się go boją\" Trwa walka Roberta Kubicy o powrót do Formuły 1. Polak jest jednym z kandydatów do reprezentowania w przyszłym sezonie barw zespołu Williams. Za Kubicę kciuki trzyma Krzysztof Hołowczyc.\n", - "1.4491897821426392 1.4376769065856934 4150 1 tensor([[0.1067, 0.2375, 0.1000, 0.0920, 0.1161, 0.1186, 0.1079, 0.1212]],\n", - " grad_fn=) Honda znów ma problem z silnikiem. \"Musimy znaleźć główną przyczynę niepowodzeń\" Honda po raz kolejny ma problemy ze swoim silnikiem. Japończycy uważają jednak, że w przypadku Brendona Hartleya we Francji doszło do innej usterki niż w jednostce napędowej Pierre'a Gasly'ego w Kanadzie.\n", - "1.5472668409347534 1.088613748550415 4200 2 tensor([[0.0726, 0.0993, 0.3367, 0.0966, 0.0821, 0.1155, 0.1074, 0.0897]],\n", - " grad_fn=) Jelena Janković marzy o drugim tygodniu Wimbledonu. We wtorek Serbka zagra z Agnieszką Radwańską Jelena Janković chciałaby dojść do drugiego tygodnia Wimbledonu 2017. Serbka będzie rywalką Agnieszki Radwańskiej w I rundzie.\n", - "1.4705555438995361 1.9431947469711304 4250 4 tensor([[0.1108, 0.1164, 0.1035, 0.1276, 0.1432, 0.1303, 0.1392, 0.1290]],\n", - " grad_fn=) Kontrowersyjny klub MMA w Chinach. Walczą 12-letnie dzieci W Enbo Fight Club trenuje nawet 400 młodych ludzi. Część z nich stanowią osierocone dzieci. Działalność klubu wywołuje spore emocje w Chinach.\n", - "1.43092679977417 0.8142336010932922 4300 1 tensor([[0.1201, 0.4430, 0.0652, 0.0700, 0.0814, 0.0788, 0.0731, 0.0684]],\n", - " grad_fn=) MotoGP: Marc Marquez najlepszy w ostatnim treningu Marc Marquez wygrał ostatnią sesję treningową przed wyścigiem o Grand Prix Ameryk na torze w Austin. Kolejne pozycje zajęli Dani Pedrosa oraz Maverick Vinales.\n", - "1.4218653440475464 1.5884473323822021 4350 3 tensor([[0.0741, 0.1260, 0.0926, 0.2042, 0.1069, 0.1427, 0.1266, 0.1269]],\n", - " grad_fn=) Rafał Przybylski odchodzi z Azotów Puławy. Kierunek - zagranica Rafał Przybylski po zakończeniu sezonu 2016/17 odejdzie z Azotów Puławy. 25-letni prawy rozgrywający wyjedzie z Polski. W jakim kierunku? Tego jeszcze nie wiadomo. Po Polaka zgłosiło się kilka klubów. Rozmowy trwają.\n", - "1.4193757772445679 0.8862718939781189 4400 2 tensor([[0.0847, 0.0764, 0.4122, 0.0851, 0.0743, 0.0953, 0.0912, 0.0808]],\n", - " grad_fn=) WTA Lugano: Stefanie Voegele wygrała dwudniowy mecz z Magdaleną Fręch. Polka jeszcze bez zwycięstwa w tourze Stefanie Vögele okazała się w dwóch setach lepsza od Magdaleny Fręch w I rundzie turnieju WTA International na kortach ziemnych w Lugano. Polska tenisistka musi jeszcze poczekać na premierową wygraną w głównym cyklu.\n", - "1.341277003288269 1.338065505027771 4450 0 tensor([[0.2624, 0.1457, 0.0720, 0.1037, 0.0733, 0.0957, 0.1212, 0.1260]],\n", - " grad_fn=) MŚ w Lahti: Niemcy na czele klasyfikacji medalowej. To był ich piątek marzeń Niemcy znajdą się na prowadzeniu w klasyfikacji medalowej mistrzostw świata w Lahti po trzech dniach imprezy. W piątkowych konkurencjach reprezentanci tego kraju byli zdecydowanie najlepsi.\n", - "1.4628310203552246 1.8150346279144287 4500 0 tensor([[0.1628, 0.1528, 0.0743, 0.1220, 0.0933, 0.1242, 0.1056, 0.1650]],\n", - " grad_fn=) Pjongczang 2018. Austriacy zabiorą nam Horngachera? Trzeba jak najszybciej podpisać kontrakt Stefan Horngacher, jeden z autorów trzeciego złota Kamila Stocha, nie ma jeszcze podpisanego nowego kontraktu. PZN powinien uczynić to jak najszybciej, by sprzed nosa świetnego trenera nie zabrali polskiej kadrze Austriacy.\n", - "1.4924497604370117 0.9571889042854309 4550 1 tensor([[0.0926, 0.3840, 0.0861, 0.0762, 0.1012, 0.0839, 0.0782, 0.0978]],\n", - " grad_fn=) Wewnętrzna rywalizacja w Red Bull Racing. \"Powinienem wiedzieć, gdzie jest limit\" Wewnętrzna rywalizacja Daniela Ricciardo z Maxem Verstappenem korzystnie wpływa na formę kierowców Red Bull Racing. Australijczyk zdradził jednak, że w niektórych wyścigach przesadził z jazdą na limicie. - Zawsze byłem przed nim - odpowiada Holender.\n", - "1.4929934740066528 1.107985496520996 4600 6 tensor([[0.0819, 0.0615, 0.0737, 0.1038, 0.0659, 0.1301, 0.3302, 0.1528]],\n", - " grad_fn=) Puchar Polski: Skra Bełchatów - Asseco Resovia na żywo. Gdzie oglądać transmisję? W środę, w ramach Pucharu Polski w siatkówce odbędzie się mecz PGE Skra Bełchatów - Asseco Resovia Rzeszów. Tranmisja TV na antenie Polsat Sport. Stream online w Ipla TV. Relacja LIVE w WP SportoweFakty.\n", - "1.4484540224075317 1.1233779191970825 4650 1 tensor([[0.0860, 0.3252, 0.0828, 0.1039, 0.0873, 0.0995, 0.1065, 0.1088]],\n", - " grad_fn=) Mercedes z czwartym tytułem z rzędu jako czwarty zespół w historii Mercedes dzięki wygranej Lewisa Hamiltona w Austin zapewnił sobie kolejny z rzędu tytuł mistrzowski, który klasyfikuje niemiecki zespół wśród największych stajni w historii Formuły 1.\n", - "1.4267841577529907 1.2113006114959717 4700 6 tensor([[0.0845, 0.0772, 0.0979, 0.1274, 0.0651, 0.1551, 0.2978, 0.0950]],\n", - " grad_fn=) PlusLiga: ta ostatnia, decydująca niedziela W niedzielę zostanie rozegrana ostatnia kolejka PlusLigi. Poznamy w niej odpowiedzi na pytania, które drużyny zagrają o medale, a która pożegna się z rozgrywkami. Czy Indykpol AZS, Asseco Resovia i Jastrzębski Węgiel wykorzystają potknięcie ONICO?\n", - "1.4323785305023193 0.9162018299102783 4750 0 tensor([[0.4000, 0.0968, 0.0801, 0.0819, 0.0717, 0.0828, 0.0906, 0.0960]],\n", - " grad_fn=) Hula, Żyła i Kubacki szczęśliwi po MŚ w lotach. Już szykują się na konkurs drużynowy Polscy skoczkowie byli w bardzo dobrych nastrojach po indywidualnych MŚ w lotach narciarskich. Teraz wszyscy są myślami przy niedzielnej rywalizacji drużynowej.\n", - "1.4645687341690063 1.0090150833129883 4800 1 tensor([[0.1288, 0.3646, 0.0872, 0.0714, 0.0701, 0.0955, 0.0767, 0.1057]],\n", - " grad_fn=) Maverick Vinales myśli tylko o wygranej. \"Walka o podium mi nie wystarczy\" Upadek w Grand Prix Holandii sprawił, że Maverick Vinales stracił prowadzenie w klasyfikacji generalnej MotoGP. Hiszpan ma teraz jeden cel. Wygrać wyścig na Sachsenringu i wrócić na szczyt tabeli.\n", - "1.4902528524398804 1.4393011331558228 4850 5 tensor([[0.0799, 0.1133, 0.1005, 0.1091, 0.1096, 0.2371, 0.1070, 0.1435]],\n", - " grad_fn=) Zagrał na własne życzenie i... doznał kontuzji. Co dalej z Markiem Carterem? Marc Carter za wszelką cenę chciał pomóc drużynie w meczu z PGE Turowem Zgorzelec (93:78). Niestety Amerykanin swój występ przepłacił kontuzją ścięgna Achillesa. Na razie nie wiadomo, jak poważny jest uraz jednego z czołowych zawodników BM Slam Stal.\n", - "1.431559443473816 1.245039463043213 4900 7 tensor([[0.0937, 0.0672, 0.0871, 0.1039, 0.0763, 0.1125, 0.1714, 0.2879]],\n", - " grad_fn=) Anglia - Nigeria na żywo. Transmisja TV, stream online W sobotę, w ramach meczu towarzyskiego, odbędzie się starcie Anglia - Nigeria. Transmisja TV na antenie Eleven Sports 1. Stream online w WP Pilot. Relacja LIVE w WP SportoweFakty.\n", - "1.3498646020889282 1.471439242362976 4950 5 tensor([[0.1090, 0.0782, 0.1236, 0.1252, 0.0868, 0.2296, 0.1287, 0.1189]],\n", - " grad_fn=) Liga Letnia NBA: Zespół Ponitki w ćwierćfinale, 4 punkty Polaka Mateusz Ponitka zdobył cztery punkty dla Denver Nuggets, którzy pokonali Utah Jazz 80:60 i awansowali do ćwierćfinału Ligi Letniej NBA w Las Vegas.\n" + "# Out[86]:" ] } ], @@ -1213,18 +1340,16 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([[0.0923, 0.1009, 0.0887, 0.0885, 0.0978, 0.3431, 0.0920, 0.0967]])" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[26]:\n", + "tensor([[0.0070, 0.0075, 0.0059, 0.0061, 0.0093, 0.9509, 0.0062, 0.0071]])" + ] } ], "source": [ @@ -1236,19 +1361,31 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 1, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([-0.6279, -0.6502, -0.6364, -0.6375, -0.5847, 0.6373, -0.6372, -0.6437],\n", - " grad_fn=)" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[89]:\n", + "#+BEGIN_EXAMPLE\n", + " Parameter containing:\n", + " tensor([[ 7.8818e-04, 1.0930e-03, 5.9632e-04, ..., 8.1697e-04,\n", + " 1.2976e-03, -8.4243e-04],\n", + " [-1.0164e-03, -8.9416e-04, -1.8650e-03, ..., 6.6075e-04,\n", + " -5.4883e-04, -1.1845e-03],\n", + " [-3.1395e-04, 1.8564e-03, -7.0267e-04, ..., -4.7028e-04,\n", + " 7.0584e-04, 9.8026e-04],\n", + " ...,\n", + " [ 4.8792e-05, 1.9183e-03, 1.3152e-03, ..., 4.6495e-04,\n", + " 9.5338e-04, 1.9107e-03],\n", + " [-5.2181e-04, 1.1135e-03, 7.1943e-04, ..., 3.7215e-04,\n", + " 1.0002e-03, -1.7985e-03],\n", + " [-9.1641e-04, 1.6301e-03, 1.7372e-03, ..., 1.2390e-03,\n", + " -9.1001e-04, 1.5711e-03]], requires_grad=True)\n", + "#+END_EXAMPLE" + ] } ], "source": [ @@ -1268,19 +1405,24 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[45]:" + ] + }, { "data": { - "image/png": "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\n", + "image/png": "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nYcffrh+38GDB/nqq69YsGDBYf0nT57MvHnzGD58OGeddRYlJSWsX7+eu+66i1tvvTUZ05AYaHlKRJpUvH47960sp7J6Pz18L2k90xk5ciQAU6dO5cEHH6zve9ttt7Fv3z7uvPNOPv/8c6qqqsjLy2PRokUMHjwYgL1791JQUMD777+PmfH1118nZV5y9HSmIc1auHAhFRUVyS5DkqB4/XZmLN7I9ur9OLBz3wGqa2opXr+9vo+Z1b/+9a9/TVpaWv32SSedRJ8+fVizZk1922233cZFF13Epk2beOaZZzhw4EBC5iLxo9A4hk2bNo2nnnqqyf2PPfYYH330ERkZGUf1fmnf7ltZzv6vDx7WVrtvF7fPWQzAE088wQUXXNDk+4877jiKi4tZsGABjz/+OFB3ptGrVy8AHnnkkdYpXFqVlqekSVOnTk12CZJEldX7v9XW5bt9+PC1FWRl/Sf9+/fnxhtv5JlnnmnyGN26dWPZsmWMGTOGbt268Ytf/IKCggJmzZrFD37wg9YsX1qJzjSS6IsvvuCKK65g6NChZGZmsnDhQu666y6GDx9OZmYmhYWFuDsAo0eP5uabb2bUqFGcffbZlJaWMmnSJPr3788vf/nL+mPOmjWLzMxMMjMzuf/+++vbFyxYQFZWFkOHDuWaa66pby8pKeH888+nX79+9WcN7k5RURGZmZkMGTKEhQsX1rffdNNNDBo0iCuuuIJdu3Yl4G9JkiU9teu3G83I+lERGzZsYNGiRXznO99h1apV5OTkAHV3WKWlpZGRkcGmTZsASE1NpbS0lLy8PM477zzee+891qxZw69+9SstfbZDOtNIomeffZb09HSWL18O1J26jxkzhttvvx2Aa665hmXLlvHDH/4QqDvdLykp4YEHHiAvL4+1a9fSo0cPzjzzTG6++WYqKiqYN28er7/+Ou7O97//fXJzcznuuOO4++67WbNmDWlpaezZs6e+hh07drB69WreffddrrzySvLz81m8eDFvvvkmb731Frt372b48OGMGjWKV199lfLycjZu3MjOnTsZNGgQ1113XeL/4iQhisYOZMbijYctUZkZRWMHJrEqSTaFRoI1vBvl5K8/Z/uKlfS45RbGjx/PhRdeyKJFi7j33nupqalhz549DB48uD40rrzySgCGDBnC4MGDOf300wHo168fH3/8MatXr2bi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", "text/plain": [ - "
" + "" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -1391,7 +1533,7 @@ "sportowych powyżej), tzn. rozkład prawdopodobieństwa możliwych etykiet\n", "uzyskujemy poprzez zastosowanie prostej warstwy liniowej i funkcji softmax:\n", "\n", - "$$p(l^k=i) = s(\\vec{w}\\vec{v}(t^k))_i = \\frac{e^{\\vec{w}\\vec{v}(t^k)}}{Z},$$\n", + "$$p(l^k=i) = s(W\\vec{v}(t^k))_i = \\frac{e^{W\\vec{v}(t^k)}}{Z},$$\n", "\n", "gdzie $\\vec{v}(t^k)$ to reprezentacja wektorowa tokenu $t^k$.\n", "Zauważmy, że tutaj (w przeciwieństwie do klasyfikacji całego tekstu)\n", @@ -1443,7 +1585,7 @@ "cały kontekst, dla *okna* o długości $c$ będzie to kontekst $t^{k-c},\\dots,t^k,\\dots,t^{k+c}$.\n", "Innymi słowy klasyfikujemy token na podstawie jego samego oraz jego kontekstu:\n", "\n", - "$$p(l^k=i) = \\frac{e^{\\vec{w}\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})}}{Z_k}.$$\n", + "$$p(l^k=i) = \\frac{e^{W\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})}}{Z_k}.$$\n", "\n", "Zauważmy, że w tej metodzie w ogóle nie rozpatrujemy sensowności\n", "sekwencji wyjściowej (etykiet), np. może być bardzo mało\n", @@ -1452,7 +1594,12 @@ "Napiszmy wzór określający prawdopodobieństwo całej sekwencji, nie\n", "tylko pojedynczego tokenu. Na razie będzie to po prostu iloczyn poszczególnych wartości.\n", "\n", - "$$p(l) = \\prod_{k=1}^K \\frac{e^{\\vec{w}\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})}}{Z_k} = \\frac{e^{\\sum_{k=1}^K\\vec{w}\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})}}{\\prod_{k=1}^K Z_k}$$\n", + "$$p(l) = \\prod_{k=1}^K \\frac{e^{W\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})}}{Z_k} = \\frac{e^{\\sum_{k=1}^KW\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})}}{\\prod_{k=1}^K Z_k}$$\n", + "\n", + "Reprezentacja kontekstu może być funkcją embeddingów wyrazów\n", + "(zakładamy, że embedding nie zależy od pozycji słowa).\n", + "\n", + "$$\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c}) = f(\\vec{E}(t^{k-c}),\\dots,\\vec{E}(t^k),\\dots,\\vec{E}({t^{k+c}})$$\n", "\n" ] }, @@ -1474,31 +1621,263 @@ "graf wyrażający „następowanie po” (czyli sekwencje). Do poprzedniego\n", "wzoru dodamy składnik $V_{i,j}$ (który można interpretować jako\n", "macierz) określający prawdopodobieństwo, że po etykiecie o numerze $i$ wystąpi etykieta o numerze $j$.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### **Pytanie**: Czy macierz $V$ musi być symetryczna? Czy $V_{i,j} = V_{j,i}$? Czy jakieś specjalne wartości występują na przekątnej?\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Macierz $V$ wraz z wektorem $\\vec{w}$ będzie stanowiła wyuczalne wagi w naszym modelu.\n", + "\n", + "**Pytanie**: Czy macierz $V$ musi być symetryczna? Czy $V_{i,j} = V_{j,i}$? Czy jakieś specjalne wartości występują na przekątnej?\n", + "\n", + "Macierz $V$ wraz z macierzą $W$ będzie stanowiła wyuczalne wagi w naszym modelu.\n", "\n", "Wartości $V_{i,j}$ nie stanowią bezpośrednio prawdopodobieństwa, mogą\n", - "przyjmować dowolne wartości, które będę normalizowane podobnie jak to się dzieje w funkcji Softmax.\n", + "przyjmować dowolne wartości, które będę normalizowane podobnie, tak jak to się dzieje w funkcji Softmax.\n", "\n", "W takiej wersji warunkowych pól losowych otrzymamy następujący wzór na prawdopodobieństwo całej sekwencji.\n", "\n", - "$$p(l) = \\frac{e^{\\sum_{k=1}^K\\vec{w}\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c}) + \\sum_{k=1}^{K-1} V_{l_k,l_{k+1}}}}{\\prod_{k=1}^K Z_k}$$\n", + "$$p(l) = \\frac{e^{\\sum_{k=1}^KW\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c}) + \\sum_{k=1}^{K-1} V_{l_k,l_{k+1}}}}{\\prod_{k=1}^K Z_k}$$\n", "\n" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Algorytm Viterbiego\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "W czasie inferencji mamy ustalone wagi funkcji $\\vec{v}(\\dots)$ oraz\n", + "macierz $V$. Szukamy sekwencji $y$ która maksymalizuje prawdopodobieństwo estymowane przez model:\n", + "\n", + "$$y = \\underset{l}{\\operatorname{argmax}} \\hat{p}(l|t^1,\\dots,t^K)$$\n", + "\n", + "Naiwne podejście polegające na obliczeniu prawdopodobieństw wszystkich możliwych sekwencji miałoby\n", + "nieakceptowalną złożoność czasową $O(|L|^K)$.\n", + "\n", + "Na szczęście, możemy użyć **algorytmu Viterbiego** o lepszej złożoności\n", + "obliczeniowej, algorytmu opartego na idei programowania dynamicznego.\n", + "\n", + "W algorytmie będziemy wypełniać dwuwymiarowe tabele $s[i, j]$ i $b[i, j]$:\n", + "\n", + "- $s[i, j]$ — będzie zawierać maksymalne prawdopodobieństwo (właściwie: nieznormalizowaną wartość,\n", + " która jest monotoniczna względem prawdopodobieństwa)\n", + " dla ciągów o długości $i$ zakończonych etykietą $l_j$,\n", + "- $b[i, j]$ — będzie zawierać „wskaźnik” wsteczny (*backpointer*) do podciągu o długości $i-1$, dla którego\n", + " razem z $l_j$ jest osiągana maksymalna wartość $s[i, j]$.\n", + "\n", + "Inicjalizacja:\n", + "\n", + "- $s[1, j] = (W\\vec{v}(t^k,\\dots,t^{k+c}))_j$,\n", + "- $b[1, j]$ — nie musimy wypełniać tej wartości.\n", + "\n", + "Dla $i > 1$ i dla każdego $j$ będziemy teraz szukać:\n", + "\n", + "$$\\underset{q \\in \\{1,\\dots,|V|\\}}{\\operatorname{max}} s[i-1, q] + (W\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c}))_j + V_{q, j}$$\n", + "\n", + "Tę wartość przypiszemy do $s[i, j]$, z kolei do $b[i, j]$ — indeks\n", + "$q$, dla którego ta największa wartość jest osiągnięta.\n", + "\n", + "Najpierw obliczenia wykonujemy wprzód wypełniając tabelę dla coraz większych wartości $j$.\n", + "W ten sposób otrzymamy największą wartość (nieznormalizowanego) prawdopodobieństwa:\n", + "\n", + "$$\\underset{q \\in \\{1,\\dots,|V|\\}}{\\operatorname{max}} s[K, q]$$\n", + "\n", + "oraz ostatnią etykietę:\n", + "\n", + "$$y^K = \\underset{q \\in \\{1,\\dots,|V|\\}}{\\operatorname{argmax}} s[K, q]$$\n", + "\n", + "Aby uzyskać cały ciąg, kierujemy się *wstecz* używając wskaźników:\n", + "\n", + "$$y^i = b[i, y^{i+1}]$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Złożoność obliczeniowa\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zauważmy, że rozmiar tabel $s$ i $b$ wynosi $K \\times |L|$, a koszt\n", + "wypełnienia każdej komórki to $|L|$, a zatem złożoność algorytmu jest wielomianowa:\n", + "$O(K|L|^2)$.\n", + "\n", + "**Pytanie:** Czy gdyby uzależnić etykietę nie tylko od poprzedniej\n", + "etykiety, lecz również od jeszcze wcześniejszej, to złożoność\n", + "obliczeniowa byłaby taka sama?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Przykład\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rozpatrzmy uproszczony przykład tagowania częściami mowy:\n", + "\n", + "- słownik $V=\\{\\mathit{Ala}, \\mathit{powieść}, \\mathit{ma}\\}$,\n", + "- zbiór etykiet $L=\\{\\mathit{C}, \\mathit{P}, \\mathit{R}\\}$,\n", + "- kontekst nie jest uwzględniany ($c = 0$).\n", + "\n", + "(To, że liczba słów i etykiet jest taka sama, jest przypadkowe, nie ma znaczenia)\n", + "\n", + "Zakładamy, że słowa reprezentujemy wektorowo za pomocą prostej reprezentacji one-hot.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[2]:\n", + "tensor([0., 1., 0.])" + ] + } + ], + "source": [ + "import torch\n", + "\n", + "vocab = ['Ala', 'ma', 'powieść']\n", + "labels = ['C', 'P', 'R']\n", + "\n", + "onehot = {\n", + " 'Ala': torch.tensor([1., 0., 0.]),\n", + " 'ma': torch.tensor([0., 1., 0.]),\n", + " 'powieść': torch.tensor([0., 0., 1.])\n", + " }\n", + "\n", + "onehot['ma']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Przyjmijmy, że w czasie uczenia zostały ustalone następujące wartości\n", + "macierzy $W$ i $V$ (samego procesu uczenia nie pokazujemy tutaj):\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[9]:\n", + "tensor([0.4983, 0.0034, 0.4983])" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "\n", + "matrixW = torch.tensor(\n", + " [[-1., 3.0, 3.0],\n", + " [0., 2.0, -2.0],\n", + " [4., -2.0, 3.0]])\n", + "\n", + "# rozkład prawdopodobieństwa, gdyby patrzeć tylko na słowo\n", + "nn.functional.softmax(matrixW @ onehot['powieść'], dim=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[10]:\n", + "tensor([0.1027, 0.1386, 0.7587])" + ] + } + ], + "source": [ + "import torch\n", + "import torch.nn as nn\n", + "\n", + "matrixV = torch.tensor(\n", + " [[-0.5, 1.5, 2.0],\n", + " [0.5, 0.8, 2.5],\n", + " [2.0, 0.8, 0.2]])\n", + "\n", + "# co występuje po przymiotniku? - rozkład prawdopodobieństwa\n", + "nn.functional.softmax(matrixV[1], dim=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Algorytm Viterbiego:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Out[16]:\n", + "[4.0, 3.5, 4.5]" + ] + } + ], + "source": [ + "d = ['Ala', 'ma', 'powieść']\n", + "\n", + "s = []\n", + "b = []\n", + "\n", + "# inicjalizacja\n", + "s.append(matrixW @ onehot[d[0]])\n", + "b.append(None)\n", + "\n", + "# wprzód\n", + "i = 1\n", + "os = []\n", + "ob = []\n", + "for j in range(0, len(labels)):\n", + " z = s[i-1] + matrixV[:,j] + matrixW @ onehot[d[i]]\n", + "\n", + " ns = torch.max(z).item()\n", + " nb = torch.argmax(z).item()\n", + "\n", + " os.append(ns)\n", + " ob.append(nb)\n", + "\n", + "os" + ] } ], "metadata": { diff --git a/wyk/09_neurozoo.org b/wyk/09_neurozoo.org index 4586151..288621b 100644 --- a/wyk/09_neurozoo.org +++ b/wyk/09_neurozoo.org @@ -1,5 +1,29 @@ * Neurozoo +** Kilka uwag dotyczących wektorów + +Wektor wierszowy $\left[x_1,\dots,x_n\right]$ czy kolumnowy $\left[\begin{array}{c} + x_1 \\ \vdots \\ x_n\end{array}\right]$? + +Często zakłada się wektor kolumny, będziemy używać *transpozycji*, by otrzymać wektor +wierszowy $\vec{x}^T = \left[x_1,\dots,x_n\right]$. + +W praktyce, np. w PyTorchu, może to nie mieć wielkiego znaczenia: + +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer +import torch +x = torch.tensor([1.0, -0.5, 2.0]) +x +#+END_SRC + +#+RESULTS: +:results: +# Out[2]: +: tensor([ 1.0000, -0.5000, 2.0000]) +:end: + +Musimy tylko uważać, jeśli przemnażamy wektor przez macierz! + ** Funkcja sigmoidalna Funkcja sigmoidalna zamienia dowolną wartość („sygnał”) w wartość z przedziału $(0,1)$, czyli wartość, która może być interperetowana jako prawdopodobieństwo. @@ -101,6 +125,210 @@ Funkcja sigmoidalna nie ma żadnych wyuczalnych wag. **** *Pytanie*: Czy można rozszerzyć funkcję sigmoidalną o jakieś wyuczalne wagi? ** Regresja liniowa +*** Iloczyn skalarny — przypomnienie + +$$\left[1.0, -0.5, 2.0\right] + \left[\begin{array}{c} + 3.0 \\ + 1.5 \\ + 0.0\end{array}\right] + = + 1.0 \cdot 3.0 + -0.5 \cdot 1.5 + 2.0 \cdot 0.0 = 2.25$$ +**** Intuicje + +- $\vec{a}^T \vec{b}$ mierzy jak bardzo $\vec{a}$ „pasuje” do + $\vec{b}$, +- … zwłaszcza gdy znormalizujemy wektory dzieląc przez $|\vec{a}|$ i $|\vec{b}|$: + $\frac{\vec{a}^T \vec{b}}{|\vec{a}||\vec{b}|} = \cos \theta$, + gdzie $\theta$ to kąt pomiędzy $\vec{a}$ and $\vec{b}$ (podobieństwo kosinusowe!) +- co, jeśli if $\vec{a}^T \vec{b} = 0$? — $\vec{a}$ i $\vec{b}$ są prostopadłe, np. + $\left[1, 2\right] \cdot \left[-2, -1\right]^T = 0$ +- a co, jeśli $\vec{a}^T \vec{b} = -1$ — wektor są skierowane w przeciwnym kierunku, jeśli dodatkowo $|\vec{a}|=|\vec{b}|=1$, np. + $\left[\frac{\sqrt{2}}{2},\frac{\sqrt{2}}{2}\right] \cdot \left[-\frac{\sqrt{2}}{2},-\frac{\sqrt{2}}{2}\right]^T = -1$ + +**** W PyTorchu + +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer +import torch +x = torch.tensor([1.0, -0.5, 2.0]) +y = torch.tensor([3.0, 1.5, 0.0]) +x @ y +#+END_SRC + +#+RESULTS: +:results: +# Out[3]: +: tensor(2.2500) +:end: + +*** Regresja liniowa jako element sieci neuronowej + +Przypomnijmy sobie wzór na regresję liniową: + +$$y = w_0 + w_1x_1 + w_2x_2 + \dots + w_{|V|}x_{|v|}$$ + +Jeśli wprowadzimy sztuczny element wektora $\vec{x}$ ustawiony zawsze na 1 ($x_0 = 1$), wówczas +wzór może przyjąc bardziej zwartą postać: + +$$y = \sum_{i=0}^{|V|} w_ix_i = \vec{w}\vec{x}$$ + +*** PyTorch + +**** Implementacja w PyTorchu + +Zakładamy, że wektor wejściowy *nie* obejmuje dodatkowego elementu $x_0 = 1$. + +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer + import torch + import torch.nn as nn + + class MyLinearRegressor(nn.Module): + def __init__(self, vlen): + super(MyLinearRegressor, self).__init__() + self.register_parameter(name='w', param=torch.nn.Parameter( + torch.zeros(vlen, dtype=torch.double, requires_grad=True))) + self.register_parameter(name='b', param=torch.nn.Parameter( + torch.tensor(0., dtype=torch.double, requires_grad=True))) + + def forward(self, x): + return self.b + x @ self.w + + regressor = MyLinearRegressor(3) + regressor(torch.tensor([0.3, 0.4, 1.0], dtype=torch.double)) +#+END_SRC + +#+RESULTS: +:results: +# Out[11]: +: tensor(0., dtype=torch.float64, grad_fn=) +:end: + +**** Gotowy moduł w PyTorchu + +Możemy skorzystać z ogólniejszej konstrukcji — warstwy liniowej (ale, +uwaga!, na wyjściu będzie wektor jednoelementowy). + +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer + import torch + import torch.nn as nn + + regressor = torch.nn.Linear(in_features=3, out_features=1, bias=True) + regressor(torch.tensor([0.3, 0.4, 1.0])) +#+END_SRC + +#+RESULTS: +:results: +# Out[18]: +: tensor([0.1882], grad_fn=) +:end: + +*** Zastosowania + +Bezpośrednio możemy zastosować do zadania regresji dla tekstu (np. +przewidywanie roku publikacji tekstu). + +[[./img-linear-regression.png]] + +W połączeniu z sigmoidą otrzymamy regresją logistyczną, np. dla zadania klasyfikacji tekstu: + +$$p(c|\vec{x}) = \sigma(w_0 + w_1x_1 + w_2x_2 + \dots + w_{|V|}x_{|v}) += \sigma(\Sigma_{i=0}^{|V|} w_ix_i) = \sigma(\vec{w}\vec{x})$$ + +[[./img-logistic-regression.png]] + +Tak sieć będzie aktywowana dla tekstu _aardvark in Aachen_: + +[[./img-logistic-regression-aardvark.png]] + +Regresje logistyczną (liniową zresztą też) dla tekstu możemy połączyć z trikiem z haszowaniem: + +\[p(c|\vec{x}) = \sigma(w_0 + w_1x_1 + w_2x_2 + \dots + w_{2^b}x_{2^b}) += \sigma(\Sigma_{i=0}^{2^b} w_ix_i) = \sigma(\vec{w}\vec{x})\] \\ +{\small hashing function $H : V \rightarrow \{1,\dots,2^b\}$, + e.g. MurmurHash3} + +[[./img-logistic-regression-hashing.png]] + +**Pytanie:** Jaki tekst otrzyma na pewno taką samą klasę jak _aardvark in Aachen_? + +*** Wagi + +Liczba wag jest równa rozmiarowi wektora wejściowego (oraz opcjonalnie +obciążenie). + +Każda waga odpowiada wyrazowi ze słownika, możemy więc interpretować +wagi jako jednowymiarowy parametr opisujący słowa. + +** Warstwa liniowa +*** Mnożenie macierzy przez wektor — przypomnienie + +Mnożenie macierzy przez wektor można interpretować jako zrównolegloną operację mnożenie wektora przez wektor. + + $$\left[\begin{array}{ccc} + \alert<2>{1.0} & \alert<2>{-2.0} & \alert<2>{3.0} \\ + \alert<3>{-2.0} & \alert<3>{0.0} & \alert<3>{10.0}\end{array}\right] + \left[\begin{array}{c} + \alert<2-3>{1.0} \\ + \alert<2-3>{-0.5} \\ + \alert<2-3>{2.0}\end{array}\right] + = + \left[\begin{array}{c} + \uncover<2->{\alert<2>{8.0}} \\ + \uncover<3->{\alert<3>{18.0}}\end{array}\right]$$ + + Jeśli przemnożymy macierz $n \times m$ przez wektor kolumnowy o długości + $m$, otrzymamy wektor o rozmiarze $n$. + +W PyTorchu: + +#+BEGIN_SRC ipython :session mysession :results file +import torch +m = torch.tensor([[1.0, -2.0, 3.0], + [-2.0, 0.0, 10.0]]) +x = torch.tensor([1.0, -0.5, 2.0]) +m @ x +#+END_SRC + +#+RESULTS: +[[file:# Out[19]: +: tensor([ 8., 18.])]] + +*** Definicja warstwy liniowej + +Warstwa liniowa polega na przemnożeniu wejścia przez macierz. Można +to intepretować jako zrównolegloną operację regresji liniowej (równolegle +uczymy czy wykonujemy $n$ regresji liniowych). + +*** PyTorch + +Warstwa liniowa, która przyjmuje wektor o rozmiarze 3 i zwraca wektor o rozmiarze 2. + +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer + import torch + import torch.nn as nn + + regressor = torch.nn.Linear(in_features=3, out_features=2, bias=True) + regressor(torch.tensor([0.3, 0.4, 1.0])) +#+END_SRC + +#+RESULTS: +:results: +# Out[23]: +: tensor([-1.1909, -0.5831], grad_fn=) +:end: + +*Pytanie*: Ile wag (parametrów) ma powyżej użyta warstwa? + +*** Zastosowania + +Warstwa liniowa jest podstawowym elementem sieci neuronowych — +począwszy od prostych sieci neuronowych feed-forward, gdzie warstwy +liniowe łączymy używając funkcji aktywacji (np. sigmoidy). + +Oto przykład prostej dwuwarstwowej sieci neuronowej do klasyfikacji binarnej. + +[[./img-feed-forward.png]] + ** Softmax @@ -576,7 +804,6 @@ Przykłady zastosowań: - oznaczanie etykiet nazw w zadaniu NER (nazwisko, kwoty, adresy — najwięcej tokenów będzie miało etykietę pustą, zazwyczaj oznaczaną przez ~O~) *** *Pytanie*: czy zadanie tłumaczenia maszynowego można potraktować jako problem etykietowania sekwencji? - *** Przykładowe wyzwanie NER CoNLL-2003 Zob. . @@ -590,7 +817,6 @@ W pierwszym polu oczekiwany wynik zapisany za pomocą notacji *BIO*. Jako metrykę używamy F1 (z pominięciem tagu ~O~) *** Metryka F1 - *** Etykietowanie za pomocą klasyfikacji wieloklasowej Można potraktować problem etykietowania dokładnie tak jak problem @@ -598,7 +824,7 @@ klasyfikacji wieloklasowej (jak w przykładzie klasyfikacji dyscyplin sportowych powyżej), tzn. rozkład prawdopodobieństwa możliwych etykiet uzyskujemy poprzez zastosowanie prostej warstwy liniowej i funkcji softmax: -$$p(l^k=i) = s(\vec{w}\vec{v}(t^k))_i = \frac{e^{\vec{w}\vec{v}(t^k)}}{Z},$$ +$$p(l^k=i) = s(W\vec{v}(t^k))_i = \frac{e^{W\vec{v}(t^k)}}{Z},$$ gdzie $\vec{v}(t^k)$ to reprezentacja wektorowa tokenu $t^k$. Zauważmy, że tutaj (w przeciwieństwie do klasyfikacji całego tekstu) @@ -626,7 +852,7 @@ Za pomocą wektora można przedstawić nie pojedynczy token $t^k$, lecz cały kontekst, dla /okna/ o długości $c$ będzie to kontekst $t^{k-c},\dots,t^k,\dots,t^{k+c}$. Innymi słowy klasyfikujemy token na podstawie jego samego oraz jego kontekstu: -$$p(l^k=i) = \frac{e^{\vec{w}\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c})}}{Z_k}.$$ +$$p(l^k=i) = \frac{e^{W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c})}}{Z_k}.$$ Zauważmy, że w tej metodzie w ogóle nie rozpatrujemy sensowności sekwencji wyjściowej (etykiet), np. może być bardzo mało @@ -635,7 +861,12 @@ prawdopodobne, że bezpośrednio po nazwisku występuje data. Napiszmy wzór określający prawdopodobieństwo całej sekwencji, nie tylko pojedynczego tokenu. Na razie będzie to po prostu iloczyn poszczególnych wartości. -$$p(l) = \prod_{k=1}^K \frac{e^{\vec{w}\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c})}}{Z_k} = \frac{e^{\sum_{k=1}^K\vec{w}\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c})}}{\prod_{k=1}^K Z_k}$$ +$$p(l) = \prod_{k=1}^K \frac{e^{W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c})}}{Z_k} = \frac{e^{\sum_{k=1}^KW\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c})}}{\prod_{k=1}^K Z_k}$$ + +Reprezentacja kontekstu może być funkcją embeddingów wyrazów +(zakładamy, że embedding nie zależy od pozycji słowa). + +$$\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}) = f(\vec{E}(t^{k-c}),\dots,\vec{E}(t^k),\dots,\vec{E}({t^{k+c}})$$ ** Warunkowe pola losowe @@ -646,13 +877,178 @@ graf wyrażający „następowanie po” (czyli sekwencje). Do poprzedniego wzoru dodamy składnik $V_{i,j}$ (który można interpretować jako macierz) określający prawdopodobieństwo, że po etykiecie o numerze $i$ wystąpi etykieta o numerze $j$. -*** *Pytanie*: Czy macierz $V$ musi być symetryczna? Czy $V_{i,j} = V_{j,i}$? Czy jakieś specjalne wartości występują na przekątnej? +*Pytanie*: Czy macierz $V$ musi być symetryczna? Czy $V_{i,j} = V_{j,i}$? Czy jakieś specjalne wartości występują na przekątnej? -Macierz $V$ wraz z wektorem $\vec{w}$ będzie stanowiła wyuczalne wagi w naszym modelu. +Macierz $V$ wraz z macierzą $W$ będzie stanowiła wyuczalne wagi w naszym modelu. Wartości $V_{i,j}$ nie stanowią bezpośrednio prawdopodobieństwa, mogą -przyjmować dowolne wartości, które będę normalizowane podobnie jak to się dzieje w funkcji Softmax. +przyjmować dowolne wartości, które będę normalizowane podobnie, tak jak to się dzieje w funkcji Softmax. W takiej wersji warunkowych pól losowych otrzymamy następujący wzór na prawdopodobieństwo całej sekwencji. -$$p(l) = \frac{e^{\sum_{k=1}^K\vec{w}\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}) + \sum_{k=1}^{K-1} V_{l_k,l_{k+1}}}}{\prod_{k=1}^K Z_k}$$ +$$p(l) = \frac{e^{\sum_{k=1}^KW\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}) + \sum_{k=1}^{K-1} V_{l_k,l_{k+1}}}}{\prod_{k=1}^K Z_k}$$ + +** Algorytm Viterbiego + +W czasie inferencji mamy ustalone wagi funkcji $\vec{v}(\dots)$ oraz +macierz $V$. Szukamy sekwencji $y$ która maksymalizuje prawdopodobieństwo estymowane przez model: + +$$y = \underset{l}{\operatorname{argmax}} \hat{p}(l|t^1,\dots,t^K)$$ + +Naiwne podejście polegające na obliczeniu prawdopodobieństw wszystkich możliwych sekwencji miałoby +nieakceptowalną złożoność czasową $O(|L|^K)$. + +Na szczęście, możemy użyć *algorytmu Viterbiego* o lepszej złożoności +obliczeniowej, algorytmu opartego na idei programowania dynamicznego. + +W algorytmie będziemy wypełniać dwuwymiarowe tabele $s[i, j]$ i $b[i, j]$: + +- $s[i, j]$ — będzie zawierać maksymalne prawdopodobieństwo (właściwie: nieznormalizowaną wartość, + która jest monotoniczna względem prawdopodobieństwa) + dla ciągów o długości $i$ zakończonych etykietą $l_j$, +- $b[i, j]$ — będzie zawierać „wskaźnik” wsteczny (/backpointer/) do podciągu o długości $i-1$, dla którego + razem z $l_j$ jest osiągana maksymalna wartość $s[i, j]$. + +Inicjalizacja: + +- $s[1, j] = (W\vec{v}(t^k,\dots,t^{k+c}))_j$, +- $b[1, j]$ — nie musimy wypełniać tej wartości. + +Dla $i > 1$ i dla każdego $j$ będziemy teraz szukać: + +$$\underset{q \in \{1,\dots,|V|}} \operatorname{max} s[i-1, q] + (W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}))_j + V_{q, j}$$ + +Tę wartość przypiszemy do $s[i, j]$, z kolei do $b[i, j]$ — indeks +$q$, dla którego ta największa wartość jest osiągnięta. + +Najpierw obliczenia wykonujemy wprzód wypełniając tabelę dla coraz większych wartości $j$. +W ten sposób otrzymamy największą wartość (nieznormalizowanego) prawdopodobieństwa: + +$$\underset{q \in \{1,\dots,|V|}} \operatorname{max} s[K, q]$$ + +oraz ostatnią etykietę: + +$$y^K = \underset{q \in \{1,\dots,|V|}} \operatorname{argmax} s[K, q]$$ + +Aby uzyskać cały ciąg, kierujemy się /wstecz/ używając wskaźników: + +$$y^i = b[i, y^{i+1}]$$ + +*** Złożoność obliczeniowa + +Zauważmy, że rozmiar tabel $s$ i $b$ wynosi $K \times |L|$, a koszt +wypełnienia każdej komórki to $|L|$, a zatem złożoność algorytmu jest wielomianowa: +$O(K|L|^2)$. + +*Pytanie:* Czy gdyby uzależnić etykietę nie tylko od poprzedniej +etykiety, lecz również od jeszcze wcześniejszej, to złożoność +obliczeniowa byłaby taka sama? + +*** Przykład + +Rozpatrzmy uproszczony przykład tagowania częściami mowy: + +- słownik $V=\{\mathit{Ala}, \mathit{powieść}, \mathit{ma}\}$, +- zbiór etykiet $L=\{\mathit{C}, \mathit{P}, \mathit{R}\}$, +- kontekst nie jest uwzględniany ($c = 0$). + +(To, że liczba słów i etykiet jest taka sama, jest przypadkowe, nie ma znaczenia) + +Zakładamy, że słowa reprezentujemy wektorowo za pomocą prostej reprezentacji one-hot. + +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer + import torch + + vocab = ['Ala', 'ma', 'powieść'] + labels = ['C', 'P', 'R'] + + onehot = { + 'Ala': torch.tensor([1., 0., 0.]), + 'ma': torch.tensor([0., 1., 0.]), + 'powieść': torch.tensor([0., 0., 1.]) + } + + onehot['ma'] +#+END_SRC + +#+RESULTS: +:results: +# Out[2]: +: tensor([0., 1., 0.]) +:end: + +Przyjmijmy, że w czasie uczenia zostały ustalone następujące wartości +macierzy $W$ i $V$ (samego procesu uczenia nie pokazujemy tutaj): + +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer + import torch + import torch.nn as nn + + matrixW = torch.tensor( + [[-1., 3.0, 3.0], + [0., 2.0, -2.0], + [4., -2.0, 3.0]]) + + # rozkład prawdopodobieństwa, gdyby patrzeć tylko na słowo + nn.functional.softmax(matrixW @ onehot['powieść'], dim=0) +#+END_SRC + +#+RESULTS: +:results: +# Out[9]: +: tensor([0.4983, 0.0034, 0.4983]) +:end: + + +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer + import torch + import torch.nn as nn + + matrixV = torch.tensor( + [[-0.5, 1.5, 2.0], + [0.5, 0.8, 2.5], + [2.0, 0.8, 0.2]]) + + # co występuje po przymiotniku? - rozkład prawdopodobieństwa + nn.functional.softmax(matrixV[1], dim=0) +#+END_SRC + +#+RESULTS: +:results: +# Out[10]: +: tensor([0.1027, 0.1386, 0.7587]) +:end: + +Algorytm Viterbiego: + +#+BEGIN_SRC ipython :session mysession :exports both :results raw drawer + d = ['Ala', 'ma', 'powieść'] + + s = [] + b = [] + + # inicjalizacja + s.append(matrixW @ onehot[d[0]]) + b.append(None) + + # wprzód + i = 1 + os = [] + ob = [] + for j in range(0, len(labels)): + z = s[i-1] + matrixV[:,j] + matrixW @ onehot[d[i]] + + ns = torch.max(z).item() + nb = torch.argmax(z).item() + + os.append(ns) + ob.append(nb) + + os +#+END_SRC + +#+RESULTS: +:results: +# Out[16]: +: [4.0, 3.5, 4.5] +:end: diff --git a/wyk/img-feed-forward.png b/wyk/img-feed-forward.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd5972253069482643db87cebf61de9d069b3c4 GIT binary patch literal 21213 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 literal 0 HcmV?d00001 diff --git a/wyk/img-logistic-regression-hashing.png b/wyk/img-logistic-regression-hashing.png new file mode 100644 index 0000000000000000000000000000000000000000..78aca9ba5ad83abcafc92392a6264eb955641c23 GIT binary patch literal 15248 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 DLt)%y literal 0 HcmV?d00001 diff --git a/wyk/img-logistic-regression.png b/wyk/img-logistic-regression.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0ffd91e7c4fd7bbfbee3e998fc8d863b34ac7f GIT binary patch literal 15050 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 literal 0 HcmV?d00001 From 340197a94c10b06f5b5b1569410e5ce4a61ac5a7 Mon Sep 17 00:00:00 2001 From: Filip Gralinski Date: Wed, 26 May 2021 13:48:10 +0200 Subject: [PATCH 2/2] fixes --- wyk/09_neurozoo.ipynb | 8 ++++---- wyk/09_neurozoo.org | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/wyk/09_neurozoo.ipynb b/wyk/09_neurozoo.ipynb index 6acddca..6fa0950 100644 --- a/wyk/09_neurozoo.ipynb +++ b/wyk/09_neurozoo.ipynb @@ -1533,7 +1533,7 @@ "sportowych powyżej), tzn. rozkład prawdopodobieństwa możliwych etykiet\n", "uzyskujemy poprzez zastosowanie prostej warstwy liniowej i funkcji softmax:\n", "\n", - "$$p(l^k=i) = s(W\\vec{v}(t^k))_i = \\frac{e^{W\\vec{v}(t^k)}}{Z},$$\n", + "$$p(l^k=j) = s(W\\vec{v}(t^k))_j = \\frac{e^{(W\\vec{v}(t^k))_j}}{Z},$$\n", "\n", "gdzie $\\vec{v}(t^k)$ to reprezentacja wektorowa tokenu $t^k$.\n", "Zauważmy, że tutaj (w przeciwieństwie do klasyfikacji całego tekstu)\n", @@ -1585,7 +1585,7 @@ "cały kontekst, dla *okna* o długości $c$ będzie to kontekst $t^{k-c},\\dots,t^k,\\dots,t^{k+c}$.\n", "Innymi słowy klasyfikujemy token na podstawie jego samego oraz jego kontekstu:\n", "\n", - "$$p(l^k=i) = \\frac{e^{W\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})}}{Z_k}.$$\n", + "$$p(l^k=j) = \\frac{e^{(W\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c}))_j}}{Z_k}.$$\n", "\n", "Zauważmy, że w tej metodzie w ogóle nie rozpatrujemy sensowności\n", "sekwencji wyjściowej (etykiet), np. może być bardzo mało\n", @@ -1594,7 +1594,7 @@ "Napiszmy wzór określający prawdopodobieństwo całej sekwencji, nie\n", "tylko pojedynczego tokenu. Na razie będzie to po prostu iloczyn poszczególnych wartości.\n", "\n", - "$$p(l) = \\prod_{k=1}^K \\frac{e^{W\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})}}{Z_k} = \\frac{e^{\\sum_{k=1}^KW\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})}}{\\prod_{k=1}^K Z_k}$$\n", + "$$p(l) = \\prod_{k=1}^K \\frac{e^{(W\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c}))_{l^k}}}{Z_k} = \\frac{e^{\\sum_{k=1}^K (W\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c})_{l^k})}}{\\prod_{k=1}^K Z_k} $$\n", "\n", "Reprezentacja kontekstu może być funkcją embeddingów wyrazów\n", "(zakładamy, że embedding nie zależy od pozycji słowa).\n", @@ -1631,7 +1631,7 @@ "\n", "W takiej wersji warunkowych pól losowych otrzymamy następujący wzór na prawdopodobieństwo całej sekwencji.\n", "\n", - "$$p(l) = \\frac{e^{\\sum_{k=1}^KW\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c}) + \\sum_{k=1}^{K-1} V_{l_k,l_{k+1}}}}{\\prod_{k=1}^K Z_k}$$\n", + "$$p(l) = \\frac{e^{\\sum_{k=1}^K (W\\vec{v}(t^{k-c},\\dots,t^k,\\dots,t^{k+c}))_{l^k} + \\sum_{k=1}^{K-1} V_{l^k,l^{k+1}}}}{\\prod_{k=1}^K Z_k}$$\n", "\n" ] }, diff --git a/wyk/09_neurozoo.org b/wyk/09_neurozoo.org index 288621b..75d6d64 100644 --- a/wyk/09_neurozoo.org +++ b/wyk/09_neurozoo.org @@ -824,7 +824,7 @@ klasyfikacji wieloklasowej (jak w przykładzie klasyfikacji dyscyplin sportowych powyżej), tzn. rozkład prawdopodobieństwa możliwych etykiet uzyskujemy poprzez zastosowanie prostej warstwy liniowej i funkcji softmax: -$$p(l^k=i) = s(W\vec{v}(t^k))_i = \frac{e^{W\vec{v}(t^k)}}{Z},$$ +$$p(l^k=j) = s(W\vec{v}(t^k))_j = \frac{e^{(W\vec{v}(t^k))_j}}{Z},$$ gdzie $\vec{v}(t^k)$ to reprezentacja wektorowa tokenu $t^k$. Zauważmy, że tutaj (w przeciwieństwie do klasyfikacji całego tekstu) @@ -852,7 +852,7 @@ Za pomocą wektora można przedstawić nie pojedynczy token $t^k$, lecz cały kontekst, dla /okna/ o długości $c$ będzie to kontekst $t^{k-c},\dots,t^k,\dots,t^{k+c}$. Innymi słowy klasyfikujemy token na podstawie jego samego oraz jego kontekstu: -$$p(l^k=i) = \frac{e^{W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c})}}{Z_k}.$$ +$$p(l^k=j) = \frac{e^{(W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}))_j}}{Z_k}.$$ Zauważmy, że w tej metodzie w ogóle nie rozpatrujemy sensowności sekwencji wyjściowej (etykiet), np. może być bardzo mało @@ -861,7 +861,7 @@ prawdopodobne, że bezpośrednio po nazwisku występuje data. Napiszmy wzór określający prawdopodobieństwo całej sekwencji, nie tylko pojedynczego tokenu. Na razie będzie to po prostu iloczyn poszczególnych wartości. -$$p(l) = \prod_{k=1}^K \frac{e^{W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c})}}{Z_k} = \frac{e^{\sum_{k=1}^KW\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c})}}{\prod_{k=1}^K Z_k}$$ +$$p(l) = \prod_{k=1}^K \frac{e^{(W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}))_{l^k}}}{Z_k} = \frac{e^{\sum_{k=1}^K (W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}))_{l^k}}}{\prod_{k=1}^K Z_k}$$ Reprezentacja kontekstu może być funkcją embeddingów wyrazów (zakładamy, że embedding nie zależy od pozycji słowa). @@ -886,7 +886,7 @@ przyjmować dowolne wartości, które będę normalizowane podobnie, tak jak to W takiej wersji warunkowych pól losowych otrzymamy następujący wzór na prawdopodobieństwo całej sekwencji. -$$p(l) = \frac{e^{\sum_{k=1}^KW\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}) + \sum_{k=1}^{K-1} V_{l_k,l_{k+1}}}}{\prod_{k=1}^K Z_k}$$ +$$p(l) = \frac{e^{\sum_{k=1}^K (W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}))_{l^k} + \sum_{k=1}^{K-1} V_{l^k,l^{k+1}}}}{\prod_{k=1}^K Z_k}$$ ** Algorytm Viterbiego @@ -916,7 +916,7 @@ Inicjalizacja: Dla $i > 1$ i dla każdego $j$ będziemy teraz szukać: -$$\underset{q \in \{1,\dots,|V|}} \operatorname{max} s[i-1, q] + (W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}))_j + V_{q, j}$$ +$$\underset{q \in \{1,\dots,|V|\}}{\operatorname{max}} s[i-1, q] + (W\vec{v}(t^{k-c},\dots,t^k,\dots,t^{k+c}))_j + V_{q, j}$$ Tę wartość przypiszemy do $s[i, j]$, z kolei do $b[i, j]$ — indeks $q$, dla którego ta największa wartość jest osiągnięta. @@ -924,11 +924,11 @@ $q$, dla którego ta największa wartość jest osiągnięta. Najpierw obliczenia wykonujemy wprzód wypełniając tabelę dla coraz większych wartości $j$. W ten sposób otrzymamy największą wartość (nieznormalizowanego) prawdopodobieństwa: -$$\underset{q \in \{1,\dots,|V|}} \operatorname{max} s[K, q]$$ +$$\underset{q \in \{1,\dots,|V|\}}{\operatorname{max}} s[K, q]$$ oraz ostatnią etykietę: -$$y^K = \underset{q \in \{1,\dots,|V|}} \operatorname{argmax} s[K, q]$$ +$$y^K = \underset{q \in \{1,\dots,|V|\}}{\operatorname{argmax}} s[K, q]$$ Aby uzyskać cały ciąg, kierujemy się /wstecz/ używając wskaźników: