umz21/wyk/14_Autoencoder.ipynb
2021-04-14 08:03:54 +02:00

411 lines
10 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Uczenie maszynowe zastosowania\n",
"# 14. Autoencoder. Tłumaczenie neuronowe"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## 14.1. 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$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"<img style=\"margin: auto\" width=\"60%\" src=\"http://ufldl.stanford.edu/tutorial/images/Autoencoder636.png\" />"
]
},
{
"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_."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"<img style=\"margin: auto\" width=\"70%\" src=\"https://upload.wikimedia.org/wikipedia/commons/2/28/Autoencoder_structure.png\" />"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"<img style=\"margin: auto\" width=\"70%\" src=\"autoencoder_schema.jpg\" />"
]
},
{
"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_). 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 odszumiający\n",
"\n",
"Jeżeli na wejściu zamiast „czystych” danych użyjemy danych zaszumionych, to otrzymamy sieć, która może usuwać szum z danych:\n",
"\n",
"<img style=\"margin: auto\" width=\"70%\" src=\"denoising_autoencoder.png\" />"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"<img style=\"margin: auto\" width=\"70%\" src=\"denoising.png\" />"
]
},
{
"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\n",
"* redukcja wymiarowości\n",
"* VAE (_variational autoencoders_) http://kvfrans.com/variational-autoencoders-explained/"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## 14.2. 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": [
"<img style=\"margin: auto\" width=\"90%\" src=\"we_autoencoder.png\" />"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Common Bag of Words\n",
"\n",
"<img style=\"margin: auto\" width=\"60%\" src=\"cbow.png\" />"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Skip Gram\n",
"\n",
"<img style=\"margin: auto\" width=\"50%\" src=\"skipgram.png\" />"
]
},
{
"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": "slide"
}
},
"source": [
"## 14.3. 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": [
"<img style=\"margin: auto\" width=\"70%\" src=\"http://devblogs.nvidia.com/parallelforall/wp-content/uploads/2015/06/Figure2_NMT_system.png\"/>"
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.8.3"
},
"livereveal": {
"start_slideshow_at": "selected",
"theme": "white"
}
},
"nbformat": 4,
"nbformat_minor": 4
}