412 lines
10 KiB
Plaintext
412 lines
10 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"slideshow": {
|
||
"slide_type": "slide"
|
||
}
|
||
},
|
||
"source": [
|
||
"## Uczenie maszynowe UMZ 2019/2020\n",
|
||
"### 16 czerwca 2020\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": "amu"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
}
|