Jak wytrenować warstwę LSTM w sieci głębokiej

13

Używam sieci lstm i feed-forward do klasyfikowania tekstu.

Przekształcam tekst w pojedyncze gorące wektory i wprowadzam każdy do lstm, dzięki czemu mogę podsumować jako pojedynczą reprezentację. Następnie przesyłam go do innej sieci.

Ale jak mam trenować lstm? Chcę po prostu sklasyfikować tekst - czy powinienem go karmić bez szkolenia? Chcę tylko przedstawić przejście jako pojedynczy element, który mogę wprowadzić do warstwy wejściowej klasyfikatora.

Byłbym bardzo wdzięczny za każdą radę z tym!

Aktualizacja:

Więc mam lstm i klasyfikator. Biorę wszystkie wyniki lstm i gromadzę je w środkowej puli, a następnie wprowadzam tę średnią do klasyfikatora.

Mój problem polega na tym, że nie wiem, jak wytrenować lstm lub klasyfikator. Wiem, jakie powinny być dane wejściowe dla lstm i jakie dane wyjściowe klasyfikatora powinny być dla tych danych wejściowych. Ponieważ są to dwie oddzielne sieci, które są aktywowane sekwencyjnie, muszę wiedzieć i nie wiem, jaki powinien być idealny wynik dla lstm, który byłby również wejściem dla klasyfikatora. Czy jest na to sposób?

wordSmith
źródło

Odpowiedzi:

10

Najlepszym miejscem do rozpoczęcia pracy z LSTM jest blog A. Karpathy http://karpathy.github.io/2015/05/21/rnn-effectiveness/ . Jeśli używasz Torch7 (co zdecydowanie zalecam), kod źródłowy jest dostępny na github https://github.com/karpathy/char-rnn .

Spróbuję też trochę zmienić twój model. Użyłbym podejścia wiele do jednego, abyś wprowadzał słowa przez tabelę odnośników i dodawał specjalne słowo na końcu każdej sekwencji, aby tylko po wprowadzeniu znaku „koniec sekwencji” przeczytałeś klasyfikację wyprowadzić i obliczyć błąd na podstawie kryterium treningu. W ten sposób trenujesz bezpośrednio w nadzorowanym kontekście.

Z drugiej strony, prostszym podejściem byłoby użycie paragraph2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ) w celu wyodrębnienia funkcji dla tekstu wejściowego, a następnie uruchomienia klasyfikatora na wierzchu swoich funkcji. Wyodrębnianie funkcji wektora akapitu jest bardzo proste, aw Pythonie byłoby to:

class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename

    def __iter__(self):
        for uid, line in enumerate(open(self.filename)):
            yield LabeledSentence(words=line.split(), labels=['TXT_%s' % uid])

sentences = LabeledLineSentence('your_text.txt')

model = Doc2Vec(alpha=0.025, min_alpha=0.025, size=50, window=5, min_count=5, dm=1, workers=8, sample=1e-5)
model.build_vocab(sentences)

for epoch in range(epochs):
    try:
        model.train(sentences)
    except (KeyboardInterrupt, SystemExit):
        break
Yannis Assael
źródło
Dziękuję za odpowiedź. Rozważę je. Czy masz jakieś porady na temat konkretnego problemu w moim pytaniu - zaktualizowałem go.
wordSmith,
Nie sądzę, aby opisana procedura przyniosła jakiekolwiek rezultaty. W czym będziesz trenować przeciwko LSTM? Nie jestem pewien, czy rozumiem, dlaczego miałby używać LSTM w tym przypadku do nauki funkcji bez nadzoru przez całe zdanie. Czy masz odpowiednią literaturę na temat twojego podejścia, w której mógłbym ci pomóc? To może również zainteresować użytkownika arxiv.org/abs/1306.3584 .
Yannis Assael
Będę trenować lstm w oparciu o zbiór danych z poprzednich fragmentów tekstu i ich klas. Nie zamierzam korzystać z nauki bez nadzoru. Chcę to ręcznie wyszkolić, ale nie wiem jak. Oto moja implementacja lstm i klasyfikatora bez biblioteki uczenia maszynowego, o której wiem, że działa: pastebin.com/63Cqrnef lstm ma funkcję deepActivate, która aktywuje lstm, a następnie klasyfikator, jak wspomniałem w moim pytaniu. Oto coś, co próbuję wdrożyć: deeplearning.net/tutorial/lstm.html
wordSmith
ale kiedy próbowałem aktywować je obie jako jedną sieć, nie byłem zdefiniowany dla każdej z warstw wyjściowych. Więcej na ten temat jest tutaj: stats.stackexchange.com/q/159922/81435
wordSmith
1
Dziękuję Ci bardzo! Dostarczyłeś znacznie więcej pomocy niż było to wymagane. Dzięki, że wychodzisz z siebie.
wordSmith,