Трудность в понимании результатов BeamSearchDecoder в Tensorflow 1.3

Я пытаюсь понять, как Tensorflow декодирует модель seq2seq, используя ее реализацию API tf.contrib.seq2seq.BeamSearchDecoder. В качестве теста я установил ширину луча моей модели seq2seq на 2 и посмотрел на результаты оценки (штраф за длину выключен, поэтому я предполагаю, что оценки точно соответствуют логарифмическим вероятностям выхода RNN).

Вот выходные данные beam_search_decoder_output.scores для тестовой последовательности encoder_input,

  • [[-1.58273876, -2.36315203],
  • [-3,44839048, -3,92363024],
  • [-4,58975744, -5,42785931],
  • [-7.23893118, -7.54120207],
  • [-9,52723026, -9,71589088],
  • [-11.87214279, -12.16498566],
  • [-12,93319511, -13,35285568], ....],

форма [batch_size, длина последовательности, ширина луча], при чтении 1-го "столбца" вы получите оценку лучшей последовательности и т. д. для 2-го и 3-го (если у нас было beam_width=3).

Я хотел понять, как эти оценки получены, поэтому я взял необработанный rnn_output (т.е. logits) из tf.contrib.seq2seq.dynamic_decode и сравнил их с этими значениями.

Форма вывода rnn: [размер пакета, длина max_sequence, vocab_size]

Мой подсчет первого ряда баллов был:

b1 = tf.nn.log_softmax (rnn_output [0] [0])),

row_1 = отсортировано (b1)[-2:]

Получив наивысшие две ранжированные вероятности в первой позиции последовательности, я получаю:

row_1 = [-2,3631535, -1,5827383],

хорошо, пока все хорошо (извините, заказ обратен из вышеприведенных результатов). Я записываю небольшую разницу между -1,5827383 и -1,58273876 в плавающие вычисления.

Для следующей точки последовательности я расширяю оба этих "узла" до каждого значения log_prob в rnn_output[0][1], добавляя их и получая 2 верхние максимальные суммы:

b2 = tf.nn.log_softmax (rnn_output [0] [1])),

row_2 = sorted (np.concatenate ([b2 + row_1 [-i] для i в диапазоне (1, 3, 1)]))[-2:],

Я получил:

row_2 = [-3,9236331, -3,4483953],

до сих пор все выглядит хорошо, но как только я пытаюсь вычислить баллы на третьей позиции, выполнив ту же процедуру еще раз, расширив два моих верхних значения до всех log_probs в rnn_output[0][3], я получаю,

b3 = tf.nn.log_softmax (rnn_output [0] [1])),

row_3 = sorted (np.concatenate ([b3 + row_2 [-i] для i в диапазоне (1, 3, 1)]))[-2:],

row_3 = [-5.0650086, -4.5897708],

значение второго ранга значительно отличается; -5.42785931<-5.0650086, если я сделаю еще один шаг, я получу,

[-7,541214, -7,2389431],

что снова похоже на результат оценки! а затем еще один шаг,

[-9,8295155, -9,5272446],

что снова неверно в значении 2-го ранга.

Что здесь происходит!? Есть ли проблема с плавающей запятой?

Я думаю, что я должен либо неправильно понять, как работает алгоритм поисков луча в целом, или как он реализован в Tensorflow, кто-нибудь может посоветовать?

Благодарю вас,

Kuhan

0 ответов

Другие вопросы по тегам