uczenie-maszynowe/wyk/14_RNN.ipynb

521 lines
14 KiB
Plaintext
Raw Normal View History

2023-01-23 15:42:40 +01:00
{
"cells": [
{
"cell_type": "markdown",
2023-01-23 16:01:45 +01:00
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
2023-01-23 15:42:40 +01:00
"source": [
2023-01-23 16:01:45 +01:00
"### Uczenie maszynowe\n",
2023-01-23 15:42:40 +01:00
"# 14. Rekurencyjne sieci neuronowe"
]
},
{
"cell_type": "markdown",
2023-01-23 16:01:45 +01:00
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
2023-01-23 15:42:40 +01:00
"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",
2023-01-23 16:01:45 +01:00
"Rys. 14.1.\n",
2023-01-23 15:42:40 +01:00
"\n",
2023-01-23 16:01:45 +01:00
"![Rys. 14.1. Rekurencyjna sieć neuronowa schemat](Recurrent_neural_network_unfold.png \"Rys. 14.1. Rekurencyjna sieć neuronowa schemat\")\n",
2023-01-23 15:42:40 +01:00
"\n",
2023-01-23 16:01:45 +01:00
"Rys. 14.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"
2023-01-23 15:42:40 +01:00
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### LSTM schemat\n",
"\n",
2023-01-23 16:01:45 +01:00
"Rys. 14.2.\n",
2023-01-23 15:42:40 +01:00
"\n",
2023-01-23 16:01:45 +01:00
"![Rys. 14.2. LSTM schemat](Long_Short-Term_Memory.png \"Rys. 14.2. LSTM schemat\")\n",
2023-01-23 15:42:40 +01:00
"\n",
2023-01-23 16:01:45 +01:00
"Rys. 14.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"
2023-01-23 15:42:40 +01:00
]
},
{
"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",
2023-01-23 16:01:45 +01:00
"Rys. 14.3\n",
2023-01-23 15:42:40 +01:00
"\n",
2023-01-23 16:01:45 +01:00
"![Rys. 14.3. GRU schemat](Gated_Recurrent_Unit.png \"Rys. 14.3. GRU schemat\")\n",
2023-01-23 15:42:40 +01:00
"\n",
2023-01-23 16:01:45 +01:00
"Rys. 14.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"
2023-01-23 15:42:40 +01:00
]
},
{
"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."
]
},
{
"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",
2023-01-23 16:01:45 +01:00
"(rys. 14.4)"
2023-01-23 15:42:40 +01:00
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
2023-01-23 16:01:45 +01:00
"![Rys. 14.4. Autoencoder](Autoencoder_schema.png \"Rys. 14.4. Autoencoder\")\n",
2023-01-23 15:42:40 +01:00
"\n",
2023-01-23 16:01:45 +01:00
"Rys. 14.4 - ź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"
2023-01-23 15:42:40 +01:00
]
},
{
"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",
2023-01-23 16:01:45 +01:00
"(rys. 14.5)"
2023-01-23 15:42:40 +01:00
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
2023-01-23 16:01:45 +01:00
"![Rys. 14.5. Autoencoder - struktura](Autoencoder_structure.png \"Rys. 14.5. Autoencoder - struktura\")\n",
2023-01-23 15:42:40 +01:00
"\n",
2023-01-23 16:01:45 +01:00
"Rys. 14.5 - ź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"
2023-01-23 15:42:40 +01:00
]
},
{
"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/"
]
},
{
"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"
]
},
{
"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": {
2023-01-23 16:01:45 +01:00
"display_name": "Python 3 (ipykernel)",
2023-01-23 15:42:40 +01:00
"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",
2023-12-14 18:04:47 +01:00
"version": "3.10.12"
2023-01-23 15:42:40 +01:00
},
"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
}