14 KiB
14. Rekurencyjne sieci neuronowe
14.1. Rekurencyjne sieci neuronowe
RNN – _Recurrent Neural Network
LSTM – _Long Short Term Memory
Rekurencyjna sieć neuronowa – schemat
Rys. 11.1.
Rys. 11.1 - ź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?
Przewidywanie ciągów czasowych za pomocą LSTM – przykład
https://machinelearningmastery.com/time-series-forecasting-long-short-term-memory-network-python/
GRU – _Gated Recurrent Unit
- Rodzaj rekurencyjnej sieci neuronowej wprwadzony w 2014 roku
- Ma prostszą budowę niż LSTM (2 bramki zamiast 3).
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. 13.1)
Rys. 13.1 - ź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. 13.2)
Rys. 13.2 - ź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)
Więcej o word embeddings: https://towardsdatascience.com/introduction-to-word-embedding-and-word2vec-652d0c2060fa
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).