forked from pms/uczenie-maszynowe
Wykłady 12-15
This commit is contained in:
parent
fe8ff69b62
commit
6f01e37722
1940
wyk/12_Propagacja_wsteczna.ipynb
Normal file
1940
wyk/12_Propagacja_wsteczna.ipynb
Normal file
File diff suppressed because one or more lines are too long
615
wyk/13_CNN.ipynb
Normal file
615
wyk/13_CNN.ipynb
Normal file
File diff suppressed because one or more lines are too long
516
wyk/14_RNN.ipynb
Normal file
516
wyk/14_RNN.ipynb
Normal file
@ -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
|
||||||
|
}
|
303
wyk/15_Uczenie_przez_wzmacnianie.ipynb
Normal file
303
wyk/15_Uczenie_przez_wzmacnianie.ipynb
Normal file
@ -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
|
||||||
|
}
|
BIN
wyk/exp1.png
Normal file
BIN
wyk/exp1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
BIN
wyk/exp2.png
Normal file
BIN
wyk/exp2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 74 KiB |
BIN
wyk/exp3.png
Normal file
BIN
wyk/exp3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
BIN
wyk/nn3.png
Normal file
BIN
wyk/nn3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 85 KiB |
Loading…
Reference in New Issue
Block a user