Sztuczne sieci neuronowe w przetwarzaniu języka naturalnego¶


dr inż. Aleksander Smywiński-Pohl¶

apohllo@agh.edu.pl¶

http://apohllo.pl/dydaktyka/nlp¶

konsultacje: czw. 16:30-17:30¶

Sztuczne sieci neuronowe (artificial neural networks - ANN)¶

 

 

 

 

$$ z = w \cdot x + b $$
$$ y = a = f(z) $$
$$ \sigma(z) = \frac{1}{1 + e^{-z}} $$
$$ tanh(z) = \frac{e^z - e^{-z}}{e^z+e^{-z}} $$
$$ ReLU(z) = max(x, 0) $$

Sigmoida¶

 

Tangens hiperboliczny¶

 

ReLU¶

 

Sieć w pełni połączona
(feed-forward NN)¶

 

 

$$ h = f(Wx + b) $$
$$ x \in R^{n_0} $$$$ h \in R^{n_1} $$$$ b \in R^{n_1} $$$$ W \in R^{n_0 \times n_1} $$
$$ z = Uh $$
$$ \text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^d e^{z_j}} $$

Uogólniona notacja¶

$$ \begin{split} a^{[0]} & = x\\ z^{[1]} & = W^{[1]}a^{[0]} + b^{[1]}\\ a^{[1]} & = g^{[1]}\left(z^{[1]}\right)\\ \end{split} $$
$$ \begin{split} z^{[2]} & = W^{[2]}a^{[1]}+b^{[2]}\\ a^{[2]} & = g^{[2]}\left(z^{[2]}\right)\\ \hat y & = a^{[2]} \end{split} $$
$$ \begin{split} z^{[i]} & = W^{[i]}a^{[i-1]} + b^{[i]}\\ a^{[i]} & = g^{[i]}\left(z^{[i]}\right) \end{split} $$

Funkcja straty (loss function)¶

$$ L_{CE}(\hat y,y) = - \sum_{i=1}^{C} y_i log\hat y_i $$
$$ L_{CE}(\hat y,y) = - log \hat y_i $$
$$ L_{CE}(\hat y,y) = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}} $$

Graf obliczeń¶

 

 

$$ \begin{split} d & = 2 * b\\ e & = a + d\\ L & = c * e \end{split} $$

Wsteczna propagacja błędu (error backpropagation, backprop)¶

$$ f(x) = u(v(x)) $$
$$ \frac{df}{dx} = \frac{du}{dv}\cdot\frac{dv}{dx} $$
$$ \frac{\partial L}{\partial a}, \frac{\partial L}{\partial b}, \frac{\partial L}{\partial c} $$
$$ \frac{\partial L}{\partial c} = e $$
$$ \begin{split} \frac{\partial L}{\partial a} & = \frac{\partial L}{\partial e}\frac{\partial e}{\partial a}\\ \frac{\partial L}{\partial b} & = \frac{\partial L}{\partial e}\frac{\partial e}{\partial d}\frac{\partial d}{\partial a} \end{split} $$
$$ \begin{split} L = ce & : \frac{\partial L}{\partial c}=e,\frac{\partial L}{\partial e}=c\\ e = a+d & : \frac{\partial e}{\partial a} =1,\frac{\partial e}{\partial d}=1\\ d = 2b & : \frac{\partial d}{\partial b}=2 \end{split} $$

Przejście w tył w grafie obliczeń¶

 

 

Proces uczenia¶

  • stała ucząca/współczynnik uczenia się (learning rate)
  • inicjalizacja wag
  • mini-batch
  • epoki
  • wczesne zatrzymanie (early stopping)
  • dropout
  • algorytm optymalizacji
  • optymalizacja hiperparametrów
  • rola zbioru walidacyjnego
  • środowiska do obliczeń: PyTorch, TensorFlow, Jax

Kluczowy problem - sekwencyjna natura tekstu¶

  • Proste modele, jak bag-of-words nie nadają się do klasyfikacji tokenów
  • Modele takie jak HMM, MEMM są ograniczone jeśli chodzi o reprezentację kontekstu:
    • kontekst jest niewielki: 2-3 tokeny
    • cechy są określane manualnie
  • Zależności w tekście mogą być długodystansowe
    • Gdybym wiedział wtedy to co wiem dzisiaj, to bym się nie ...
    • Gdybym wiedziała wtedy to co wiem dzisiaj, to bym się nie ...

Sieci rekurencyjne (RNN)¶

 

Połącznie rekurencyjne wykorzystuje aktywację danej komórki z poprzedniego kroku czasowego.

Dzięki temu - potencjalnie - może wykorzystac informację istotnie odległą w treści od tokenu podlegającego właśnie analizie. Taka zależność potencjalnie może mieć dowolną długość.

Inferencja w sieci rekurencyjnej¶

 

 

$$ h_t = g(U h_{t-1} + W x_t) $$
$$ y_t = f(V h_t) $$

Najczęściej f to funkcja softmax:

