Świetne pytanie!
tl; dr: Stan komórki i stan ukryty to dwie różne rzeczy, ale stan ukryty zależy od stanu komórki i faktycznie mają ten sam rozmiar.
Dłuższe wyjaśnienie
Różnicę między nimi widać na poniższym schemacie (część tego samego bloga):
Stan komórki to pogrubiona linia biegnąca z zachodu na wschód przez szczyt. Cały zielony blok nazywa się „komórką”.
Stan ukryty z poprzedniego kroku czasowego jest traktowany jako część danych wejściowych w bieżącym kroku czasowym.
Jednak nieco trudniej jest dostrzec zależność między nimi bez wykonania pełnego przewodnika. Zrobię to tutaj, aby zapewnić inną perspektywę, ale blog jest pod dużym wpływem. Moja notacja będzie taka sama i wykorzystam obrazy z bloga w moim objaśnieniu.
Lubię kolejność operacji nieco inaczej niż na blogu. Osobiście, na przykład zaczynając od bramki wejściowej. Przedstawię ten punkt widzenia poniżej, ale pamiętaj, że blog może być najlepszym sposobem na skonfigurowanie LSTM obliczeniowo, a to wyjaśnienie jest czysto koncepcyjne.
Oto co się dzieje:
Brama wejściowa
txtht−1
xt=[1,2,3]ht=[4,5,6]
xtht−1[1,2,3,4,5,6]
WiWi⋅[xt,ht−1]+biWibi
Załóżmy, że przechodzimy od sześciowymiarowego wejścia (długość skonkatenowanego wektora wejściowego) do trójwymiarowej decyzji o tym, które stany zaktualizować. Oznacza to, że potrzebujemy macierzy wagowej 3x6 i wektora odchylenia 3x1. Podajmy te wartości:
Wi=⎡⎣⎢123123123123123123⎤⎦⎥
bi=⎡⎣⎢111⎤⎦⎥
Obliczenia będą następujące:
⎡⎣⎢123123123123123123⎤⎦⎥⋅⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢123456⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥+⎡⎣⎢111⎤⎦⎥=⎡⎣⎢224262⎤⎦⎥
it=σ(Wi⋅[xt,ht−1]+bi)
σ(x)=11+exp(−x)x
σ(⎡⎣⎢224262⎤⎦⎥)=[11+exp(−22),11+exp(−42),11+exp(−62)]=[1,1,1]
W języku angielskim oznacza to, że zaktualizujemy wszystkie nasze stany.
Brama wejściowa ma drugą część:
Ct~=tanh(WC[xt,ht−1]+bC)
Celem tej części jest obliczenie, w jaki sposób zaktualizowalibyśmy stan, gdybyśmy to zrobili. Jest to wkład z nowego wejścia w tym kroku czasowym do stanu komórki. Obliczenia odbywają się zgodnie z tą samą procedurą zilustrowaną powyżej, ale z jednostką tanh zamiast jednostki sigmoid.
Ct~it
itCt~
Potem przychodzi brama zapomnienia, która była sednem twojego pytania.
Brama zapomnienia
Celem bramki zapomnienia jest usunięcie wcześniej wyuczonych informacji, które nie są już istotne. Przykład podany na blogu jest oparty na języku, ale możemy również pomyśleć o przesuwanym oknie. Jeśli modelujesz szeregi czasowe, które są naturalnie reprezentowane przez liczby całkowite, takie jak liczba zakaźnych osobników w danym obszarze podczas wybuchu choroby, być może po wygaśnięciu choroby w danym obszarze nie będziesz już dłużej zastanawiać się nad tym obszarem, gdy myśląc o następnej chorobie.
Podobnie jak warstwa wejściowa, warstwa zapomnienia przyjmuje stan ukryty z poprzedniego kroku czasu i nowe wejście z bieżącego kroku czasu i łączy je. Chodzi o to, aby zdecydować stochastycznie, o czym zapomnieć i o czym pamiętać. W poprzednim obliczeniu pokazałem wyjście warstwy sigmoidalnej wszystkich 1, ale w rzeczywistości było bliżej 0,999 i zaokrągliłem w górę.
Obliczenia przypominają to, co zrobiliśmy w warstwie wejściowej:
ft=σ(Wf[xt,ht−1]+bf)
To da nam wektor wielkości 3 o wartościach od 0 do 1. Udawajmy, że dał nam:
[0.5,0.8,0.9]
Następnie decydujemy stochastycznie na podstawie tych wartości, które z tych trzech części informacji należy zapomnieć. Jednym ze sposobów jest wygenerowanie liczby z jednolitego rozkładu (0, 1) i jeśli liczba ta jest mniejsza niż prawdopodobieństwo „włączenia” jednostki (0,5, 0,8 i 0,9 dla jednostek 1, 2 i 3 odpowiednio), a następnie włączamy tę jednostkę. W takim przypadku oznaczałoby to, że zapominamy o tych informacjach.
Szybka uwaga: warstwa wejściowa i warstwa zapomnienia są niezależne. Gdybym był zakładem bukmacherskim, postawiłbym się, że to dobre miejsce do równoległości.
Aktualizacja stanu komórki
Teraz mamy wszystko, czego potrzebujemy, aby zaktualizować stan komórki. Pobieramy kombinację informacji z danych wejściowych i bramek zapomnienia:
Ct=ft∘Ct−1+it∘Ct~
∘
Na bok: produkt Hadamard
x1=[1,2,3]x2=[3,2,1]
x1∘x2=[(1⋅3),(2⋅2),(3⋅1)]=[3,4,3]
Koniec na bok.
W ten sposób łączymy to, co chcemy dodać do stanu komórki (dane wejściowe) z tym, co chcemy usunąć ze stanu komórki (zapomnieć). Wynikiem jest nowy stan komórki.
Bramka wyjściowa
To da nam nowy ukryty stan. Zasadniczo celem bramki wyjściowej jest zdecydowanie, jakie informacje chcemy uwzględnić w następnej części modelu przy aktualizacji kolejnego stanu komórki. Przykładem na blogu jest znowu język: jeśli rzeczownik jest w liczbie mnogiej, odmienianie czasownika w następnym kroku ulegnie zmianie. W modelu chorobowym, jeśli wrażliwość osobników na danym obszarze jest inna niż na innym obszarze, prawdopodobieństwo wystąpienia infekcji może się zmienić.
Warstwa wyjściowa ponownie przyjmuje te same dane wejściowe, ale następnie uwzględnia zaktualizowany stan komórki:
ot=σ(Wo[xt,ht−1]+bo)
Ponownie daje to nam wektor prawdopodobieństwa. Następnie obliczamy:
ht=ot∘tanh(Ct)
Zatem bieżący stan komórki i bramka wyjściowa muszą uzgodnić, co wyprowadzić.
tanh(Ct)[0,1,1]ot[0,0,1][0,0,1]
htyt=σ(W⋅ht)
ht
Istnieje wiele wariantów LSTM, ale obejmuje to najważniejsze!