From 6f01e37722d2e61f7e3df3e81591bd7fe3e2a4dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Sk=C3=B3rzewski?= Date: Mon, 23 Jan 2023 15:42:40 +0100 Subject: [PATCH] =?UTF-8?q?Wyk=C5=82ady=2012-15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wyk/12_Propagacja_wsteczna.ipynb | 1940 ++++++++++++++++++++++++ wyk/13_CNN.ipynb | 615 ++++++++ wyk/14_RNN.ipynb | 516 +++++++ wyk/15_Uczenie_przez_wzmacnianie.ipynb | 303 ++++ wyk/exp1.png | Bin 0 -> 27700 bytes wyk/exp2.png | Bin 0 -> 75326 bytes wyk/exp3.png | Bin 0 -> 51432 bytes wyk/nn3.png | Bin 0 -> 86587 bytes 8 files changed, 3374 insertions(+) create mode 100644 wyk/12_Propagacja_wsteczna.ipynb create mode 100644 wyk/13_CNN.ipynb create mode 100644 wyk/14_RNN.ipynb create mode 100644 wyk/15_Uczenie_przez_wzmacnianie.ipynb create mode 100644 wyk/exp1.png create mode 100644 wyk/exp2.png create mode 100644 wyk/exp3.png create mode 100644 wyk/nn3.png diff --git a/wyk/12_Propagacja_wsteczna.ipynb b/wyk/12_Propagacja_wsteczna.ipynb new file mode 100644 index 0000000..a603064 --- /dev/null +++ b/wyk/12_Propagacja_wsteczna.ipynb @@ -0,0 +1,1940 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# 12. Sieci neuronowe – propagacja wsteczna" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "import numpy as np\n", + "import math" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 12.1. Metoda propagacji wstecznej – wprowadzenie" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "\"Rys." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Architektura sieci neuronowych\n", + "\n", + "* Budowa warstwowa, najczęściej sieci jednokierunkowe i gęste.\n", + "* Liczbę i rozmiar warstw dobiera się do każdego problemu.\n", + "* Rozmiary sieci określane poprzez liczbę neuronów lub parametrów." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### _Feedforward_\n", + "\n", + "Mając daną $n$-warstwową sieć neuronową oraz jej parametry $\\Theta^{(1)}, \\ldots, \\Theta^{(L)} $ oraz $\\beta^{(1)}, \\ldots, \\beta^{(L)} $, obliczamy:\n", + "\n", + "$$a^{(l)} = g^{(l)}\\left( a^{(l-1)} \\Theta^{(l)} + \\beta^{(l)} \\right). $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "\"Rys." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Funkcje $g^{(l)}$ to **funkcje aktywacji**.
\n", + "Dla $i = 0$ przyjmujemy $a^{(0)} = x$ (wektor wierszowy cech) oraz $g^{(0)}(x) = x$ (identyczność)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* Parametry $\\Theta$ to wagi na połączeniach miedzy neuronami dwóch warstw.
\n", + "Rozmiar macierzy $\\Theta^{(l)}$, czyli macierzy wag na połączeniach warstw $a^{(l-1)}$ i $a^{(l)}$, to $\\dim(a^{(l-1)}) \\times \\dim(a^{(l)})$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Parametry $\\beta$ zastępują tutaj dodawanie kolumny z jedynkami do macierzy cech.
Macierz $\\beta^{(l)}$ ma rozmiar równy liczbie neuronów w odpowiedniej warstwie, czyli $1 \\times \\dim(a^{(l)})$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* **Klasyfikacja**: dla ostatniej warstwy $L$ (o rozmiarze równym liczbie klas) przyjmuje się $g^{(L)}(x) = \\mathop{\\mathrm{softmax}}(x)$.\n", + "* **Regresja**: pojedynczy neuron wyjściowy; funkcją aktywacji może wtedy być np. funkcja identycznościowa." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Jak uczyć sieci neuronowe?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* W poznanych do tej pory algorytmach (regresja liniowa, regresja logistyczna) do uczenia używaliśmy funkcji kosztu, jej gradientu oraz algorytmu gradientu prostego (GD/SGD)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* Dla sieci neuronowych potrzebowalibyśmy również znaleźć gradient funkcji kosztu." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Sprowadza się to do bardziej ogólnego problemu:
jak obliczyć gradient $\\nabla f(x)$ dla danej funkcji $f$ i wektora wejściowego $x$?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Pochodna funkcji\n", + "\n", + "* **Pochodna** mierzy, jak szybko zmienia się wartość funkcji względem zmiany jej argumentów:\n", + "\n", + "$$ \\frac{d f(x)}{d x} = \\lim_{h \\to 0} \\frac{ f(x + h) - f(x) }{ h } $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Pochodna cząstkowa i gradient\n", + "\n", + "* **Pochodna cząstkowa** mierzy, jak szybko zmienia się wartość funkcji względem zmiany jej *pojedynczego argumentu*." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* **Gradient** to wektor pochodnych cząstkowych:\n", + "\n", + "$$ \\nabla f = \\left( \\frac{\\partial f}{\\partial x_1}, \\ldots, \\frac{\\partial f}{\\partial x_n} \\right) $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "#### Gradient – przykłady" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "$$ f(x_1, x_2) = x_1 + x_2 \\qquad \\to \\qquad \\frac{\\partial f}{\\partial x_1} = 1, \\quad \\frac{\\partial f}{\\partial x_2} = 1, \\quad \\nabla f = (1, 1) $$ " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "$$ f(x_1, x_2) = x_1 \\cdot x_2 \\qquad \\to \\qquad \\frac{\\partial f}{\\partial x_1} = x_2, \\quad \\frac{\\partial f}{\\partial x_2} = x_1, \\quad \\nabla f = (x_2, x_1) $$ " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "$$ f(x_1, x_2) = \\max(x_1 + x_2) \\hskip{12em} \\\\\n", + "\\to \\qquad \\frac{\\partial f}{\\partial x_1} = \\mathbb{1}_{x \\geq y}, \\quad \\frac{\\partial f}{\\partial x_2} = \\mathbb{1}_{y \\geq x}, \\quad \\nabla f = (\\mathbb{1}_{x \\geq y}, \\mathbb{1}_{y \\geq x}) $$ " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Własności pochodnych cząstkowych\n", + "\n", + "Jezeli $f(x, y, z) = (x + y) \\, z$ oraz $x + y = q$, to:\n", + "$$f = q z,\n", + "\\quad \\frac{\\partial f}{\\partial q} = z,\n", + "\\quad \\frac{\\partial f}{\\partial z} = q,\n", + "\\quad \\frac{\\partial q}{\\partial x} = 1,\n", + "\\quad \\frac{\\partial q}{\\partial y} = 1 $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "#### Reguła łańcuchowa\n", + "\n", + "$$ \\frac{\\partial f}{\\partial x} = \\frac{\\partial f}{\\partial q} \\, \\frac{\\partial q}{\\partial x},\n", + "\\quad \\frac{\\partial f}{\\partial y} = \\frac{\\partial f}{\\partial q} \\, \\frac{\\partial q}{\\partial y} $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Propagacja wsteczna – prosty przykład" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "# Dla ustalonego wejścia\n", + "x = -2; y = 5; z = -4" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(3, -12)\n" + ] + } + ], + "source": [ + "# Krok w przód\n", + "q = x + y\n", + "f = q * z\n", + "print(q, f)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-4, -4, 3]\n" + ] + } + ], + "source": [ + "# Propagacja wsteczna dla f = q * z\n", + "# Oznaczmy symbolami `dfx`, `dfy`, `dfz`, `dfq` odpowiednio \n", + "# pochodne cząstkowe ∂f/∂x, ∂f/∂y, ∂f/∂z, ∂f/∂q\n", + "dfz = q\n", + "dfq = z\n", + "# Propagacja wsteczna dla q = x + y\n", + "dfx = 1 * dfq # z reguły łańcuchowej\n", + "dfy = 1 * dfq # z reguły łańcuchowej\n", + "print([dfx, dfy, dfz])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "\"Rys." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Właśnie tak wygląda obliczanie pochodnych metodą propagacji wstecznej!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* Spróbujmy czegoś bardziej skomplikowanego:
metodą propagacji wstecznej obliczmy pochodną funkcji sigmoidalnej." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Propagacja wsteczna – funkcja sigmoidalna" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Funkcja sigmoidalna:\n", + "\n", + "$$f(\\theta,x) = \\frac{1}{1+e^{-(\\theta_0 x_0 + \\theta_1 x_1 + \\theta_2)}}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "$$\n", + "\\begin{array}{lcl}\n", + "f(x) = \\frac{1}{x} \\quad & \\rightarrow & \\quad \\frac{df}{dx} = -\\frac{1}{x^2} \\\\\n", + "f_c(x) = c + x \\quad & \\rightarrow & \\quad \\frac{df}{dx} = 1 \\\\\n", + "f(x) = e^x \\quad & \\rightarrow & \\quad \\frac{df}{dx} = e^x \\\\\n", + "f_a(x) = ax \\quad & \\rightarrow & \\quad \\frac{df}{dx} = a \\\\\n", + "\\end{array}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "\"Rys." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.3932238664829637, -0.5898357997244456]\n", + "[-0.19661193324148185, -0.3932238664829637, 0.19661193324148185]\n" + ] + } + ], + "source": [ + "# Losowe wagi i dane\n", + "w = [2,-3,-3]\n", + "x = [-1, -2]\n", + "\n", + "# Krok w przód\n", + "dot = w[0]*x[0] + w[1]*x[1] + w[2]\n", + "f = 1.0 / (1 + math.exp(-dot)) # funkcja sigmoidalna\n", + "\n", + "# Krok w tył\n", + "ddot = (1 - f) * f # pochodna funkcji sigmoidalnej\n", + "dx = [w[0] * ddot, w[1] * ddot]\n", + "dw = [x[0] * ddot, x[1] * ddot, 1.0 * ddot]\n", + "\n", + "print(dx)\n", + "print(dw)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Obliczanie gradientów – podsumowanie" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Gradient $f$ dla $x$ mówi, jak zmieni się całe wyrażenie przy zmianie wartości $x$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* Gradienty łączymy, korzystając z **reguły łańcuchowej**." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* W kroku \"wstecz\" gradienty informują, które części grafu powinny być zwiększone lub zmniejszone (i z jaką siłą), aby zwiększyć wartość na wyjściu." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* W kontekście implementacji chcemy dzielić funkcję $f$ na części, dla których można łatwo obliczyć gradienty." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 12.2. Uczenie wielowarstwowych sieci neuronowych metodą propagacji wstecznej" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Mając algorytm SGD oraz gradienty wszystkich wag, moglibyśmy trenować każdą sieć." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Niech $\\Theta = (\\Theta^{(1)},\\Theta^{(2)},\\Theta^{(3)},\\beta^{(1)},\\beta^{(2)},\\beta^{(3)})$\n", + "* Funkcja sieci neuronowej z grafiki:\n", + "$$\\small h_\\Theta(x) = \\tanh(\\tanh(\\tanh(x\\Theta^{(1)}+\\beta^{(1)})\\Theta^{(2)} + \\beta^{(2)})\\Theta^{(3)} + \\beta^{(3)})$$\n", + "* Funkcja kosztu dla regresji:\n", + "$$J(\\Theta) = \\dfrac{1}{2m} \\sum_{i=1}^{m} (h_\\Theta(x^{(i)})- y^{(i)})^2 $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Jak obliczymy gradienty?\n", + "\n", + "$$\\nabla_{\\Theta^{(l)}} J(\\Theta) = ? \\quad \\nabla_{\\beta^{(l)}} J(\\Theta) = ?$$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### W kierunku propagacji wstecznej\n", + "\n", + "* Pewna (niewielka) zmiana wagi $\\Delta z^l_j$ dla $j$-ego neuronu w warstwie $l$ pociąga za sobą (niewielką) zmianę kosztu: \n", + "\n", + "$$\\frac{\\partial J(\\Theta)}{\\partial z^{l}_j} \\Delta z^{l}_j$$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Jeżeli $\\frac{\\partial J(\\Theta)}{\\partial z^{l}_j}$ jest duża, $\\Delta z^l_j$ ze znakiem przeciwnym zredukuje koszt.\n", + "* Jeżeli $\\frac{\\partial J(\\Theta)}{\\partial z^l_j}$ jest bliska zeru, koszt nie będzie mocno poprawiony." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Definiujemy błąd $\\delta^l_j$ neuronu $j$ w warstwie $l$: \n", + "\n", + "$$\\delta^l_j := \\dfrac{\\partial J(\\Theta)}{\\partial z^l_j}$$ \n", + "$$\\delta^l := \\nabla_{z^l} J(\\Theta) \\quad \\textrm{ (zapis wektorowy)} $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Podstawowe równania propagacji wstecznej\n", + "\n", + "$$\n", + "\\begin{array}{rcll}\n", + "\\delta^L & = & \\nabla_{a^L}J(\\Theta) \\odot { \\left( g^{L} \\right) }^{\\prime} \\left( z^L \\right) & (BP1) \\\\[2mm]\n", + "\\delta^{l} & = & \\left( \\left( \\Theta^{l+1} \\right) \\! ^\\top \\, \\delta^{l+1} \\right) \\odot {{ \\left( g^{l} \\right) }^{\\prime}} \\left( z^{l} \\right) & (BP2)\\\\[2mm]\n", + "\\nabla_{\\beta^l} J(\\Theta) & = & \\delta^l & (BP3)\\\\[2mm]\n", + "\\nabla_{\\Theta^l} J(\\Theta) & = & a^{l-1} \\odot \\delta^l & (BP4)\\\\\n", + "\\end{array}\n", + "$$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "#### (BP1)\n", + "$$ \\delta^L_j \\; = \\; \\frac{ \\partial J }{ \\partial a^L_j } \\, g' \\!\\! \\left( z^L_j \\right) $$\n", + "$$ \\delta^L \\; = \\; \\nabla_{a^L}J(\\Theta) \\odot { \\left( g^{L} \\right) }^{\\prime} \\left( z^L \\right) $$\n", + "Błąd w ostatniej warstwie jest iloczynem szybkości zmiany kosztu względem $j$-tego wyjścia i szybkości zmiany funkcji aktywacji w punkcie $z^L_j$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "#### (BP2)\n", + "$$ \\delta^{l} \\; = \\; \\left( \\left( \\Theta^{l+1} \\right) \\! ^\\top \\, \\delta^{l+1} \\right) \\odot {{ \\left( g^{l} \\right) }^{\\prime}} \\left( z^{l} \\right) $$\n", + "Aby obliczyć błąd w $l$-tej warstwie, należy przemnożyć błąd z następnej ($(l+1)$-szej) warstwy przez transponowany wektor wag, a uzyskaną macierz pomnożyć po współrzędnych przez szybkość zmiany funkcji aktywacji w punkcie $z^l$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "#### (BP3)\n", + "$$ \\nabla_{\\beta^l} J(\\Theta) \\; = \\; \\delta^l $$\n", + "Błąd w $l$-tej warstwie jest równy wartości gradientu funkcji kosztu." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "#### (BP4)\n", + "$$ \\nabla_{\\Theta^l} J(\\Theta) \\; = \\; a^{l-1} \\odot \\delta^l $$\n", + "Gradient funkcji kosztu względem wag $l$-tej warstwy można obliczyć jako iloczyn po współrzędnych $a^{l-1}$ przez $\\delta^l$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Algorytm propagacji wstecznej" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Dla pojedynczego przykładu $(x,y)$:\n", + "1. **Wejście**: Ustaw aktywacje w warstwie cech $a^{(0)}=x$ \n", + "2. **Feedforward:** dla $l=1,\\dots,L$ oblicz \n", + "$z^{(l)} = a^{(l-1)} \\Theta^{(l)} + \\beta^{(l)}$ oraz $a^{(l)}=g^{(l)} \\!\\! \\left( z^{(l)} \\right)$\n", + "3. **Błąd wyjścia $\\delta^{(L)}$:** oblicz wektor $$\\delta^{(L)}= \\nabla_{a^{(L)}}J(\\Theta) \\odot {g^{\\prime}}^{(L)} \\!\\! \\left( z^{(L)} \\right) $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "4. **Propagacja wsteczna błędu:** dla $l = L-1,L-2,\\dots,1$ oblicz $$\\delta^{(l)} = \\delta^{(l+1)}(\\Theta^{(l+1)})^T \\odot {g^{\\prime}}^{(l)} \\!\\! \\left( z^{(l)} \\right) $$\n", + "5. **Gradienty:** \n", + " * $\\dfrac{\\partial}{\\partial \\Theta_{ij}^{(l)}} J(\\Theta) = a_i^{(l-1)}\\delta_j^{(l)} \\textrm{ oraz } \\dfrac{\\partial}{\\partial \\beta_{j}^{(l)}} J(\\Theta) = \\delta_j^{(l)}$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "W naszym przykładzie:\n", + "\n", + "$$\\small J(\\Theta) = \\frac{1}{2} \\left( a^{(L)} - y \\right) ^2 $$\n", + "$$\\small \\dfrac{\\partial}{\\partial a^{(L)}} J(\\Theta) = a^{(L)} - y$$\n", + "\n", + "$$\\small \\tanh^{\\prime}(x) = 1 - \\tanh^2(x)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "\"Rys." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Algorytm SGD z propagacją wsteczną\n", + "\n", + "Pojedyncza iteracja:\n", + "1. Dla parametrów $\\Theta = (\\Theta^{(1)},\\ldots,\\Theta^{(L)})$ utwórz pomocnicze macierze zerowe $\\Delta = (\\Delta^{(1)},\\ldots,\\Delta^{(L)})$ o takich samych wymiarach (dla uproszczenia opuszczono wagi $\\beta$)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "2. Dla $m$ przykładów we wsadzie (*batch*), $i = 1,\\ldots,m$:\n", + " * Wykonaj algortym propagacji wstecznej dla przykładu $(x^{(i)}, y^{(i)})$ i przechowaj gradienty $\\nabla_{\\Theta}J^{(i)}(\\Theta)$ dla tego przykładu;\n", + " * $\\Delta := \\Delta + \\dfrac{1}{m}\\nabla_{\\Theta}J^{(i)}(\\Theta)$\n", + "3. Wykonaj aktualizację wag: $\\Theta := \\Theta - \\alpha \\Delta$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Propagacja wsteczna – podsumowanie\n", + "\n", + "* Algorytm pierwszy raz wprowadzony w latach 70. XX w.\n", + "* W 1986 David Rumelhart, Geoffrey Hinton i Ronald Williams pokazali, że jest znacznie szybszy od wcześniejszych metod.\n", + "* Obecnie najpopularniejszy algorytm uczenia sieci neuronowych." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 12.3. Przykłady implementacji wielowarstwowych sieci neuronowych" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "### Uwaga!\n", + "\n", + "Poniższe przykłady wykorzystują interfejs [Keras](https://keras.io), który jest częścią biblioteki [TensorFlow](https://www.tensorflow.org).\n", + "\n", + "Aby uruchomić TensorFlow w środowisku Jupyter, należy wykonać następujące czynności:\n", + "\n", + "#### Przed pierwszym uruchomieniem (wystarczy wykonać tylko raz)\n", + "\n", + "Instalacja biblioteki TensorFlow w środowisku Anaconda:\n", + "\n", + "1. Uruchom *Anaconda Navigator*\n", + "1. Wybierz kafelek *CMD.exe Prompt*\n", + "1. Kliknij przycisk *Launch*\n", + "1. Pojawi się konsola. Wpisz następujące polecenia, każde zatwierdzając wciśnięciem klawisza Enter:\n", + "```\n", + "conda create -n tf tensorflow\n", + "conda activate tf\n", + "conda install pandas matplotlib\n", + "jupyter notebook\n", + "```\n", + "\n", + "#### Przed każdym uruchomieniem\n", + "\n", + "Jeżeli chcemy korzystać z biblioteki TensorFlow, to środowisko Jupyter Notebook należy uruchomić w następujący sposób:\n", + "\n", + "1. Uruchom *Anaconda Navigator*\n", + "1. Wybierz kafelek *CMD.exe Prompt*\n", + "1. Kliknij przycisk *Launch*\n", + "1. Pojawi się konsola. Wpisz następujące polecenia, każde zatwierdzając wciśnięciem klawisza Enter:\n", + "```\n", + "conda activate tf\n", + "jupyter notebook\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Przykład: MNIST\n", + "\n", + "_Modified National Institute of Standards and Technology database_" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "* Zbiór cyfr zapisanych pismem odręcznym\n", + "* 60 000 przykładów uczących, 10 000 przykładów testowych\n", + "* Rozdzielczość każdego przykładu: 28 × 28 = 784 piksele" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "from tensorflow import keras\n", + "from tensorflow.keras.datasets import mnist\n", + "from tensorflow.keras.layers import Dense, Dropout\n", + "\n", + "# załaduj dane i podziel je na zbiory uczący i testowy\n", + "(x_train, y_train), (x_test, y_test) = mnist.load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "def draw_examples(examples, captions=None):\n", + " plt.figure(figsize=(16, 4))\n", + " m = len(examples)\n", + " for i, example in enumerate(examples):\n", + " plt.subplot(100 + m * 10 + i + 1)\n", + " plt.imshow(example, cmap=plt.get_cmap('gray'))\n", + " plt.show()\n", + " if captions is not None:\n", + " print(6 * ' ' + (10 * ' ').join(str(captions[i]) for i in range(m)))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 5 0 4 1 9 2 1\n" + ] + } + ], + "source": [ + "draw_examples(x_train[:7], captions=y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60000 przykładów uczących\n", + "10000 przykładów testowych\n" + ] + } + ], + "source": [ + "num_classes = 10\n", + "\n", + "x_train = x_train.reshape(60000, 784) # 784 = 28 * 28\n", + "x_test = x_test.reshape(10000, 784)\n", + "x_train = x_train.astype('float32')\n", + "x_test = x_test.astype('float32')\n", + "x_train /= 255\n", + "x_test /= 255\n", + "print('{} przykładów uczących'.format(x_train.shape[0]))\n", + "print('{} przykładów testowych'.format(x_test.shape[0]))\n", + "\n", + "# przekonwertuj wektory klas na binarne macierze klas\n", + "y_train = keras.utils.to_categorical(y_train, num_classes)\n", + "y_test = keras.utils.to_categorical(y_test, num_classes)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "dense (Dense) (None, 512) 401920 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 512) 262656 \n", + "_________________________________________________________________\n", + "dense_2 (Dense) (None, 10) 5130 \n", + "=================================================================\n", + "Total params: 669,706\n", + "Trainable params: 669,706\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = keras.Sequential()\n", + "model.add(Dense(512, activation='relu', input_shape=(784,)))\n", + "# model.add(Dropout(0.2))\n", + "model.add(Dense(512, activation='relu'))\n", + "# model.add(Dropout(0.2))\n", + "model.add(Dense(num_classes, activation='softmax'))\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(60000, 784) (60000, 10)\n" + ] + } + ], + "source": [ + "print(x_train.shape, y_train.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/5\n", + "469/469 [==============================] - 14s 31ms/step - loss: 0.2219 - accuracy: 0.9312 - val_loss: 0.1181 - val_accuracy: 0.9620\n", + "Epoch 2/5\n", + "469/469 [==============================] - 14s 30ms/step - loss: 0.0831 - accuracy: 0.9746 - val_loss: 0.0928 - val_accuracy: 0.9726\n", + "Epoch 3/5\n", + "469/469 [==============================] - 15s 31ms/step - loss: 0.0538 - accuracy: 0.9835 - val_loss: 0.0892 - val_accuracy: 0.9762\n", + "Epoch 4/5\n", + "321/469 [===================>..........] - ETA: 4s - loss: 0.0389 - accuracy: 0.9881 ETA: - E -" + ] + } + ], + "source": [ + "model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.RMSprop(), metrics=['accuracy'])\n", + "\n", + "model.fit(x_train, y_train, batch_size=128, epochs=5, verbose=1,\n", + " validation_data=(x_test, y_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test loss: 0.08859136700630188\n", + "Test accuracy: 0.9771999716758728\n" + ] + } + ], + "source": [ + "score = model.evaluate(x_test, y_test, verbose=0)\n", + "\n", + "print('Test loss: {}'.format(score[0]))\n", + "print('Test accuracy: {}'.format(score[1]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Warstwa _dropout_ to metoda regularyzacji, służy zapobieganiu nadmiernemu dopasowaniu sieci. Polega na tym, że część węzłów sieci jest usuwana w sposób losowy." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_22\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "dense_62 (Dense) (None, 512) 401920 \n", + "_________________________________________________________________\n", + "dense_63 (Dense) (None, 512) 262656 \n", + "_________________________________________________________________\n", + "dense_64 (Dense) (None, 10) 5130 \n", + "=================================================================\n", + "Total params: 669,706\n", + "Trainable params: 669,706\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/5\n", + "469/469 [==============================] - 10s 20ms/step - loss: 0.2203 - accuracy: 0.9317 - val_loss: 0.0936 - val_accuracy: 0.9697\n", + "Epoch 2/5\n", + "469/469 [==============================] - 10s 21ms/step - loss: 0.0816 - accuracy: 0.9746 - val_loss: 0.0747 - val_accuracy: 0.9779\n", + "Epoch 3/5\n", + "469/469 [==============================] - 10s 20ms/step - loss: 0.0544 - accuracy: 0.9827 - val_loss: 0.0674 - val_accuracy: 0.9798\n", + "Epoch 4/5\n", + "469/469 [==============================] - 10s 22ms/step - loss: 0.0384 - accuracy: 0.9879 - val_loss: 0.0746 - val_accuracy: 0.9806\n", + "Epoch 5/5\n", + "469/469 [==============================] - 10s 22ms/step - loss: 0.0298 - accuracy: 0.9901 - val_loss: 0.0736 - val_accuracy: 0.9801\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Bez warstw Dropout\n", + "\n", + "num_classes = 10\n", + "\n", + "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", + "\n", + "x_train = x_train.reshape(60000, 784) # 784 = 28 * 28\n", + "x_test = x_test.reshape(10000, 784)\n", + "x_train = x_train.astype('float32')\n", + "x_test = x_test.astype('float32')\n", + "x_train /= 255\n", + "x_test /= 255\n", + "\n", + "y_train = keras.utils.to_categorical(y_train, num_classes)\n", + "y_test = keras.utils.to_categorical(y_test, num_classes)\n", + "\n", + "model_no_dropout = keras.Sequential()\n", + "model_no_dropout.add(Dense(512, activation='relu', input_shape=(784,)))\n", + "model_no_dropout.add(Dense(512, activation='relu'))\n", + "model_no_dropout.add(Dense(num_classes, activation='softmax'))\n", + "model_no_dropout.summary()\n", + "\n", + "model_no_dropout.compile(loss='categorical_crossentropy',\n", + " optimizer=keras.optimizers.RMSprop(),\n", + " metrics=['accuracy'])\n", + "\n", + "model_no_dropout.fit(x_train, y_train,\n", + " batch_size=128,\n", + " epochs=5,\n", + " verbose=1,\n", + " validation_data=(x_test, y_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test loss (no dropout): 0.07358124107122421\n", + "Test accuracy (no dropout): 0.9800999760627747\n" + ] + } + ], + "source": [ + "# Bez warstw Dropout\n", + "\n", + "score = model_no_dropout.evaluate(x_test, y_test, verbose=0)\n", + "\n", + "print('Test loss (no dropout): {}'.format(score[0]))\n", + "print('Test accuracy (no dropout): {}'.format(score[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_23\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "dense_65 (Dense) (None, 2500) 1962500 \n", + "_________________________________________________________________\n", + "dense_66 (Dense) (None, 2000) 5002000 \n", + "_________________________________________________________________\n", + "dense_67 (Dense) (None, 1500) 3001500 \n", + "_________________________________________________________________\n", + "dense_68 (Dense) (None, 1000) 1501000 \n", + "_________________________________________________________________\n", + "dense_69 (Dense) (None, 500) 500500 \n", + "_________________________________________________________________\n", + "dense_70 (Dense) (None, 10) 5010 \n", + "=================================================================\n", + "Total params: 11,972,510\n", + "Trainable params: 11,972,510\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/10\n", + "469/469 [==============================] - 129s 275ms/step - loss: 0.9587 - accuracy: 0.7005 - val_loss: 0.5066 - val_accuracy: 0.8566\n", + "Epoch 2/10\n", + "469/469 [==============================] - 130s 276ms/step - loss: 0.2666 - accuracy: 0.9234 - val_loss: 0.3376 - val_accuracy: 0.9024\n", + "Epoch 3/10\n", + "469/469 [==============================] - 130s 277ms/step - loss: 0.1811 - accuracy: 0.9477 - val_loss: 0.1678 - val_accuracy: 0.9520\n", + "Epoch 4/10\n", + "469/469 [==============================] - 134s 287ms/step - loss: 0.1402 - accuracy: 0.9588 - val_loss: 0.1553 - val_accuracy: 0.9576\n", + "Epoch 5/10\n", + "469/469 [==============================] - 130s 278ms/step - loss: 0.1153 - accuracy: 0.9662 - val_loss: 0.1399 - val_accuracy: 0.9599\n", + "Epoch 6/10\n", + "469/469 [==============================] - 130s 277ms/step - loss: 0.0956 - accuracy: 0.9711 - val_loss: 0.1389 - val_accuracy: 0.9612\n", + "Epoch 7/10\n", + "469/469 [==============================] - 131s 280ms/step - loss: 0.0803 - accuracy: 0.9761 - val_loss: 0.1008 - val_accuracy: 0.9724\n", + "Epoch 8/10\n", + "469/469 [==============================] - 134s 286ms/step - loss: 0.0685 - accuracy: 0.9797 - val_loss: 0.1137 - val_accuracy: 0.9679\n", + "Epoch 9/10\n", + "469/469 [==============================] - 130s 278ms/step - loss: 0.0602 - accuracy: 0.9819 - val_loss: 0.1064 - val_accuracy: 0.9700\n", + "Epoch 10/10\n", + "469/469 [==============================] - 129s 274ms/step - loss: 0.0520 - accuracy: 0.9843 - val_loss: 0.1095 - val_accuracy: 0.9698\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Więcej warstw, inna funkcja aktywacji\n", + "\n", + "num_classes = 10\n", + "\n", + "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", + "\n", + "x_train = x_train.reshape(60000, 784) # 784 = 28 * 28\n", + "x_test = x_test.reshape(10000, 784)\n", + "x_train = x_train.astype('float32')\n", + "x_test = x_test.astype('float32')\n", + "x_train /= 255\n", + "x_test /= 255\n", + "\n", + "y_train = keras.utils.to_categorical(y_train, num_classes)\n", + "y_test = keras.utils.to_categorical(y_test, num_classes)\n", + "\n", + "model3 = Sequential()\n", + "model3.add(Dense(2500, activation='tanh', input_shape=(784,)))\n", + "model3.add(Dense(2000, activation='tanh'))\n", + "model3.add(Dense(1500, activation='tanh'))\n", + "model3.add(Dense(1000, activation='tanh'))\n", + "model3.add(Dense(500, activation='tanh'))\n", + "model3.add(Dense(num_classes, activation='softmax'))\n", + "model3.summary()\n", + "\n", + "model3.compile(loss='categorical_crossentropy',\n", + " optimizer=keras.optimizers.RMSprop(),\n", + " metrics=['accuracy'])\n", + "\n", + "model3.fit(x_train, y_train,\n", + " batch_size=128,\n", + " epochs=10,\n", + " verbose=1,\n", + " validation_data=(x_test, y_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test loss: 0.10945799201726913\n", + "Test accuracy: 0.9697999954223633\n" + ] + } + ], + "source": [ + "# Więcej warstw, inna funkcja aktywacji\n", + "\n", + "score = model3.evaluate(x_test, y_test, verbose=0)\n", + "\n", + "print('Test loss: {}'.format(score[0]))\n", + "print('Test accuracy: {}'.format(score[1]))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Przykład: 4-pikselowy aparat fotograficzny\n", + "\n", + "https://www.youtube.com/watch?v=ILsA4nyG7I0" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "def generate_example(description):\n", + " variant = random.choice([1, -1])\n", + " if description == 's': # solid\n", + " return (np.array([[ 1.0, 1.0], [ 1.0, 1.0]]) if variant == 1 else\n", + " np.array([[-1.0, -1.0], [-1.0, -1.0]]))\n", + " elif description == 'v': # vertical\n", + " return (np.array([[ 1.0, -1.0], [ 1.0, -1.0]]) if variant == 1 else\n", + " np.array([[-1.0, 1.0], [-1.0, 1.0]]))\n", + " elif description == 'd': # diagonal\n", + " return (np.array([[ 1.0, -1.0], [-1.0, 1.0]]) if variant == 1 else\n", + " np.array([[-1.0, 1.0], [ 1.0, -1.0]]))\n", + " elif description == 'h': # horizontal\n", + " return (np.array([[ 1.0, 1.0], [-1.0, -1.0]]) if variant == 1 else\n", + " np.array([[-1.0, -1.0], [ 1.0, 1.0]]))\n", + " else:\n", + " return np.array([[random.uniform(-1, 1), random.uniform(-1, 1)],\n", + " [random.uniform(-1, 1), random.uniform(-1, 1)]])" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "import random\n", + "\n", + "num_classes = 4\n", + "\n", + "trainset_size = 4000\n", + "testset_size = 1000\n", + "\n", + "y4_train = np.array([random.choice(['s', 'v', 'd', 'h']) for i in range(trainset_size)])\n", + "x4_train = np.array([generate_example(desc) for desc in y4_train])\n", + "\n", + "y4_test = np.array([random.choice(['s', 'v', 'd', 'h']) for i in range(testset_size)])\n", + "x4_test = np.array([generate_example(desc) for desc in y4_test])" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " s d h s d v v\n" + ] + } + ], + "source": [ + "draw_examples(x4_train[:7], captions=y4_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "x4_train = x4_train.reshape(trainset_size, 4)\n", + "x4_test = x4_test.reshape(testset_size, 4)\n", + "x4_train = x4_train.astype('float32')\n", + "x4_test = x4_test.astype('float32')\n", + "\n", + "y4_train = np.array([{'s': 0, 'v': 1, 'd': 2, 'h': 3}[desc] for desc in y4_train])\n", + "y4_test = np.array([{'s': 0, 'v': 1, 'd': 2, 'h': 3}[desc] for desc in y4_test])\n", + "\n", + "y4_train = keras.utils.to_categorical(y4_train, num_classes)\n", + "y4_test = keras.utils.to_categorical(y4_test, num_classes)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_24\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "dense_71 (Dense) (None, 4) 20 \n", + "_________________________________________________________________\n", + "dense_72 (Dense) (None, 4) 20 \n", + "_________________________________________________________________\n", + "dense_73 (Dense) (None, 8) 40 \n", + "_________________________________________________________________\n", + "dense_74 (Dense) (None, 4) 36 \n", + "=================================================================\n", + "Total params: 116\n", + "Trainable params: 116\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model4 = keras.Sequential()\n", + "model4.add(Dense(4, activation='tanh', input_shape=(4,)))\n", + "model4.add(Dense(4, activation='tanh'))\n", + "model4.add(Dense(8, activation='relu'))\n", + "model4.add(Dense(num_classes, activation='softmax'))\n", + "model4.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "model4.layers[0].set_weights(\n", + " [np.array([[ 1.0, 0.0, 1.0, 0.0],\n", + " [ 0.0, 1.0, 0.0, 1.0],\n", + " [ 1.0, 0.0, -1.0, 0.0],\n", + " [ 0.0, 1.0, 0.0, -1.0]],\n", + " dtype=np.float32), np.array([0., 0., 0., 0.], dtype=np.float32)])\n", + "model4.layers[1].set_weights(\n", + " [np.array([[ 1.0, -1.0, 0.0, 0.0],\n", + " [ 1.0, 1.0, 0.0, 0.0],\n", + " [ 0.0, 0.0, 1.0, -1.0],\n", + " [ 0.0, 0.0, -1.0, -1.0]],\n", + " dtype=np.float32), np.array([0., 0., 0., 0.], dtype=np.float32)])\n", + "model4.layers[2].set_weights(\n", + " [np.array([[ 1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],\n", + " [ 0.0, 0.0, 1.0, -1.0, 0.0, 0.0, 0.0, 0.0],\n", + " [ 0.0, 0.0, 0.0, 0.0, 1.0, -1.0, 0.0, 0.0],\n", + " [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0]],\n", + " dtype=np.float32), np.array([0., 0., 0., 0., 0., 0., 0., 0.], dtype=np.float32)])" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "model4.layers[3].set_weights(\n", + " [np.array([[ 1.0, 0.0, 0.0, 0.0],\n", + " [ 1.0, 0.0, 0.0, 0.0],\n", + " [ 0.0, 1.0, 0.0, 0.0],\n", + " [ 0.0, 1.0, 0.0, 0.0],\n", + " [ 0.0, 0.0, 1.0, 0.0],\n", + " [ 0.0, 0.0, 1.0, 0.0],\n", + " [ 0.0, 0.0, 0.0, 1.0],\n", + " [ 0.0, 0.0, 0.0, 1.0]],\n", + " dtype=np.float32), np.array([0., 0., 0., 0.], dtype=np.float32)])\n", + "\n", + "model4.compile(loss='categorical_crossentropy',\n", + " optimizer=keras.optimizers.Adagrad(),\n", + " metrics=['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[array([[ 1., 0., 1., 0.],\n", + " [ 0., 1., 0., 1.],\n", + " [ 1., 0., -1., 0.],\n", + " [ 0., 1., 0., -1.]], dtype=float32), array([0., 0., 0., 0.], dtype=float32)]\n", + "[array([[ 1., -1., 0., 0.],\n", + " [ 1., 1., 0., 0.],\n", + " [ 0., 0., 1., -1.],\n", + " [ 0., 0., -1., -1.]], dtype=float32), array([0., 0., 0., 0.], dtype=float32)]\n", + "[array([[ 1., -1., 0., 0., 0., 0., 0., 0.],\n", + " [ 0., 0., 1., -1., 0., 0., 0., 0.],\n", + " [ 0., 0., 0., 0., 1., -1., 0., 0.],\n", + " [ 0., 0., 0., 0., 0., 0., 1., -1.]], dtype=float32), array([0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)]\n", + "[array([[1., 0., 0., 0.],\n", + " [1., 0., 0., 0.],\n", + " [0., 1., 0., 0.],\n", + " [0., 1., 0., 0.],\n", + " [0., 0., 1., 0.],\n", + " [0., 0., 1., 0.],\n", + " [0., 0., 0., 1.],\n", + " [0., 0., 0., 1.]], dtype=float32), array([0., 0., 0., 0.], dtype=float32)]\n" + ] + } + ], + "source": [ + "for layer in model4.layers:\n", + " print(layer.get_weights())" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.17831734, 0.17831734, 0.17831734, 0.465048 ]], dtype=float32)" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model4.predict([np.array([[1.0, 1.0], [-1.0, -1.0]]).reshape(1, 4)])" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test loss: 0.7656148672103882\n", + "Test accuracy: 1.0\n" + ] + } + ], + "source": [ + "score = model4.evaluate(x4_test, y4_test, verbose=0)\n", + "\n", + "print('Test loss: {}'.format(score[0]))\n", + "print('Test accuracy: {}'.format(score[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_25\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "dense_75 (Dense) (None, 4) 20 \n", + "_________________________________________________________________\n", + "dense_76 (Dense) (None, 4) 20 \n", + "_________________________________________________________________\n", + "dense_77 (Dense) (None, 8) 40 \n", + "_________________________________________________________________\n", + "dense_78 (Dense) (None, 4) 36 \n", + "=================================================================\n", + "Total params: 116\n", + "Trainable params: 116\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model5 = Sequential()\n", + "model5.add(Dense(4, activation='tanh', input_shape=(4,)))\n", + "model5.add(Dense(4, activation='tanh'))\n", + "model5.add(Dense(8, activation='relu'))\n", + "model5.add(Dense(num_classes, activation='softmax'))\n", + "model5.compile(loss='categorical_crossentropy',\n", + " optimizer=keras.optimizers.RMSprop(),\n", + " metrics=['accuracy'])\n", + "model5.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/8\n", + "125/125 [==============================] - 0s 3ms/step - loss: 1.3126 - accuracy: 0.3840 - val_loss: 1.1926 - val_accuracy: 0.6110\n", + "Epoch 2/8\n", + "125/125 [==============================] - 0s 2ms/step - loss: 1.0978 - accuracy: 0.5980 - val_loss: 1.0085 - val_accuracy: 0.6150\n", + "Epoch 3/8\n", + "125/125 [==============================] - 0s 2ms/step - loss: 0.9243 - accuracy: 0.7035 - val_loss: 0.8416 - val_accuracy: 0.7380\n", + "Epoch 4/8\n", + "125/125 [==============================] - 0s 2ms/step - loss: 0.7522 - accuracy: 0.8740 - val_loss: 0.6738 - val_accuracy: 1.0000\n", + "Epoch 5/8\n", + "125/125 [==============================] - 0s 2ms/step - loss: 0.5811 - accuracy: 1.0000 - val_loss: 0.5030 - val_accuracy: 1.0000\n", + "Epoch 6/8\n", + "125/125 [==============================] - 0s 2ms/step - loss: 0.4134 - accuracy: 1.0000 - val_loss: 0.3428 - val_accuracy: 1.0000\n", + "Epoch 7/8\n", + "125/125 [==============================] - 0s 2ms/step - loss: 0.2713 - accuracy: 1.0000 - val_loss: 0.2161 - val_accuracy: 1.0000\n", + "Epoch 8/8\n", + "125/125 [==============================] - 0s 1ms/step - loss: 0.1621 - accuracy: 1.0000 - val_loss: 0.1225 - val_accuracy: 1.0000\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model5.fit(x4_train, y4_train, epochs=8, validation_data=(x4_test, y4_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[3.2040708e-02, 1.0065207e-03, 4.9596769e-04, 9.6645677e-01]],\n", + " dtype=float32)" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model5.predict([np.array([[1.0, 1.0], [-1.0, -1.0]]).reshape(1, 4)])" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test loss: 0.1224619448184967\n", + "Test accuracy: 1.0\n" + ] + } + ], + "source": [ + "score = model5.evaluate(x4_test, y4_test, verbose=0)\n", + "\n", + "print('Test loss: {}'.format(score[0]))\n", + "print('Test accuracy: {}'.format(score[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "import contextlib\n", + "\n", + "@contextlib.contextmanager\n", + "def printoptions(*args, **kwargs):\n", + " original = np.get_printoptions()\n", + " np.set_printoptions(*args, **kwargs)\n", + " try:\n", + " yield\n", + " finally: \n", + " np.set_printoptions(**original)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[array([[ 0.7, 0.2, -0.7, 0.7],\n", + " [-0.5, 0.9, 0.6, 0.6],\n", + " [ 1.1, 0.2, 0.1, 0.2],\n", + " [ 0.7, 0.1, 0.3, -0.7]], dtype=float32), array([ 0. , 0.1, -0.1, -0.2], dtype=float32)]\n", + "[array([[ 0.7, 0.5, -1.1, -1.2],\n", + " [ 0.7, 0.9, -0.6, 0.3],\n", + " [ 0.1, 1.4, -0.6, 0.8],\n", + " [ 1.5, 0.1, -0.1, 0.9]], dtype=float32), array([-0.4, 0.2, -0. , 0.2], dtype=float32)]\n", + "[array([[-1. , 1. , -0.7, -0.3, 0.2, 1.3, -0.7, 0.9],\n", + " [-0.9, 0.5, 0.8, -1.3, -1.2, 1.3, 0.4, -1. ],\n", + " [ 0.9, 0.2, 0.3, 0.4, 1.3, -0.9, -0.1, -0.2],\n", + " [-0.4, 0.5, 1.1, -0.6, 1.1, 0.1, -1.5, -1. ]], dtype=float32), array([-0.1, 0.1, 0.1, 0.1, 0.2, -0. , 0.1, 0.2], dtype=float32)]\n", + "[array([[ 0.7, -0.5, 0.8, -0.5],\n", + " [-0.3, -1.6, -0.2, 0.1],\n", + " [-1.5, 0.9, 0.1, -0.5],\n", + " [ 0.6, 0.7, 1. , -1.4],\n", + " [ 0.7, -1.2, -1.6, 1.2],\n", + " [ 1. , -1.2, 0.3, -1.5],\n", + " [-0.2, 0. , 0.6, 1.3],\n", + " [-0.8, 0.2, -0.6, -1. ]], dtype=float32), array([-0.6, 0.5, -0.3, 0.4], dtype=float32)]\n" + ] + } + ], + "source": [ + "with printoptions(precision=1, suppress=True):\n", + " for layer in model5.layers:\n", + " print(layer.get_weights())" + ] + } + ], + "metadata": { + "author": "Paweł Skórzewski", + "celltoolbar": "Slideshow", + "email": "pawel.skorzewski@amu.edu.pl", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "lang": "pl", + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + }, + "livereveal": { + "start_slideshow_at": "selected", + "theme": "white" + }, + "subtitle": "10.Sieci neuronowe – propagacja wsteczna[wykład]", + "title": "Uczenie maszynowe", + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + }, + "year": "2021" + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/wyk/13_CNN.ipynb b/wyk/13_CNN.ipynb new file mode 100644 index 0000000..547e7d4 --- /dev/null +++ b/wyk/13_CNN.ipynb @@ -0,0 +1,615 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 13. Splotowe sieci neuronowe" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Konwolucyjne sieci neuronowe wykorzystuje się do:\n", + "\n", + "* rozpoznawania obrazu\n", + "* analizy wideo\n", + "* innych zagadnień o podobnej strukturze" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Innymi słowy, CNN przydają się, gdy mamy bardzo dużo danych wejściowych, w których istotne jest ich sąsiedztwo." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Warstwy konwolucyjne" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Dla uproszczenia przyjmijmy, że mamy dane w postaci jendowymiarowej – np. chcemy stwierdzić, czy na danym nagraniu obecny jest głos człowieka." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Nasze nagranie możemy reprezentować jako ciąg $n$ próbek dźwiękowych:\n", + "$$(x_0, x_1, \\ldots, x_n)$$\n", + "(możemy traktować je jak jednowymiarowe „piksele”)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Najprostsza metoda – „zwykła” jednowarstwowa sieć neuronowa (każdy z każdym):" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Najprostsza metoda – „zwykła” jednowarstwowa sieć neuronowa (każdy z każdym) nie poradzi sobie zbyt dobrze w tym przypadku:\n", + "\n", + "* dużo danych wejściowych\n", + "* nie wykrywa własności „lokalnych” wejścia" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Chcielibyśmy wykrywać pewne lokalne „wzory” w danych wejściowych.\n", + "\n", + "W tym celu tworzymy mniejszą sieć neuronową (mniej neuronów wejściowych) i _kopiujemy_ ją tak, żeby każda jej kopia działała na pewnym fragmencie wejścia (fragmenty mogą nachodzić na siebie)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Warstwę sieci A nazywamy **warstwą konwolucyjną** (konwolucja = splot).\n", + "\n", + "Warstw konwolucyjnych może być więcej niż jedna." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Tak definiujemy formalnie funckję splotu dla 2 wymiarów:\n", + "\n", + "$$\n", + "\\left[\\begin{array}{ccc}\n", + "a & b & c\\\\\n", + "d & e & f\\\\\n", + "g & h & i\\\\\n", + "\\end{array}\\right]\n", + "*\n", + "\\left[\\begin{array}{ccc}\n", + "1 & 2 & 3\\\\\n", + "4 & 5 & 6\\\\\n", + "7 & 8 & 9\\\\\n", + "\\end{array}\\right] \n", + "=\\\\\n", + "(1 \\cdot a)+(2 \\cdot b)+(3 \\cdot c)+(4 \\cdot d)+(5 \\cdot e)\\\\+(6 \\cdot f)+(7 \\cdot g)+(8 \\cdot h)+(9 \\cdot i)\n", + "$$\n", + "\n", + "Więcej: https://en.wikipedia.org/wiki/Kernel_(image_processing)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Jednostka warstwy konwolucyjnej może się składać z jednej lub kilku warstw neuronów." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Jeden neuron może odpowiadać np. za wykrywanie pionowych krawędzi, drugi poziomych, a jeszcze inny np. krzyżujących się linii." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### _Pooling_" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "Obrazy składają się na ogół z milionów pikseli. Oznacza to, że nawet po zastosowaniu kilku warstw konwolucyjnych mielibyśmy sporo parametrów do wytrenowania.\n", + "\n", + "Żeby zredukować liczbę parametrów, a dzięki temu uprościć obliczenia, stosuje się warstwy ***pooling***.\n", + "\n", + "*Pooling* to rodzaj próbkowania. Najpopularniejszą jego odmianą jest *max-pooling*, czyli wybieranie najwyższej wartości spośród kilku sąsiadujących pikseli (rys. 12.1)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "![Rys. 12.1. Pooling](Max_pooling.png \"Rys. 12.1. Pooling\")\n", + "\n", + "Rys. 12.1. - źródło: [Aphex34](https://commons.wikimedia.org/wiki/File:Max_pooling.png), [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0), Wikimedia Commons" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Warstwy _pooling_ i konwolucyjne można przeplatać ze sobą (rys. 12.2)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "![Rys. 12.2. CNN](Typical_cnn.png \"Rys. 12.2. CNN\")\n", + "\n", + "Rys. 12.2. - źródło: [Aphex34](https://commons.wikimedia.org/wiki/File:Typical_cnn.png), [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0), Wikimedia Commons" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "_Pooling_ – idea: nie jest istotne, w którym *dokładnie* miejscu na obrazku dana cecha (krawędź, oko, itp.) się znajduje, wystarczy przybliżona lokalizacja." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Do sieci konwolucujnych możemy dokładać też warstwy ReLU." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "https://www.youtube.com/watch?v=FmpDIaiMIeA" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "Zobacz też: https://colah.github.io/posts/2014-07-Conv-Nets-Modular/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Przykład: MNIST" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "import math\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import random\n", + "\n", + "from IPython.display import YouTubeVideo" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "import keras\n", + "from keras.datasets import mnist\n", + "\n", + "from keras.models import Sequential\n", + "from keras.layers import Dense, Dropout, Flatten\n", + "from keras.layers import Conv2D, MaxPooling2D\n", + "\n", + "# załaduj dane i podziel je na zbiory uczący i testowy\n", + "(x_train, y_train), (x_test, y_test) = mnist.load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "def draw_examples(examples, captions=None):\n", + " plt.figure(figsize=(16, 4))\n", + " m = len(examples)\n", + " for i, example in enumerate(examples):\n", + " plt.subplot(100 + m * 10 + i + 1)\n", + " plt.imshow(example, cmap=plt.get_cmap('gray'))\n", + " plt.show()\n", + " if captions is not None:\n", + " print(6 * ' ' + (10 * ' ').join(str(captions[i]) for i in range(m)))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 5 0 4 1 9 2 1\n" + ] + } + ], + "source": [ + "draw_examples(x_train[:7], captions=y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "batch_size = 128\n", + "num_classes = 10\n", + "epochs = 12\n", + "\n", + "# input image dimensions\n", + "img_rows, img_cols = 28, 28" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "outputs": [], + "source": [ + "if keras.backend.image_data_format() == 'channels_first':\n", + " x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)\n", + " x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)\n", + " input_shape = (1, img_rows, img_cols)\n", + "else:\n", + " x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)\n", + " x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)\n", + " input_shape = (img_rows, img_cols, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_train shape: (60000, 28, 28, 1)\n", + "60000 train samples\n", + "10000 test samples\n" + ] + } + ], + "source": [ + "x_train = x_train.astype('float32')\n", + "x_test = x_test.astype('float32')\n", + "x_train /= 255\n", + "x_test /= 255\n", + "print('x_train shape: {}'.format(x_train.shape))\n", + "print('{} train samples'.format(x_train.shape[0]))\n", + "print('{} test samples'.format(x_test.shape[0]))\n", + "\n", + "# convert class vectors to binary class matrices\n", + "y_train = keras.utils.to_categorical(y_train, num_classes)\n", + "y_test = keras.utils.to_categorical(y_test, num_classes)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "model = Sequential()\n", + "model.add(Conv2D(32, kernel_size=(3, 3),\n", + " activation='relu',\n", + " input_shape=input_shape))\n", + "model.add(Conv2D(64, (3, 3), activation='relu'))\n", + "model.add(MaxPooling2D(pool_size=(2, 2)))\n", + "model.add(Dropout(0.25))\n", + "model.add(Flatten())\n", + "model.add(Dense(128, activation='relu'))\n", + "model.add(Dropout(0.5))\n", + "model.add(Dense(num_classes, activation='softmax'))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "model.compile(loss=keras.losses.categorical_crossentropy,\n", + " optimizer=keras.optimizers.Adadelta(),\n", + " metrics=['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 60000 samples, validate on 10000 samples\n", + "Epoch 1/12\n", + "60000/60000 [==============================] - 333s - loss: 0.3256 - acc: 0.9037 - val_loss: 0.0721 - val_acc: 0.9780\n", + "Epoch 2/12\n", + "60000/60000 [==============================] - 342s - loss: 0.1088 - acc: 0.9683 - val_loss: 0.0501 - val_acc: 0.9835\n", + "Epoch 3/12\n", + "60000/60000 [==============================] - 366s - loss: 0.0837 - acc: 0.9748 - val_loss: 0.0429 - val_acc: 0.9860\n", + "Epoch 4/12\n", + "60000/60000 [==============================] - 311s - loss: 0.0694 - acc: 0.9788 - val_loss: 0.0380 - val_acc: 0.9878\n", + "Epoch 5/12\n", + "60000/60000 [==============================] - 325s - loss: 0.0626 - acc: 0.9815 - val_loss: 0.0334 - val_acc: 0.9886\n", + "Epoch 6/12\n", + "60000/60000 [==============================] - 262s - loss: 0.0552 - acc: 0.9835 - val_loss: 0.0331 - val_acc: 0.9890\n", + "Epoch 7/12\n", + "60000/60000 [==============================] - 218s - loss: 0.0494 - acc: 0.9852 - val_loss: 0.0291 - val_acc: 0.9903\n", + "Epoch 8/12\n", + "60000/60000 [==============================] - 218s - loss: 0.0461 - acc: 0.9859 - val_loss: 0.0294 - val_acc: 0.9902\n", + "Epoch 9/12\n", + "60000/60000 [==============================] - 219s - loss: 0.0423 - acc: 0.9869 - val_loss: 0.0287 - val_acc: 0.9907\n", + "Epoch 10/12\n", + "60000/60000 [==============================] - 218s - loss: 0.0418 - acc: 0.9875 - val_loss: 0.0299 - val_acc: 0.9906\n", + "Epoch 11/12\n", + "60000/60000 [==============================] - 218s - loss: 0.0388 - acc: 0.9879 - val_loss: 0.0304 - val_acc: 0.9905\n", + "Epoch 12/12\n", + "60000/60000 [==============================] - 218s - loss: 0.0366 - acc: 0.9889 - val_loss: 0.0275 - val_acc: 0.9910\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(x_train, y_train,\n", + " batch_size=batch_size,\n", + " epochs=epochs,\n", + " verbose=1,\n", + " validation_data=(x_test, y_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('Test loss:', 0.027530849870144449)\n", + "('Test accuracy:', 0.99099999999999999)\n" + ] + } + ], + "source": [ + "score = model.evaluate(x_test, y_test, verbose=0)\n", + "print('Test loss:', score[0])\n", + "print('Test accuracy:', score[1])" + ] + } + ], + "metadata": { + "author": "Paweł Skórzewski", + "celltoolbar": "Slideshow", + "email": "pawel.skorzewski@amu.edu.pl", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "lang": "pl", + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0]" + }, + "livereveal": { + "start_slideshow_at": "selected", + "theme": "white" + }, + "subtitle": "12.Splotowe sieci neuronowe[wykład]", + "title": "Uczenie maszynowe", + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + }, + "year": "2021" + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/wyk/14_RNN.ipynb b/wyk/14_RNN.ipynb new file mode 100644 index 0000000..af3fab9 --- /dev/null +++ b/wyk/14_RNN.ipynb @@ -0,0 +1,516 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 14. Rekurencyjne sieci neuronowe" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 14.1. Rekurencyjne sieci neuronowe" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## RNN – _Recurrent Neural Network_\n", + "\n", + "## LSTM – _Long Short Term Memory_" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "https://www.youtube.com/watch?v=WCUNPb-5EYI" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Rekurencyjna sieć neuronowa – schemat\n", + "\n", + "Rys. 11.1.\n", + "\n", + "![Rys. 11.1. Rekurencyjna sieć neuronowa – schemat](Recurrent_neural_network_unfold.png \"Rys. 11.1. Rekurencyjna sieć neuronowa – schemat\")\n", + "\n", + "Rys. 11.1 - źródło: [fdeloche](https://commons.wikimedia.org/wiki/File:Recurrent_neural_network_unfold.svg), [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0), Wikimedia Commons" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### LSTM – schemat\n", + "\n", + "Rys. 11.2.\n", + "\n", + "![Rys. 11.2. LSTM – schemat](Long_Short-Term_Memory.png \"Rys. 11.2. LSTM – schemat\")\n", + "\n", + "Rys. 11.2 - źródło: [fdeloche](https://commons.wikimedia.org/wiki/File:Long_Short-Term_Memory.svg), [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0), Wikimedia Commons" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Rekurencyjne sieci neuronowe znajduja zastosowanie w przetwarzaniu sekwencji, np. szeregów czasowych i tekstów.\n", + "* LSTM są rozwinięciem RNN, umożliwiają „zapamiętywanie” i „zapominanie”." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Co potrafią generować rekurencyjne sieci neuronowe?\n", + "\n", + "http://karpathy.github.io/2015/05/21/rnn-effectiveness/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Przewidywanie ciągów czasowych za pomocą LSTM – przykład\n", + "\n", + "https://machinelearningmastery.com/time-series-forecasting-long-short-term-memory-network-python/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## GRU – _Gated Recurrent Unit_\n", + "\n", + "* Rodzaj rekurencyjnej sieci neuronowej wprwadzony w 2014 roku\n", + "* Ma prostszą budowę niż LSTM (2 bramki zamiast 3).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### GRU – schemat\n", + "\n", + "Rys. 11.3\n", + "\n", + "![Rys. 11.3. GRU – schemat](Gated_Recurrent_Unit.png \"Rys. 11.3. GRU – schemat\")\n", + "\n", + "Rys. 11.3 - źródło: [fdeloche](https://commons.wikimedia.org/wiki/File:Gated_Recurrent_Unit.svg), [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0), Wikimedia Commons" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### GRU vs LSTM\n", + "* LSTM – 3 bramki: wejścia (*input*), wyjścia (*output*) i zapomnienia (*forget*); GRU – 2 bramki: resetu (*reset*) i aktualizacji (*update*). Bramka resetu pełni podwójną funkcję: zastępuje bramki wyjścia i zapomnienia.\n", + "* GRU i LSTM mają podobną skuteczność, ale GRU dzięki prostszej budowie bywa bardziej wydajna.\n", + "* LSTM sprawdza się lepiej w przetwarzaniu tekstu, ponieważ lepiej zapamiętuje zależności długosystansowe." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 14.2. Autoencoder" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Uczenie nienadzorowane\n", + "* Dane: zbiór nieanotowanych przykładów uczących $\\{ x^{(1)}, x^{(2)}, x^{(3)}, \\ldots \\}$, $x^{(i)} \\in \\mathbb{R}^{n}$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Autoencoder (encoder-decoder)\n", + "\n", + "Sieć neuronowa taka, że:\n", + "* warstwa wejściowa ma $n$ neuronów\n", + "* warstwa wyjściowa ma $n$ neuronów\n", + "* warstwa środkowa ma $k < n$ neuronów\n", + "* $y^{(i)} = x^{(i)}$ dla każdego $i$\n", + "\n", + "(rys. 13.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "![Rys. 13.1. Autoencoder](Autoencoder_schema.png \"Rys. 13.1. Autoencoder\")\n", + "\n", + "Rys. 13.1 - źródło: [Michela Massi](https://commons.wikimedia.org/wiki/File:Autoencoder_schema.png), [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0), Wikimedia Commons" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Co otrzymujemy dzięki takiej sieci?\n", + "\n", + "* $y^{(i)} = x^{(i)} \\; \\Longrightarrow \\;$ Autoencoder próbuje nauczyć się funkcji $h(x) \\approx x$, czyli funkcji identycznościowej.\n", + "* Warstwy środkowe mają mniej neuronów niż warstwy zewnętrzne, więc żeby to osiągnąć, sieć musi znaleźć bardziej kompaktową (tu: $k$-wymiarową) reprezentację informacji zawartej w wektorach $x_{(i)}$.\n", + "* Otrzymujemy metodę kompresji danych." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Innymi słowy:\n", + "* Ograniczenia nałożone na reprezentację danych w warstwie ukrytej pozwala na „odkrycie” pewnej **struktury** w danych.\n", + "* _Decoder_ musi odtworzyć do pierwotnej postaci reprezentację danych skompresowaną przez _encoder_.\n", + "\n", + "(rys. 13.2)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "![Rys. 13.2. Autoencoder - struktura](Autoencoder_structure.png \"Rys. 13.2. Autoencoder - struktura\")\n", + "\n", + "Rys. 13.2 - źródło: [Chervinskii](https://commons.wikimedia.org/wiki/File:Autoencoder_structure.png), [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0), Wikimedia Commons" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Całkowita liczba warstw w sieci autoencodera może być większa niż 3.\n", + "* Jako funkcji kosztu na ogół używa się błędu średniokwadratowego (*mean squared error*, MSE) lub entropii krzyżowej (*binary crossentropy*).\n", + "* Autoencoder może wykryć ciekawe struktury w danych nawet jeżeli $k \\geq n$, jeżeli na sieć nałoży się inne ograniczenia.\n", + "* W wyniku działania autoencodera uzyskujemy na ogół kompresję **stratną**." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Autoencoder a PCA\n", + "\n", + "Widzimy, że autoencoder można wykorzystać do redukcji liczby wymiarów. Podobną rolę pełni poznany na jednym z poprzednich wykładów algorytm PCA (analiza głównych składowych, *principal component analysis*).\n", + "\n", + "Faktycznie, jeżeli zastosujemy autoencoder z liniowymi funkcjami aktywacji i pojedynczą sigmoidalną warstwą ukrytą, to na podstawie uzyskanych wag można odtworzyć główne składowe używając rozkładu według wartości osobliwych (*singular value decomposition*, SVD)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Autoencoder – zastosowania\n", + "\n", + "Autoencoder sprawdza się gorzej niż inne algorytmy kompresji, więc nie stosuje się go raczej jako metody kompresji danych, ale ma inne zastosowania:\n", + "* odszumianie danych (jeżeli na wejściu zamiast „czystych” danych użyjemy danych zaszumionych, to otrzymamy sieć, która może usuwać szum z danych)\n", + "* redukcja wymiarowości\n", + "* VAE (*variational autoencoders*) – http://kvfrans.com/variational-autoencoders-explained/" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 14.3. Word embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "_Word embeddings_ – sposoby reprezentacji słów jako wektorów liczbowych" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Znaczenie wyrazu jest reprezentowane przez sąsiednie wyrazy:\n", + "\n", + "“A word is characterized by the company it keeps.” (John R. Firth, 1957)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Pomysł pojawił sie jeszcze w latach 60. XX w.\n", + "* _Word embeddings_ można uzyskiwać na różne sposoby, ale dopiero w ostatnim dziesięcioleciu stało się opłacalne użycie w tym celu sieci neuronowych." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Przykład – 2 zdania: \n", + "* \"have a good day\"\n", + "* \"have a great day\"\n", + "\n", + "Słownik:\n", + "* {\"a\", \"day\", \"good\", \"great\", \"have\"}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Aby wykorzystać metody uczenia maszynowego do analizy danych tekstowych, musimy je jakoś reprezentować jako liczby.\n", + "* Najprostsza metoda to wektory jednostkowe:\n", + " * \"a\" = $(1, 0, 0, 0, 0)$\n", + " * \"day\" = $(0, 1, 0, 0, 0)$\n", + " * \"good\" = $(0, 0, 1, 0, 0)$\n", + " * \"great\" = $(0, 0, 0, 1, 0)$\n", + " * \"have\" = $(0, 0, 0, 0, 1)$\n", + "* Taka metoda nie uwzględnia jednak podobieństw i różnic między znaczeniami wyrazów." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Metody uzyskiwania *word embeddings*:\n", + "* Common Bag of Words (CBOW)\n", + "* Skip Gram\n", + "\n", + "Obie opierają się na odpowiednim użyciu autoencodera." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Skip Gram a CBOW\n", + "\n", + "* Skip Gram lepiej reprezentuje rzadkie wyrazy i lepiej działa, jeżeli mamy mało danych.\n", + "* CBOW jest szybszy i lepiej reprezentuje częste wyrazy." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "### Popularne modele _word embeddings_\n", + "* Word2Vec (Google)\n", + "* GloVe (Stanford)\n", + "* FastText (Facebook)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "notes" + } + }, + "source": [ + "Więcej o word embeddings: https://towardsdatascience.com/introduction-to-word-embedding-and-word2vec-652d0c2060fa" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## 14.4. Tłumaczenie neuronowe\n", + "\n", + "_Neural Machine Translation_ (NMT)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Neuronowe tłumaczenie maszynowe również opiera się na modelu *encoder-decoder*:\n", + "* *Encoder* koduje z języka źródłowego na abstrakcyjną reprezentację.\n", + "* *Decoder* odkodowuje z abstrakcyjnej reprezentacji na język docelowy." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Sutskever, I., Vinyals, O., & Le, Q. V. (2014). Sequence to sequence learning with neural networks. In *Advances in neural information processing systems* (pp. 3104-3112)." + ] + } + ], + "metadata": { + "author": "Paweł Skórzewski", + "celltoolbar": "Slideshow", + "email": "pawel.skorzewski@amu.edu.pl", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "lang": "pl", + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0]" + }, + "livereveal": { + "start_slideshow_at": "selected", + "theme": "white" + }, + "subtitle": "11.Rekurencyjne sieci neuronowe[wykład]", + "title": "Uczenie maszynowe", + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + }, + "year": "2021" + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/wyk/15_Uczenie_przez_wzmacnianie.ipynb b/wyk/15_Uczenie_przez_wzmacnianie.ipynb new file mode 100644 index 0000000..28735f6 --- /dev/null +++ b/wyk/15_Uczenie_przez_wzmacnianie.ipynb @@ -0,0 +1,303 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 15. Uczenie przez wzmacnianie i systemy dialogowe" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# 15.1. Uczenie przez wzmacnianie" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Paradygmat uczenia przez wzmacnianie" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "![Rys. 15.1. Paradygmaty uczenia maszynowego](paradygmaty_um.png \"Rys. 15.1. Paradygmaty uczenia maszynowego\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Paradygmat uczenia przez wzmacnianie naśladuje sposób, w jaki uczą się dzieci.\n", + "* Interakcja ze środowiskiem." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* W chwili $t$ agent w stanie $S_t$ podejmuje akcję $A_t$, następnie obserwuje zmianę w środowisku w stanie $S_{t+1}$ i otrzymuje nagrodę $R_{t+1}$ (rys. 13.2)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "![Rys. 13.2. Agent i środowisko](agent_i_srodowisko.png \"Rys. 13.2. Agent i środowisko\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "* Celem jest znalezienie takiej taktyki wyboru kolejnej akcji, aby zmaksymalizować wartość końcowej nagrody. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Zastosowanie uczenia przez wzmacnianie:\n", + "* strategie gier\n", + "* systemy dialogowe\n", + "* sterowanie" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Uczenie przez wzmacnianie jako proces decyzyjny Markowa" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Paradygmat uczenia przez wzmacnianie można formalnie opisać jako proces decyzyjny Markowa:\n", + "$$ (S, A, T, R) $$\n", + "gdzie:\n", + "* $S$ – skończony zbiór stanów\n", + "* $A$ – skończony zbiór akcji\n", + "* $T \\colon A \\times S \\to S$ – funkcja przejścia która opisuje, jak zmienia się środowisko pod wpływem wybranych akcji\n", + "* $R \\colon A \\times S \\to \\mathbb{R}$ – funkcja nagrody" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Albo, jeśli przyjmiemy, że środowisko zmienia się w sposób niedeterministyczny:\n", + "$$ (S, A, P, R) $$\n", + "gdzie:\n", + "* $S$ – skończony zbiór stanów\n", + "* $A$ – skończony zbiór akcji\n", + "* $P \\colon A \\times S \\times S \\to [0, 1]$ – prawdopodobieństwo przejścia\n", + "* $R \\colon A \\times S \\times S \\to \\mathbb{R}$ – funkcja nagrody" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Na przykład, prawdopodobieństwo, że akcja $a$ spowoduje przejście ze stanu $s$ do $s'$:\n", + "$$ P_a(s, s') \\; = \\; \\mathbf{P}( \\, s_{t+1} = s' \\, | \\, s_t = s, a_t = a \\,) $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Strategia\n", + "\n", + "* Strategią (*policy*) nazywamy odwzorowanie $\\pi \\colon S \\to A$, które bieżącemu stanowi przyporządkuje kolejną akcję do wykonania.\n", + "* Algorytm uczenia przez wzmacnianie będzie starał się zoptymalizować strategię tak, żeby na koniec otrzymać jak najwyższą nagrodę.\n", + "* W chwili $t$, ostateczna końcowa nagroda jest zdefiniowana jako:\n", + "$$ R_t := r_{t+1} + \\gamma \\, r_{t+2} + \\gamma^2 \\, r_{t+3} + \\ldots = \\sum_{k=0}^T \\gamma^k \\, r_{t+k+1} \\; , $$\n", + "gdzie $0 < \\gamma < 1$ jest czynnikiem, który określa, jak bardzo bieżemy pod uwagę nagrody, które otrzymamy w odległej przyszłości." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Algorytm szuka optymalnej strategii metodą prób i błędów – podejmując akcje i obserwując ich wpływ na środowisko. W podejmowaniu decyzji pomoże mu oszacowanie wartości następujących funkcji:\n", + "* Funkcja wartości ($V$) odzwierciedla, jak atrakcyjne w dalekiej perspektywie jest przejście do danego stanu:\n", + "$$ V_{\\pi}(s) = \\mathbf{E}_{\\pi}(R \\, | \\, s_t = s) $$\n", + "* Funkcja $Q$ odzwierciedla, jak atrakcyjne w dalekiej perspektywie jest przejście do danego stanu przez podjęcie danej akcji:\n", + "$$ Q_{\\pi}(s, a) = \\mathbf{E}_{\\pi}(R \\, | \\, s_t = s, a_t = a) $$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Algorytmy uczenia przez wzmacnianie\n", + "* Programowanie dynamiczne (DP):\n", + " * *bootstrapping* – aktualizacja oczacowań dla danego stanu na podstawie oszacowań dla możliwych stanów następnych\n", + "* Metody Monte Carlo (MC)\n", + "* Uczenie oparte na różnicach czasowych (*temporal difference learning*, TD):\n", + " * *on-policy* – aktualizacja bieżącej strategii:\n", + " * SARSA (*state–action–reward–state–action*)\n", + " * *off-policy* – eksploracja strategii innych niż bieżąca:\n", + " * *Q-Learning*\n", + " * *Actor–Critic*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Przykłady\n", + "\n", + "* Odwrócone wahadło (*cart and pole*): https://www.youtube.com/watch?v=46wjA6dqxOM\n", + "* Symulacja autonomicznego samochodu: https://www.youtube.com/watch?v=G-GpY7bevuw" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# 15.2. Systemy dialogowe" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Rodzaje systemów dialogowych\n", + "* Chatboty\n", + "* Systemy zorientowane na zadania (*task-oriented systems*, *goal-oriented systems*):\n", + " * szukanie informacji\n", + " * wypełnianie formularzy\n", + " * rozwiązywanie problemów\n", + " * systemy edukacyjne i tutorialowe\n", + " * inteligentni asystenci" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Architektura systemu dialogowego\n", + "\n", + "(rys. 13.3)\n", + "\n", + "![Rys. 13.3. Architektura systemu dialogowego](system_dialogowy.png \"Rys. 13.3. Architektura systemu dialogowego\")" + ] + } + ], + "metadata": { + "author": "Paweł Skórzewski", + "celltoolbar": "Slideshow", + "email": "pawel.skorzewski@amu.edu.pl", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "lang": "pl", + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0]" + }, + "livereveal": { + "start_slideshow_at": "selected", + "theme": "white" + }, + "subtitle": "15.Uczenie przez wzmacnianie i systemy dialogowe[wykład]", + "title": "Uczenie maszynowe", + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + }, + "year": "2021" + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/wyk/exp1.png b/wyk/exp1.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8c14658ea68c4d8648ab12355d7d5776da27d7 GIT binary patch literal 27700 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%0DGy}F1VlXpyfV1&VA=Eig_0QSX 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 z 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 literal 0 HcmV?d00001 diff --git a/wyk/exp3.png b/wyk/exp3.png new file mode 100644 index 0000000000000000000000000000000000000000..b1e771b13378113782ba9b43125220b0b9005119 GIT binary patch literal 51432 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 C(NB{A literal 0 HcmV?d00001 diff --git a/wyk/nn3.png b/wyk/nn3.png new file mode 100644 index 0000000000000000000000000000000000000000..e2da2f944a0631555e0dd5271fb77af3996d361d GIT binary patch literal 86587 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ÁQ)@O9axf9Ipx1pRHlz(qSM7BbPnSs)av{K84 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

5Y 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 literal 0 HcmV?d00001