{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Uczenie maszynowe\n", "# 14. Rekurencyjne sieci neuronowe" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "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. 14.1.\n", "\n", "![Rys. 14.1. Rekurencyjna sieć neuronowa – schemat](Recurrent_neural_network_unfold.png \"Rys. 14.1. Rekurencyjna sieć neuronowa – schemat\")\n", "\n", "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" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### LSTM – schemat\n", "\n", "Rys. 14.2.\n", "\n", "![Rys. 14.2. LSTM – schemat](Long_Short-Term_Memory.png \"Rys. 14.2. LSTM – schemat\")\n", "\n", "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" ] }, { "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. 14.3\n", "\n", "![Rys. 14.3. GRU – schemat](Gated_Recurrent_Unit.png \"Rys. 14.3. GRU – schemat\")\n", "\n", "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" ] }, { "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", "(rys. 14.4)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "![Rys. 14.4. Autoencoder](Autoencoder_schema.png \"Rys. 14.4. Autoencoder\")\n", "\n", "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" ] }, { "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. 14.5)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "![Rys. 14.5. Autoencoder - struktura](Autoencoder_structure.png \"Rys. 14.5. Autoencoder - struktura\")\n", "\n", "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" ] }, { "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": { "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": "11.Rekurencyjne sieci neuronowe[wykład]", "title": "Uczenie maszynowe", "vscode": { "interpreter": { "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" } }, "year": "2021" }, "nbformat": 4, "nbformat_minor": 4 }