This commit is contained in:
Filip Gralinski 2022-05-14 10:27:03 +02:00
parent 09ccde4ea7
commit c2d5a96afc
5 changed files with 1341 additions and 10 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -136,22 +136,84 @@ zapominana, a pozostałe — wnoszą wkład w całości.
Najpierw zdefiniujmy pośredni stan $\vec{\xi} \in \mathcal{R}^p$: Najpierw zdefiniujmy pośredni stan $\vec{\xi} \in \mathcal{R}^p$:
$$\vec{\xi_t} = \operatorname{tanh}(W_{\xi}[\Gamma_\gamma \bullet c_{t-1}, E(w_t)] + b_{\xi}),$$ $$\vec{\xi_t} = \operatorname{tanh}(W_{\xi}[\Gamma_\gamma \bullet \vec{s_{t-1}}, E(w_t)] + b_{\xi}),$$
gdzie $\bullet$ oznacza iloczyn Hadamarda (nie iloczyn skalarny!) dwóch wektorów: gdzie $\bullet$ oznacza iloczyn Hadamarda (nie iloczyn skalarny!) dwóch wektorów:
$$[x_1,\dots,x_n] \bullet [y_1,\dots,y_n] = [x_1 y_1,\dots,x_n y_n].$$ $$[x_1,\dots,x_n] \bullet [y_1,\dots,y_n] = [x_1 y_1,\dots,x_n y_n].$$
Obliczanie $\vec{\xi_t}$ bardzo przypomina zwykłą sieć rekurencyjną, Jak widać, obliczanie $\vec{\xi_t}$ bardzo przypomina zwykłą sieć rekurencyjną,
jedyna różnica polega na tym, że za pomocą bramki $\Gamma_\gamma$ jedyna różnica polega na tym, że za pomocą bramki $\Gamma_\gamma$
modulujemy wpływ poprzedniego stanu. modulujemy wpływ poprzedniego stanu.
Ostateczna wartość stanu jest średnią ważoną poprzedniego stanu i bieżącego stanu pośredniego: Ostateczna wartość stanu jest średnią ważoną poprzedniego stanu i bieżącego stanu pośredniego:
$$\vec{c_t} = \Gamma_u \bullet \vec{\xi_t} + (1 - \Gamma_u) \bullet \vec{c_{t-1}}.$$ $$\vec{s_t} = \Gamma_u \bullet \vec{\xi_t} + (1 - \Gamma_u) \bullet \vec{s_{t-1}}.$$
Skąd się biorą bramki $\Gamma_\gamma$ i $\Gamma_u$? Również z poprzedniego stanu i z biężacego wyrazu. Skąd się biorą bramki $\Gamma_\gamma$ i $\Gamma_u$? Również z poprzedniego stanu i z biężacego wyrazu.
$$\Gamma_\gamma = \sigma(W_\gamma[\vec{c_{t-1}},E(w_t)] + b_\gamma),$$ $$\Gamma_\gamma = \sigma(W_\gamma[\vec{s_{t-1}},E(w_t)] + \vec{b_\gamma}),$$
$$\Gamma_u = \sigma(W_u[\vec{c_{t-1}},E(w_t)] + b_u),$$ $$\Gamma_u = \sigma(W_u[\vec{s_{t-1}},E(w_t)] + \vec{b_u}),$$
** Sieć LSTM
Architektura LSTM (/Long Short-Term Memory/), choć powstała wcześniej
niż GRU, jest od niej nieco bardziej skomplikowana.
- zamiast dwóch bramek LSTM zawiera **trzy bramki**: bramkę wejścia (/input gate/),
bramkę wyjścia (/output gate/) i bramkę zapominania (/forget gate/),
- oprócz ukrytego stanu $\vec{s_t}$ sieć LSTM posiada również **komórkę pamięci** (/memory cell/),
$\vec{c_t}$, komórka pamięci, w przeciwieństwie do stanu, zmienia się wolniej (intuicyjnie:
/jeśli nie zrobimy nic specjalnego, wartość komórki pamięci się nie zmieni/).
*** Wzory
Komórka pamięci modulowana jest za pomocą bramki zapominania ($\Gamma_f$) i bramki
wejścia ($\Gamma_i$), bramki te określają na ile uwzględniamy, odpowiednio,
poprzednią wartość komórki pamięci $\vec{c_{t-1}}$ i wejście, a
właściwie wejście w połączeniu z poprzednim stanem:
$$\vec{c_t} = \Gamma_f \bullet \vec{c_{t-1}} + \Gamma_i \bullet \vec{\xi_t},$$
gdzie wektor pomocniczy $\vec{\xi_t}$ wyliczany jest w następujący sposób:
$$\vec{\xi_t} = \operatorname{tanh}(W_{\xi}[\vec{s_{t-1}}, E(w_t)] + \vec{b_\xi}.$$
Nowa wartość stanu sieci nie zależy bezpośrednio od poprzedniej wartości stanu, lecz
jest równa komórce pamięci modulowanej bramką wyjścia:
$$\vec{h_t} = \Gamma_o \bullet \operatorname{tanh}(\vec{c_t}).$$
*** Obliczanie bramek
Wartości wszystkie trzech bramek są liczone w identyczny sposób (wzory
różnią się tylko macierzami wag i wektorem obciążeń):
$$\Gamma_f = \sigma(W_f[\vec{s_{t-1}}, E(w_t)] + \vec{b_f}),$$
$$\Gamma_i = \sigma(W_i[\vec{s_{t-1}}, E(w_t)] + \vec{b_i}),$$
$$\Gamma_o = \sigma(W_o[\vec{s_{t-1}}, E(w_t)] + \vec{b_o}).$$
*** Wartości początkowe
Początkowe wartości stanu i komórki pamięci mogą być ustawione na zero:
$$\vec{s_0} = \vec{0},$$
$$\vec{c_0} = \vec{0}.$$
*** Podsumowanie
Sieci LSTM dominowały w zagadnieniach przetwarzania języka naturalnego
(ogólniej: przetwarzania sekwencji) do czasu pojawienia się
architektury Transformer w 2017 roku.
Na sieci LSTM oparty był ELMo, jeden z pierwszych dużych
**pretrenowanych modeli języka**, dostrajanych później pod konkretne
zadania (na przykład klasyfikację tekstu), zob. artykuł [Deep
contextualized word
representations](https://arxiv.org/pdf/1802.05365.pdf). Dokładniej
mówiąc, ELMo był siecią **BiLSTM**, połączeniem dwóch sieci, jednej
działającej z lewej strony na prawą, drugiej — z prawej do lewej.