Как LSTM работает с вложениями слов для классификации текста, например, в Keras - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь понять, как LSTM используется для классификации текстовых предложений (словосочетаний), состоит из предварительно обученных вложений слов.Я читаю некоторые посты об lstm, и меня смущает подробная процедура:

Классификация IMDB с использованием LSTM на keras: https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/ Объяснение Колы по LSTM: http://colah.github.io/posts/2015-08-Understanding-LSTMs/

Скажем, например, я хочу использовать lstm для классификации обзоров фильмов, каждый обзор имеет фиксированную длину 500 слов.И я использую предварительно обученные вложения слов (из fasttext), которые дают 100-мерный вектор для каждого слова.Каковы будут размеры Xt для подачи в LSTM?И как тренируется LSTM?Если каждый Xt является 100-мерным вектором, представляющим одно слово в обзоре, должен ли я передавать каждое слово в обзоре в LSTM за раз?Что будет делать LSTM в каждую эпоху?Я действительно запутался ...

lstm cell from Colah's blog

# LSTM for sequence classification in the IMDB dataset
import numpy
from keras.datasets import imdb
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
# fix random seed for reproducibility
numpy.random.seed(7)
# load the dataset but only keep the top n words, zero the rest
top_words = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)
# truncate and pad input sequences
max_review_length = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_review_length)
X_test = sequence.pad_sequences(X_test, maxlen=max_review_length)
# create the model
embedding_vecor_length = 32
model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, epochs=3, batch_size=64)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

В приведенном выше примере кода (взято из блога Джейсона Браунли https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/), в LSTMиз 100 ячеек / нейронов. Как связаны 100 нейронов? Почему я не могу просто использовать 1 ячейку на рисунке выше для классификации, так как это повторяющийся способ, поэтому он возвращает результат самому себе в следующую метку времени?графические изображения будут приветствоваться.

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Формы с вложением:

  • Форма входных данных: X_train.shape == (reviews, words), что составляет (reviews, 500)

В LSTM (после встраивания или если у вас не было встраивания)

  • Форма входных данных: (reviews, words, embedding_size):
    • (reviews, 500, 100) -где 100 было автоматически создано встраиванием
  • Форма ввода для модели (если у вас не было слоя для встраивания) может быть:
    • input_shape = (500, 100)
    • input_shape = (None, 100) - эта опция поддерживает просмотр переменной длины
  • Каждый Xt представляет собой срез из input_data[:,timestep,:], что приводит к форме:
    • (reviews, 100)
    • Но это полностью автоматически, сделано самим слоем.
  • Каждый Ht отбрасывается, результат только последний h, потому что вы не используете return_sequences=True (но это нормально для вашей модели).

Ваш код, кажется, делает все, поэтому вам не нужно делать ничего особенного для обучения этой модели.Используйте fit с правильным X_train, и вы получите y_train с формой (reviews,1).

Вопросы:

Если каждый Xt является 100-мерным вектором, представляющим одно слово в обзоре, передам ли я каждое слово в обзоре в LSTMза раз?

Нет, слой LSTM уже делает все сам, включая все повторяющиеся шаги, при условии, что его вход имеет форму (reviews, words, embedding_size)


Как связаны между собой 100 нейронов?

Они являются чем-то параллельным (вы можете представить 100 изображений, как вы разместили, все параллельно), почти так же, как другие виды обычных слоев.

Но на повторяющихся этапах присутствует математическое выражение, заставляющее их разговаривать (к сожалению, я не могу точно объяснить, как именно).


Почему я не могу простоиспользовать 1 ячейку на рисунке выше для классификации, так как это повторяющийся способ, поэтому он возвращает выходные данные самому себе в следующей отметке времени?

Можно, если хотите, но чем больше ячеек, тем умнееслой (как это происходит с любым другим видом слоя)

В выбранном номере 100 нет ничего особенного.Это, вероятно, совпадение или недоразумение.Это может быть любое число, 50 ячеек, 200 ячеек, 1000 ячеек ...


Глубокое понимание LSTM:

0 голосов
/ 19 мая 2018

Вы путаете некоторые термины, давайте попытаемся прояснить, что происходит шаг за шагом:

  1. Данные в вашем случае будут иметь форму (сэмплы, 500), что означает, что у нас есть некоторое количестворецензии, каждое рецензирование - это максимум 500 слов, закодированных как целые числа.
  2. Тогда слой Embedding переходит words[index] для каждого слова в каждом образце, давая тензор (samples, 500, 100), если ваш размер вложения равен 100.
  3. Теперь вот сбивающий с толку бит, когда мы говорим LSTM(100), это означает слой, который запускает одну ячейку LSTM (такую, как на диаграмме Кола) над каждым словом, которое имеет выходразмер 100. Позвольте мне повторить это снова, вы создаете одну ячейку LSTM, которая преобразует входные данные в выходной размер 100 (скрытый размер), и слой запускает такую ​​же ячейку над словами.
  4. Теперь мы получаем (сэмплы, 100), потому что один и тот же LSTM обрабатывает каждый просмотр 500 слов и возвращает окончательный результат размером 100. Если, например, мы передали return_sequences=True, то каждый скрытый вывод, h-1, h,ч + 1 вДиаграмма будет возвращена таким образом, чтобы мы получили форму (сэмплы, 500, 100).
  5. Наконец, мы передаем (сэмплы, 100) слою Dense, чтобы сделать прогноз, который дает (сэмплы,1) поэтому прогноз для каждого обзора в пакете.

Уберите урок, заключающийся в том, что слой LSTM оборачивается вокруг LSTMCell и запускает егодля каждого временного шага, так что вам не нужно писать циклические операции самостоятельно.

...