Предсказание следующего слова с использованием примера тензорного потока языковой модели

учебник по тензометру на языковой модели позволяет вычислить вероятность предложений:

probabilities = tf.nn.softmax(logits)

в приведенных ниже комментариях также указывается способ предсказания следующего слова вместо вероятностей, но не указывается, как это можно сделать. Итак, как вывести слово вместо вероятности с помощью этого примера?

lstm = rnn_cell.BasicLSTMCell(lstm_size)
# Initial state of the LSTM memory.
state = tf.zeros([batch_size, lstm.state_size])

loss = 0.0
for current_batch_of_words in words_in_dataset:
    # The value of state is updated after processing each batch of words.
    output, state = lstm(current_batch_of_words, state)

    # The LSTM output can be used to make next word predictions
    logits = tf.matmul(output, softmax_w) + softmax_b
    probabilities = tf.nn.softmax(logits)
    loss += loss_function(probabilities, target_words)

Ответы

Ответ 1

Вам нужно найти argmax вероятностей и перевести индекс обратно на слово, изменив карту word_to_id. Чтобы заставить это работать, вы должны сохранить вероятности в модели, а затем извлечь их из функции run_epoch (вы также можете сохранить только сам argmax). Вот фрагмент:

inverseDictionary = dict(zip(word_to_id.values(), word_to_id.keys()))

def run_epoch(...):
  decodedWordId = int(np.argmax(logits))
  print (" ".join([inverseDictionary[int(x1)] for x1 in np.nditer(x)])  
    + " got" + inverseDictionary[decodedWordId] + 
    + " expected:" + inverseDictionary[int(y)])

Смотрите полную реализацию здесь: https://github.com/nelken/tf

Ответ 2

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

Чтобы ответить на ваш вопрос: Вы можете взять список слов, повторить итерацию и сделать программу с наивысшей вероятностью.

Ответ 3

Ваш выход представляет собой список TensorFlow, и его максимальный аргумент (предсказанный наиболее вероятный класс) можно получить с помощью функции TensorFlow. Обычно это список, содержащий следующие вероятности слов.

В разделе "Оценка модели" на этой странице ваш выходной список y в следующем примере:

Сначала мы выясним, где мы предсказали правильную метку. tf.argmaxявляется чрезвычайно полезной функцией, которая дает вам индекс наибольший вход в тензор вдоль некоторой оси. Например, tf.argmax(y,1)это ярлык, который, по нашему мнению, наиболее вероятен для каждого входа, в то время как tf.argmax(y_,1) - это истинная метка. Мы можем использовать tf.equal, чтобы проверить, предсказание соответствует истине. correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

Другой подход, который отличается от другого, состоит в том, чтобы иметь предварительно векторизованные (внедренные/закодированные) слова. Вы могли бы векторизовать свои слова (поэтому вставлять их) в Word2vec для ускорения обучения, вы можете взглянуть на это. Каждое слово может быть представлено как точка в пространстве пространств значения 300, и вы можете автоматически найти "N слов", ближайших к прогнозируемой точке в пространстве на выходе сети. В этом случае способ argmax для продолжения работы больше не работает, и вы, вероятно, могли бы сравнить по сходству с косинусом со словами, которые вы действительно хотели сравнить, но для этого я не уверен, как это может вызвать численные неустойчивости. В этом случае y не будет представлять слова как функции, а слово вложения по размерности, скажем, от 100 до 2000 в зависимости от разных моделей. Вы могли бы сделать что-то подобное Google для получения дополнительной информации: "слово" женщина-женщина-королева "word2vec", чтобы больше понять тему вложений.

Примечание: когда я говорю о word2vec здесь, речь идет об использовании внешней предварительно подготовленной модели word2vec, чтобы помочь вашему обучению иметь только встроенные входы и создавать встраиваемые выходы. Соответствующие слова этих выходов могут быть пересмотрены с помощью word2vec, чтобы найти соответствующие аналогичные верхние предсказанные слова.

Обратите внимание, что подход, который я предлагаю, не является точным, так как было бы полезно знать только, предсказываем ли мы ТОЛЬКО слово, которое мы хотели предсказать. Для более мягкого подхода можно было бы использовать метрики ROUGE или BLEU для оценки вашей модели, если вы используете предложения или что-то большее, чем слово.