$$ \text{softmax}(\mathbf{y})_{i,t} = \frac{e^{y_{i,t}}}{\sum_{j=1}^K e^{y_{j,t}}} $$

Algorytm inferencji¶

 

Wynik obliczania wartości dla pojedynczego kroku to rozkład prawdopodobieństwo przypisania określonego tagu do aktualnie przetwarzanego tokenu. Warto zwrócić uwagę, że dla 1 tokenu wcześniejszy stan ma wartość 0.

Wsteczna propagacja błędu w sieci rekurencyjnej (BPTT)¶

 

BPTT jest dość skomplikowanym procesem. Ponieważ jednak możemy przekształcić obliczenia w formę rozwinięta, stają się one "zwykłym" grafem obliczeniowym, a co za tym idzie obsługiwane są przez narzędzia takie jak PyTorch jak każda inna sieć rekurencyjna.

Klasyfikacja tokenów przy użyciu RNN¶

 

  1. Trzeba wskazać, że nie opowiedziałem jak słowa zamieniane są na reprezentacje wektorowe!
  2. RNN nie biorą pod uwagę tego co było wcześniej (tzn. predykcji), więc można np. otrzymać po B-ORG I-PERS
  3. Często dodaje się warstwę CRF na końcu, żeby rozwiązać ten problem.
  4. Innym rozwiązaniem jest użycie algorytmu Viterbiego (np. z jakimś beamem większym niż 1).

Głębokie sieci rekurencyjne¶

 

Sieci dwukierunkowe (BiRNN)¶

 

 

$$ h_t^f = RNN_{forward}(x_1^t) $$
$$ h_t^b = RNN_{backward}(x_t^n) $$
$$ h_t = h_t^f \oplus h_t^b $$

Funkcja łącząca oba wektory nie musi być kontaktenacją, może to być dodawanie, monożenie lub uśrednianie wartości.

Sieć z długą pamięcią krótkoterminową (LSTM)¶

  • informacja rozbita jest na dwie części:
    • kontekst
    • stan ukryty
  • składa się z bramek
  • struktura bramki:
    • feed-forward
    • funkcja sigmoidalna
    • iloczyn punktowy
  • typy bramek:
    • zapominająca
    • dodająca
    • wyjściowa
  • Kontekst przekazywany jest do dalszych obliczeń
  • Stan ukryty wykorzystywany jest w aktualnym obliczeniu
  • Bramka zapominająca czyści kontekst
  • Bramka dodająca decyduje co z poprzedniego stanu ukrytego ma trafić do przyszłego kontekstu
  • Bramka wyjściwa decyduje co z aktualnego kontekstu ma trafić do aktualnego stanu ukrytego

Struktura komórki LSTM¶

 

Bramka zapominająca¶

  • definiowana przez dwie macierze: $U_f$, $W_f$
$$ f_t = \sigma(U_f h_{t-1}+W_f x_t) $$

Ta wartość określa, które elementy z poprzedniego kontekstu zostaną zapominane (jeśli wartość danego składnika wektora jest bliska 0).

$$ k_t = c_{t-1}\odot f_t $$

Poprzedni kontekst $c_{t-1}$ jest mnożony przez bramkę zapominającą przez co usuwane są z niego pewne składowe.

Bramka dodająca¶

  • definiowana przez cztery macierze: $U_g$, $W_g$, $U_i$, $W_i$
$$ g_t = tanh(U_g h_{t-1} + W_g x_t) $$

Dwie pierwsze macierze służą do transformacji poprzedniego stanu ukrytego oraz aktualnego wyjścia przez funkcję tangansa hiperbolicznego. Jest to "wsad" dla nowego kontekstu.

$$ i_t = \sigma(U_i h_{t-1} + W_i x_t) $$

Dwie pozostałe macierze służą - analogicznie jak w bramce zapominającej - do określenia, co zostanie przepuszczone dalej z tego "wsadu".

$$ j_t = g_t \odot i_t $$

Wyjściem bramki dodającej jest druga składowa nowego kontekstu, czyli część informacji z poprzeniego stanu ukrytego oraz aktualnego wejścia.

Bramka wyjściowa¶

  • definiowana jest przez macierze $U_o$, $W_o$
$$ c_t = k_t + j_t $$

Jej wejściem jest aktualny kontekst, który wyliczany jest po przejściu obliczeń przez bramkę zapominającą oraz bramkę dodającą.

$$ o_t = \sigma(U_o h_{t-1} + W_o x_t) $$

Analogicznie jak w innych bramkach, macierze wykorzystywane są do obliczenia maski na podstawie poprzedniego stanu ukrytego oraz aktualnego wejścia.

$$ h_t = o_t \odot tanh(c_t) $$

Ostatecznie stan ukryty to pewne elementy aktualnego kontekstu, którze przeszły przez bramkę wyjściową.

Literatura¶

  • 9 rozdział SLP
  • Recurrent Neural Networks and LSTM explained