Załóżmy następującą sekwencję 1 wymiarową:
A, B, C, Z, B, B, #, C, C, C, V, $, W, A, % ...
Litery A, B, C, ..
tutaj reprezentują „zwykłe” wydarzenia.
Symbole #, $, %, ...
tutaj reprezentują zdarzenia „specjalne”
Czasowy odstęp między wszystkimi zdarzeniami jest nierównomierny (od sekund do dni), chociaż im dalej w przeszłości wydarzenie, tym mniejsze prawdopodobieństwo, że wpłynie na przyszłe wydarzenia. Idealnie mogę wyraźnie uwzględnić te opóźnienia czasowe.
Istnieje rząd 10000 zwykłych rodzajów zdarzeń i 100 specjalnych rodzajów zdarzeń. Liczba zwykłych zdarzeń poprzedzających wydarzenie specjalne jest różna, ale raczej nie przekracza 100-300.
Zasadniczo jestem zainteresowany wyszukiwaniem wzorców w zwykłej sekwencji zdarzeń, które ostatecznie przewidują zdarzenia specjalne.
Teraz możesz podejść do tego na różne sposoby: tworzenie wektorów cech + standardowa klasyfikacja, uczenie się reguł asocjacyjnych, HMM itp.
W tym przypadku jestem ciekawy, jak najlepiej dopasować sieć oparta na LSTM. Łatwo byłoby zrobić coś takiego, jak charakter Karparthy'ego i przewidzieć następne wydarzenie, biorąc pod uwagę historię. Następnie dla nowej sekwencji
C, Z, Q, V, V, ... , V, W
Możesz uruchomić go przez model i zobaczyć, jakie wydarzenie specjalne jest najbardziej prawdopodobne. Ale nie do końca pasuje.
Ponieważ jest to problem z klasyfikacją czasową, wydaje się, że właściwym rozwiązaniem jest skorzystanie z Klasyfikacji Czasowej Łącznika, zgodnie z opisem Alexa Gravesa .
Jednak zanim zainwestuję w tej chwili za dużo, szukam czegoś łatwiejszego i szybszego do eksperymentowania, aby przekonać się, jak dobrze pasują tutaj LSTM. W pewnym momencie Tensorflow zobaczy przykład CTC , ale jeszcze nie.
Więc moje (pod) pytania to:
- Biorąc pod uwagę powyższy problem i chciałbym eksperymentować z LSTM, czy warto wypróbować podejście typu char-rnn, czy powinienem ugryźć kulę i opanować CTC, czy też jest lepsze miejsce na start.
- Jak byś wyraźnie uwzględnił informacje dotyczące czasu między zdarzeniami. Korzystanie ze stałego zegara ze zdarzeniami braku operacji oczywiście działa, ale wydaje się brzydkie.
- Zakładając, że udało mi się wyszkolić LSTM, czy istnieje sposób na sprawdzenie modelu, aby zobaczyć, jakie rodzaje „motywów” zdarzenia udało się wykryć? (tj. analogicznie do filtrów w sieciach konwekcyjnych)
Każdy przykładowy kod (preferowany python) zawsze jest pomocny.
Edycja: Wystarczy dodać, że w sekwencji jest trochę hałasu. Niektóre zdarzenia można bezpiecznie zignorować, ale dokładnie tych, które nie zawsze można powiedzieć z góry. Idealnie więc model (i motywy z niego wywodzące) jest odporny na to.
Odpowiedzi:
Twoje dane wydają się być tylko sekwencjami tokenów. Spróbuj zbudować automatyczny koder LSTM i pozwól, aby koder nauczył się pewnych stałych reprezentacji pierwszej części sekwencji i dekodera, aby przewidzieć pozostałe.
Te przedstawienia będą twoimi motywami.
Ref:
Bahdanau, D., Cho, K., i Bengio, Y. (2014). Tłumaczenie maszyn neuronowych poprzez wspólną naukę wyrównywania i tłumaczenia. nadruk arXiv arXiv: 1409.0473.
Srivastava, N., Mansimov, E., i Salakhutdinov, R. (2015). Uczenie się reprezentacji wideo bez nadzoru przy użyciu LSTM. nadruk arXiv arXiv: 1502.04681.
źródło
Najważniejsze jest to, jak „sformułować” problem klasyfikacji, co oznacza, w jaki sposób reprezentujesz dane wejściowe i co chcesz wygenerować. Ponieważ masz tak wiele różnych rodzajów zdarzeń, musisz nauczyć się ich osadzania. Można to zrobić bezpośrednio np. W Keras. Możesz zobaczyć ten przykładjak nauczyć się osadzania bezpośrednio z danych. Innym podejściem byłoby wcześniejsze nauczenie się osadzania przy użyciu podejścia bez nadzoru, takiego jak word2vec. Wymaga to jednak więcej pracy z Twojej strony, ponieważ musisz wymyślić odpowiednie zadanie i przeszkolić je, aby wygenerować osadzanie. Biorąc pod uwagę, że masz wystarczającą ilość danych, łatwiej jest (choć nieco mniej skutecznie) bezpośrednio nauczyć się osadzania. W przypadku wyników nie przewidziałbym wszystkich różnych rodzajów zdarzeń, a jedynie zdarzenia specjalne i „klasę tła”, aby problem był wykonalny. Jeśli naprawdę chcesz przewidzieć każdą klasę, musisz użyć kilku sztuczek (zobacz, jak to robi word2vec).
Jeśli chodzi o czas między zdarzeniami. Możesz po prostu dodać to do LSTM jako dodatkowy wymiar (zobacz np. To, jak to zrobić w Keras). Byłoby to łatwe i pozwoliłoby LSTM uwzględnić różnicę czasową.
Nie znam żadnego sposobu wizualizacji motywów poprzez „rozwijanie” temporalnej natury sieci. Możesz generować niektóre motywy za pomocą sieci generatywnej, ale prawdopodobnie trudno będzie je zinterpretować. Jednym ze sposobów eksploracji motywów może być po prostu znalezienie 100 000 najpopularniejszych sekwencji nietypowych zdarzeń, np. O długości 20–100, wprowadzenie ich do wyuczonego modelu i wyodrębnienie wyniku prawdopodobieństwa z końcowej warstwy softmax. W ten sposób można znaleźć sekwencje powiązane z określonymi wydarzeniami specjalnymi. Trudno jednak powiedzieć, czy to podejście motywacyjne jest wykonalne / użyteczne bez patrzenia na twoje dane.
źródło