uczenie-maszynowe/wyk/14_RNN.ipynb

14 KiB
Raw Blame History

Uczenie maszynowe

14. Rekurencyjne sieci neuronowe

14.1. Rekurencyjne sieci neuronowe

RNN _Recurrent Neural Network

LSTM _Long Short Term Memory

Rekurencyjna sieć neuronowa schemat

Rys. 14.1.

Rys. 14.1. Rekurencyjna sieć neuronowa – schemat

Rys. 14.1 - źródło: fdeloche, CC BY-SA 4.0, Wikimedia Commons

LSTM schemat

Rys. 14.2.

Rys. 14.2. LSTM – schemat

Rys. 14.2 - źródło: fdeloche, CC BY-SA 4.0, Wikimedia Commons

  • Rekurencyjne sieci neuronowe znajduja zastosowanie w przetwarzaniu sekwencji, np. szeregów czasowych i tekstów.
  • LSTM są rozwinięciem RNN, umożliwiają „zapamiętywanie” i „zapominanie”.

Co potrafią generować rekurencyjne sieci neuronowe?

http://karpathy.github.io/2015/05/21/rnn-effectiveness/

GRU _Gated Recurrent Unit

  • Rodzaj rekurencyjnej sieci neuronowej wprwadzony w 2014 roku
  • Ma prostszą budowę niż LSTM (2 bramki zamiast 3).

GRU schemat

Rys. 14.3

Rys. 14.3. GRU – schemat

Rys. 14.3 - źródło: fdeloche, CC BY-SA 4.0, Wikimedia Commons

GRU vs LSTM

  • 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.
  • GRU i LSTM mają podobną skuteczność, ale GRU dzięki prostszej budowie bywa bardziej wydajna.
  • LSTM sprawdza się lepiej w przetwarzaniu tekstu, ponieważ lepiej zapamiętuje zależności długosystansowe.

14.2. Autoencoder

  • Uczenie nienadzorowane
  • Dane: zbiór nieanotowanych przykładów uczących $\{ x^{(1)}, x^{(2)}, x^{(3)}, \ldots \}$, $x^{(i)} \in \mathbb{R}^{n}$

Autoencoder (encoder-decoder)

Sieć neuronowa taka, że:

  • warstwa wejściowa ma $n$ neuronów
  • warstwa wyjściowa ma $n$ neuronów
  • warstwa środkowa ma $k < n$ neuronów
  • $y^{(i)} = x^{(i)}$ dla każdego $i$

(rys. 14.4)

Rys. 14.4. Autoencoder

Rys. 14.4 - źródło: Michela Massi, CC BY-SA 4.0, Wikimedia Commons

Co otrzymujemy dzięki takiej sieci?

  • $y^{(i)} = x^{(i)} ; \Longrightarrow ;$ Autoencoder próbuje nauczyć się funkcji $h(x) \approx x$, czyli funkcji identycznościowej.
  • 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)}$.
  • Otrzymujemy metodę kompresji danych.

Innymi słowy:

  • Ograniczenia nałożone na reprezentację danych w warstwie ukrytej pozwala na „odkrycie” pewnej struktury w danych.
  • _Decoder musi odtworzyć do pierwotnej postaci reprezentację danych skompresowaną przez encoder.

(rys. 14.5)

Rys. 14.5. Autoencoder - struktura

Rys. 14.5 - źródło: Chervinskii, CC BY-SA 4.0, Wikimedia Commons

  • Całkowita liczba warstw w sieci autoencodera może być większa niż 3.
  • Jako funkcji kosztu na ogół używa się błędu średniokwadratowego (_mean squared error, MSE) lub entropii krzyżowej (binary crossentropy).
  • Autoencoder może wykryć ciekawe struktury w danych nawet jeżeli $k \geq n$, jeżeli na sieć nałoży się inne ograniczenia.
  • W wyniku działania autoencodera uzyskujemy na ogół kompresję stratną.

Autoencoder a PCA

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).

Autoencoder zastosowania

Autoencoder sprawdza się gorzej niż inne algorytmy kompresji, więc nie stosuje się go raczej jako metody kompresji danych, ale ma inne zastosowania:

  • 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)
  • redukcja wymiarowości
  • VAE (_variational autoencoders) http://kvfrans.com/variational-autoencoders-explained/

14.3. Word embeddings

_Word embeddings sposoby reprezentacji słów jako wektorów liczbowych

Znaczenie wyrazu jest reprezentowane przez sąsiednie wyrazy:

“A word is characterized by the company it keeps.” (John R. Firth, 1957)

  • Pomysł pojawił sie jeszcze w latach 60. XX w.
  • _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.

Przykład 2 zdania:

  • "have a good day"
  • "have a great day"

Słownik:

  • {"a", "day", "good", "great", "have"}
  • Aby wykorzystać metody uczenia maszynowego do analizy danych tekstowych, musimy je jakoś reprezentować jako liczby.
  • Najprostsza metoda to wektory jednostkowe:
    • "a" = $(1, 0, 0, 0, 0)$
    • "day" = $(0, 1, 0, 0, 0)$
    • "good" = $(0, 0, 1, 0, 0)$
    • "great" = $(0, 0, 0, 1, 0)$
    • "have" = $(0, 0, 0, 0, 1)$
  • Taka metoda nie uwzględnia jednak podobieństw i różnic między znaczeniami wyrazów.

Metody uzyskiwania _word embeddings:

  • Common Bag of Words (CBOW)
  • Skip Gram

Obie opierają się na odpowiednim użyciu autoencodera.

Skip Gram a CBOW

  • Skip Gram lepiej reprezentuje rzadkie wyrazy i lepiej działa, jeżeli mamy mało danych.
  • CBOW jest szybszy i lepiej reprezentuje częste wyrazy.

Popularne modele _word embeddings

  • Word2Vec (Google)
  • GloVe (Stanford)
  • FastText (Facebook)

14.4. Tłumaczenie neuronowe

_Neural Machine Translation (NMT)

Neuronowe tłumaczenie maszynowe również opiera się na modelu _encoder-decoder:

  • _Encoder koduje z języka źródłowego na abstrakcyjną reprezentację.
  • _Decoder odkodowuje z abstrakcyjnej reprezentacji na język docelowy.

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).