Трудность в понимании результатов 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