Idea Recurrent Neural Network (RNN) jest dla mnie jasna. Rozumiem to w następujący sposób:
Mamy sekwencję obserwacji ( ) (lub innymi słowy, wielowymiarowe szeregi czasowe). Każda pojedyncza obserwacja jest wymiarową wektor numeryczne. W modelu RNN zakładamy, że następna obserwacja jest funkcją wcześniejszej obserwacji a także poprzedniego „stanu ukrytego” , gdzie stany ukryte są również reprezentowane przez numeryczne wektory (wymiary stanów obserwowanych i ukrytych mogą być różne). Zakłada się również, że same stany ukryte zależą od poprzedniej obserwacji i stanu ukrytego:
Wreszcie w modelu RNN zakłada się , że funkcja jest siecią neuronową. Trenujemy (dopasowujemy) sieć neuronową, wykorzystując dostępne dane (sekwencja obserwacji). Naszym celem w treningu jest możliwość jak najdokładniejszego przewidzenia następnej obserwacji przy użyciu poprzednich obserwacji.
Teraz sieć LSTM jest modyfikacją sieci RNN. O ile rozumiem, motywacją stojącą za LSTM jest rozwiązanie problemu krótkiej pamięci charakterystycznej dla RNN (konwencjonalne RNN mają problemy z powiązaniem zdarzeń, które są zbyt daleko od siebie oddzielone w czasie).
Rozumiem, jak działają sieci LSTM. Oto najlepsze wyjaśnienie LSTM , które znalazłem. Podstawowa idea jest następująca:
Oprócz wektora stanu ukrytego wprowadzamy tak zwany wektor „stanu komórki”, który ma ten sam rozmiar (wymiarowość) co wektor stanu ukrytego ( ). Myślę, że wektor „stanu komórki” został wprowadzony do modelowania pamięci długoterminowej. Podobnie jak w przypadku konwencjonalnego RNN, sieć LSTM otrzymuje na wejściu obserwowany i ukryty stan. Korzystając z tych danych wejściowych, obliczamy nowy „stan komórki” w następujący sposób:
gdzie funkcje , i są modelowane przez sieci neuronowe. Aby uprościć wyrażenie, po prostu usuwam argumenty:
Widzimy więc, że nowy „wektor stanu komórki” ( ) jest sumą ważoną starego wektora stanu ( ) i „pośredniego” wektora stanu komórki ( ). Mnożenie między wektorami odbywa się w oparciu o komponenty (mnożymy dwa N-wymiarowe wektory i otrzymujemy w rezultacie inny N-wymiarowy wektor). Innymi słowy, mieszamy dwa wektory stanów komórek (stary i pośredni), stosując wagi właściwe dla składników.
Oto intuicja między opisanymi operacjami. Wektor stanu komórki można interpretować jako wektor pamięci. Drugi wektor wag (obliczony przez sieć neuronową) jest bramą „zachowaj” (lub zapomnij). Jego wartości decydują, czy zachować, czy zapomnieć (usunąć) odpowiednią wartość z wektora stanu komórki (lub wektora pamięci długoterminowej). Pierwszy wektor wag ( ), który jest obliczany przez inną sieć neuronową, nazywa się bramką „zapisz” lub „zapamiętaj”. Decyduje, czy nowa pamięć („pośredni” wektor stanu komórki) musi zostać zapisana (a ściślej, czy konkretny jej element musi zostać zapisany / zapisany). „Pośredni”wektor). Właściwie dokładniej byłoby powiedzieć, że z dwoma wektorami wag ( i ) „miksujemy” starą i nową pamięć.
Po opisanym powyżej mieszaniu (lub zapominaniu i zapamiętywaniu) mamy nowy wektor stanu komórki. Następnie obliczamy „pośredni” stan ukryty za pomocą innej sieci neuronowej (jak poprzednio, jako dane wejściowe używamy stanu obserwowanego i stanu ukrytego ). Na koniec łączymy nowy stan komórki (pamięć) ze „pośrednim” stanem ukrytym ( ), aby uzyskać nowy (lub „końcowy”) stan ukryty, który faktycznie wyprowadzamy:
gdzie jest funkcją sigmoidalną stosowaną do każdego komponentu wektora stanu komórki.
Moje pytanie brzmi: dlaczego (lub jak dokładnie) ta architektura rozwiązuje problem?
W szczególności nie rozumiem co następuje:
- Używamy sieci neuronowej do generowania pamięci „pośredniej” (wektor stanu komórki), która jest mieszana ze „starą” pamięcią (lub stanem komórki), aby uzyskać „nową” pamięć (stan komórki). Współczynniki ważenia dla mieszania są również obliczane przez sieci neuronowe. Ale dlaczego nie możemy użyć tylko jednej sieci neuronowej do obliczenia „nowego” stanu komórki (lub pamięci). Innymi słowy, dlaczego nie możemy wykorzystać stanu obserwowanego, stanu ukrytego i starej pamięci jako danych wejściowych do sieci neuronowej, która oblicza „nową” pamięć?
- Na koniec używamy stanów obserwowanych i ukrytych do obliczenia nowego stanu ukrytego, a następnie używamy „nowego” stanu komórki (lub (długoterminowej) pamięci) do korygowania składnika nowo obliczonego stanu ukrytego. Innymi słowy, składniki stanu komórki są używane tak samo jak wagi, które po prostu zmniejszają odpowiednie składniki obliczonego stanu ukrytego. Ale dlaczego wektor stanu komórki jest używany w ten właśnie sposób? Dlaczego nie możemy obliczyć nowego stanu ukrytego poprzez umieszczenie wektora stanu komórki (pamięci długoterminowej) na wejściu sieci neuronowej (która również przyjmuje dane obserwowane i ukryte jako dane wejściowe)?
Dodany:
Oto wideo, które może pomóc wyjaśnić, w jaki sposób zorganizowane są różne bramki („zachowaj”, „napisz” i „przeczytaj”).
Odpowiedzi:
Jak rozumiem twoje pytania, to, co widzisz, zasadniczo łączy dane wejściowe, poprzedni stan ukryty i poprzedni stan komórki i przekazuje je przez jedną lub kilka w pełni połączonych warstw w celu obliczenia wyjściowego stanu ukrytego i stanu komórki, zamiast niezależnego obliczania „bramkowanego” „aktualizacje, które współdziałają arytmetycznie ze stanem komórki. To w zasadzie stworzyłoby zwykły RNN, który generowałby tylko część stanu ukrytego.
Głównym powodem, aby tego nie robić, jest to, że struktura obliczeń stanu komórki LSTM zapewnia stały przepływ błędów przez długie sekwencje . Jeśli używałeś ciężarów do bezpośredniego obliczenia stanu komórki, będziesz musiał ponownie się z nimi propagować na każdym kroku! Unikanie takich operacji w dużej mierze rozwiązuje zanikanie / eksplodowanie gradientów, które w przeciwnym razie nękają RNN.
Dodatkowo, możliwość łatwego przechowywania informacji w dłuższym okresie czasu jest miłym dodatkiem. Intuicyjnie byłoby znacznie trudniej dla sieci uczyć się od zera, aby zachować stan komórki przez dłuższy czas.
Warto zauważyć, że najpopularniejsza alternatywa dla LSTM, GRU , podobnie oblicza aktualizacje stanu ukrytego bez uczenia się wag, które działają bezpośrednio na sam stan ukryty.
źródło
Jeśli dobrze zrozumiałem, oba pytania sprowadzają się do tego. Dwa miejsca, w których do przetwarzania informacji używamy zarówno tanh, jak i sigmoid. Zamiast tego powinniśmy użyć jednej sieci neuronowej, która pobiera wszystkie informacje.
Nie znam wad korzystania z jednej sieci neuronowej. Moim zdaniem możemy użyć pojedynczej sieci neuronowej o nieliniowości sigmoidalnej, która prawidłowo uczy się wektora, który zostanie odpowiednio zastosowany (dodany w stanie komórkowym w pierwszym przypadku lub przekazany jako stan ukryty w drugim przypadku).
Jednak w sposób, w jaki to robimy teraz, dzielimy to zadanie na dwie części, z których jedna wykorzystuje nieliniowość sigmoidalną do ustalenia ilości danych, które należy przechowywać. Drugą częścią, która wykorzystuje tanh jako nieliniowość, jest po prostu zadanie uczenia się ważnych informacji.
Mówiąc najprościej, sigmoid uczy się, ile oszczędzać, a tanh uczy się, co oszczędzać, a rozbicie go na dwie części ułatwi trening.
źródło