Я пытался понять пример кода с помощью https://www.tensorflow.org/tutorials/recurrent который вы можете найти на https://github.com/tensorflow/models/blob/master/tutorials/rnn/ptb/ptb_word_lm.py.
(Используя тензорный поток 1.3.0.)
Я резюмировал (как мне кажется) ключевые части моего вопроса ниже:
size = 200
vocab_size = 10000
layers = 2
# input_.input_data is a 2D tensor [batch_size, num_steps] of
# word ids, from 1 to 10000
cell = tf.contrib.rnn.MultiRNNCell(
[tf.contrib.rnn.BasicLSTMCell(size) for _ in range(2)]
)
embedding = tf.get_variable(
"embedding", [vocab_size, size], dtype=tf.float32)
inputs = tf.nn.embedding_lookup(embedding, input_.input_data)
inputs = tf.unstack(inputs, num=num_steps, axis=1)
outputs, state = tf.contrib.rnn.static_rnn(
cell, inputs, initial_state=self._initial_state)
output = tf.reshape(tf.stack(axis=1, values=outputs), [-1, size])
softmax_w = tf.get_variable(
"softmax_w", [size, vocab_size], dtype=data_type())
softmax_b = tf.get_variable("softmax_b", [vocab_size], dtype=data_type())
logits = tf.matmul(output, softmax_w) + softmax_b
# Then calculate loss, do gradient descent, etc.
Мой самый большой вопрос: как мне использовать созданную модель для фактического создания предложения следующего слова с учетом первых нескольких слов предложения? Конкретно, я предполагаю, что поток такой, но я не могу понять, каким будет код для прокомментированных строк:
prefix = ["What", "is", "your"]
state = #Zeroes
# Call static_rnn(cell) once for each word in prefix to initialize state
# Use final output to set a string, next_word
print(next_word)
Мои подвопросы:
- Зачем использовать случайное (неинициализированное, неподготовленное) встраивание слов?
- Зачем использовать softmax?
- Должен ли скрытый слой соответствовать размеру ввода (т.е. размеру вложений word2vec)
- Как / Могу ли я использовать предварительно обученную модель word2vec вместо неинициализированной?
(Я задаю их все как один вопрос, поскольку подозреваю, что все они связаны между собой и связаны с некоторым пробелом в моем понимании.)
Я ожидал увидеть здесь загрузку существующего набора вложений слов word2vec (например, с использованием KeyedVectors.load_word2vec_format()
от gensim), преобразование каждого слова во входном корпусе в это представление при загрузке в каждом предложении, а затем LSTM будет выдавать вектор того же измерения, и мы попытаемся найти наиболее похожее слово (например, используя gensim's similar_by_vector(y, topn=1)
).
Спасает ли нас использование softmax от относительно медленного similar_by_vector(y, topn=1)
вызова?
Кстати, для уже существующей части word2vec моего вопроса Использование предварительно обученного word2vec с LSTM для генерации слов аналогично. Однако ответы там в настоящее время не то, что я ищу. Я надеюсь на простое объяснение на английском языке, которое включит для меня свет и восполнит любой пробел в моем понимании. Использовать предварительно обученный word2vec в языковой модели lstm? - еще один аналогичный вопрос.
ОБНОВЛЕНИЕ: Прогнозирование следующего слова с использованием примера тензорного потока языковой модели и Предсказание следующего слова с использованием примера тензорного потока модели LSTM ptb - это похожие вопросы. Однако ни один из них не показывает, как код фактически берет первые несколько слов предложения и распечатывает предсказание следующего слова. Я пробовал вставить код из второго вопроса и из https://stackoverflow.com/a/39282697/841830 ( который поставляется с веткой github), но не может работать без ошибок. Я думаю, они могут быть для более ранней версии TensorFlow?
ДРУГОЕ ОБНОВЛЕНИЕ: Еще один вопрос, в основном задающий то же самое: Прогнозирование следующего слова модели LSTM из примера Tensorflow Он ссылается на Предсказание следующего слова с использованием примера тензорного потока языковой модели (и, опять же, ответы там не совсем то, что Я ищу).
Если все еще не ясно, что я пытаюсь написать высокоуровневую функцию с именем getNextWord(model, sentencePrefix)
, где model
- это ранее созданный LSTM, который я загрузил с диска, а sentencePrefix
- это строка, например «Открыть» , и он может вернуть "pod". Затем я мог бы вызвать его с помощью «Откройте контейнер», и он вернет «залив» и так далее.
Примером (с символом RNN и использованием mxnet) является функция sample()
, показанная в конце https://github.com/zackchase/mxnet-the-straight-dope/blob/master/chapter05_recurrent-нейронныесети/simple-rnn.ipynb Вы можете вызвать sample()
во время обучения, но вы также можете вызвать его после обучения и с любым предложением.
getNextWord(model, sentencePrefix)
из каждого предложенного ответа, но каждый из них либо заканчивался выдачей исключений, либо имел пробел в объяснении, которое действительно было сутью вопроса. Если / когда у меня это сработает, я отвечу сам. (Кстати, спасибо, что первым ответил - это действительно помогло мне прояснить мой вопрос, что привело к поиску других связанных вопросов.) - person Darren Cook   schedule 19.09.2017