Я пытался понять пример кода с 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 вложений слов (например, с помощью gensim KeyedVectors.load_word2vec_format()
), преобразовать каждое слово во входящем корпусе в это представление при загрузке в каждом предложении, а затем LSTM выплюнуть вектор той же размерности, и мы попытаемся найти наиболее похожее слово (например, используя gensim similar_by_vector(y, topn=1)
).
Использует softmax, спасая нас от относительно медленного вызова similar_by_vector(y, topn=1)
?
Кстати, для ранее существовавшей части word2vec моего вопроса Использование предварительно подготовленного word2vec с LSTM для генерации слов аналогично. Однако ответы там, в настоящее время, не то, что я ищу. То, что я надеюсь, - это простое объяснение на английском языке, которое переключает свет на меня, и подключает все, что в моем понимании. Использовать предварительно подготовленный word2vec в языковой модели lstm? - еще один подобный вопрос.
ОБНОВЛЕНИЕ: Предсказание следующего слова с использованием примера тензорной модели языковой модели и Предсказание следующего слова с использованием примера LSTM ptb model tendorflow - подобные вопросы. Тем не менее, ни один из них не показывает код, который фактически принимает первые несколько слов предложения, и распечатывает его предсказание следующего слова. Я пробовал вставлять код из второго вопроса и qaru.site/info/359909/... (который поставляется с веткой github), но не может запускаться без ошибок. Я думаю, что они могут быть для более ранней версии TensorFlow?
ДРУГОЕ ОБНОВЛЕНИЕ: Еще один вопрос, задающий в основном одно и то же: Прогнозирование следующего слова модели LSTM из примера Tensorflow Он ссылается на Предсказание следующего слова с использованием примера тензорной модели языковой модели (и, опять же, ответы там не совсем то, что я ищу).
В случае, если все еще неясно, что я пытаюсь написать высокоуровневую функцию под названием getNextWord(model, sentencePrefix)
, где model
- это ранее построенный LSTM, который я загрузил с диска, а sentencePrefix
- строка, например "Открыть", и она может вернуть "pod". Затем я мог бы назвать это "Open pod", и он вернет "залив" и т.д.
Пример (с символом RNN и использованием mxnet) - это функция sample()
, показанная в конце https://github.com/zackchase/mxnet-the-straight-dope/blob/master/chapter05_recurrent-neural-networks/simple-rnn.ipynb
Вы можете называть sample()
во время тренировки, но вы также можете называть его после тренировки и любым предложением, которое вы хотите.