Powiedz, że używam RNN / LSTM do analizy sentymentu, co jest podejściem typu jeden do jednego (patrz ten blog ). Sieć jest trenowana przez skróconą propagację wsteczną w czasie (BPTT), w której sieć jest rozwijana tylko przez 30 ostatnich kroków, jak zwykle.
W moim przypadku każda z moich sekcji tekstowych, które chcę sklasyfikować, jest znacznie dłuższa niż rozwijanie 30 kroków (~ 100 słów). Na podstawie mojej wiedzy BPTT jest uruchamiany tylko raz dla pojedynczej sekcji tekstowej, to znaczy, gdy przejdzie on przez całą sekcję tekstową i obliczył binarny cel klasyfikacji, , który następnie porównuje z funkcją straty, aby znaleźć błąd.
Gradienty nigdy nie będą obliczane w odniesieniu do pierwszych słów każdej sekcji tekstu. W jaki sposób RNN / LSTM może nadal dostosowywać swoje wagi, aby uchwycić określone wzorce, które występują tylko w pierwszych kilku słowach? Na przykład powiedz, że wszystkie zdania oznaczone jako zaczynają się od „Kocham to”, a wszystkie zdania oznaczone jako zaczynają się od „Nienawidzę tego”. W jaki sposób RNN / LSTM wychwytuje to, gdy jest rozwijany tylko dla ostatnich 30 kroków, gdy osiągnie koniec 100-stopniowej sekwencji?
Odpowiedzi:
To prawda, że ograniczenie propagacji gradientu do 30 kroków czasowych uniemożliwi nauczenie się wszystkiego, co możliwe w zbiorze danych. Jednak to zależy w dużym stopniu od zestawu danych, czy uniemożliwi to poznanie ważnych rzeczy na temat funkcji w twoim modelu!
Ograniczanie gradientu podczas treningu przypomina bardziej ograniczanie okna, przez które model może z dużą pewnością przyswoić funkcje wprowadzania i stan ukryty. Ponieważ w czasie testowania zastosujesz model do całej sekwencji wprowadzania, nadal będzie on mógł zawierać informacje o wszystkich funkcjach wprowadzania w stanie ukrytym. Może nie wiedzieć dokładnie, jak zachować te informacje, dopóki nie dokona ostatecznej prognozy zdania, ale mogą istnieć pewne (co prawda słabsze) powiązania, które nadal byłby w stanie nawiązać.
Pomyśl najpierw o wymyślonym przykładzie. Załóżmy, że twoja sieć ma wygenerować 1, jeśli gdziekolwiek jest 1 na wejściu, a 0 w przeciwnym razie. Powiedzmy, że trenujesz sieć na sekwencjach o długości 20 i ogranicza następnie gradient do 10 kroków. Jeśli zestaw danych szkoleniowych nigdy nie zawiera 1 w ostatnich 10 krokach danych wejściowych, wówczas sieć będzie miała problem z wejściami testowymi dowolnej konfiguracji. Jeśli jednak zestaw szkoleniowy zawiera kilka przykładów, takich jak [1 0 0 ... 0 0 0], a inne, takie jak [0 0 0 ... 1 0 0], sieć będzie w stanie wykryć „obecność funkcja 1 "w dowolnym miejscu na wejściu.
Wróćmy do analizy nastrojów. Powiedzmy, że podczas treningu Twój model napotyka długie zdanie negatywne, takie jak „Nienawidzę tego, ponieważ ... w kółko” z, powiedzmy, 50 słowami w elipsie. Ograniczając propagację gradientu do 30 kroków czasowych, model nie będzie łączył „Nienawidzę tego, ponieważ” z etykietą wyjściową, więc nie odbierze „I”, „nienawidzę” lub „tego” z tego szkolenia przykład. Ale rozpozna słowa, które znajdują się w odległości 30 kroków od końca zdania. Jeśli Twój zestaw treningowy zawiera inne przykłady, które zawierają te same słowa, być może wraz z „nienawiścią”, to ma szansę na wykrycie związku między „nienawiścią” a etykietą negatywnego sentymentu. Ponadto, jeśli masz krótsze przykłady treningów, powiedz: „Nienawidzimy tego, bo to okropne!” wtedy Twój model będzie mógł połączyć funkcje „nienawiść” i „to” z etykietą docelową. Jeśli masz dość tych przykładów szkolenia, model powinien być w stanie skutecznie nauczyć się połączenia.
W czasie testu powiedzmy, że przedstawiasz modelowi kolejne długie zdanie, takie jak „Nienawidzę tego, ponieważ ... na gekonie!” Dane wejściowe modelu zaczną się od „Nienawidzę tego”, które w pewnej formie zostaną przekazane do stanu ukrytego modelu. Ten stan ukryty służy do wpływania na przyszłe ukryte stany modelu, więc nawet jeśli przed końcem zdania może być 50 słów, stan ukryty tych początkowych słów ma teoretyczną szansę wpłynięcia na wynik, nawet jeśli nigdy nie był trenowałem na próbkach, które zawierały tak dużą odległość między „nienawidzę tego” a końcem zdania.
źródło
@ Imjohns3 ma rację, jeśli przetworzysz długie sekwencje (rozmiar N) i ograniczysz propagację wsteczną do ostatnich K kroków, sieć nie nauczy się wzorców na początku.
Pracowałem z długimi tekstami i stosuję podejście, w którym obliczam straty i wykonuję propagację wsteczną po każdym kroku K. Załóżmy, że moja sekwencja miała N = 1000 tokenów, mój proces RNN najpierw K = 100, a następnie próbuję przewidywać (utratę obliczeń) i propagować wstecz. Następnie utrzymując stan RNN zahamuj łańcuch gradientu (w pytorch-> odłącz) i rozpocznij kolejne k = 100 kroków.
Dobry przykład tej techniki można znaleźć tutaj: https://github.com/ksopyla/pytorch_neural_networks/blob/master/RNN/lstm_imdb_tbptt.py
źródło