Разве Tensorflow RNN PTB учебный тест измерения и сброса состояния неправильно?
У меня есть два вопроса по учебному коду Tensorflow PTB RNN ptb_word_lm.py. Блоки кода ниже взяты из кода.
Можно ли сбрасывать состояние для каждой партии?
self._initial_state = cell.zero_state(batch_size, data_type()) with tf.device("/cpu:0"): embedding = tf.get_variable( "embedding", [vocab_size, size], dtype=data_type()) inputs = tf.nn.embedding_lookup(embedding, input_.input_data) if is_training and config.keep_prob < 1: inputs = tf.nn.dropout(inputs, config.keep_prob) outputs = [] state = self._initial_state with tf.variable_scope("RNN"): for time_step in range(num_steps): if time_step > 0: tf.get_variable_scope().reuse_variables() (cell_output, state) = cell(inputs[:, time_step, :], state) outputs.append(cell_output)
В строке 133 мы устанавливаем начальное состояние как ноль. Затем в строке 153 мы используем нулевое состояние в качестве начального состояния шагов rnn. Это означает, что каждое начальное состояние партии устанавливается на ноль. Я считаю, что если мы хотим применить BPTT(обратное распространение по времени), мы должны сделать внешний (ненулевой) ввод состояния шага, на котором заканчиваются предыдущие данные, как RNN с состоянием (в Keras).
Я обнаружил, что сброс начального состояния в ноль практически работает. Но есть ли теоретический фон (или статья), почему это работает?
Это нормально, чтобы измерить недоумение теста, как это?
eval_config = get_config() eval_config.batch_size = 1 eval_config.num_steps = 1
В связи с предыдущим вопросом... Модель фиксирует начальное состояние на ноль для каждой партии. Однако в строке 337 ~ 338 мы делаем размер партии 1 и количество шагов 1 для конфигурации теста. Затем для тестовых данных мы будем каждый раз помещать отдельные данные и прогнозировать следующие без контекста (!), Потому что состояние будет нулевым для каждого пакета (только с одним временным шагом).
Это правильная мера для тестовых данных? Все ли другие модели языковых работ измеряют сложность теста как предсказание следующего слова без контекста?
Я запустил этот код и получил аналогичный результат, как говорится в коде, а также в оригинальной статье. Если этот код неверен, а я надеюсь, что нет, у вас есть идеи, как воспроизвести результаты работы? Может быть, я могу сделать запрос на удаление, если я изменю проблемы.
1 ответ
Re (1), код делает (cell_output, state) = cell(inputs[:, time_step, :], state)
, Это назначает состояние для следующего временного шага как состояние вывода этого временного шага.
Когда вы запускаете новый пакет, вы должны делать это независимо от вычислений, которые вы уже сделали (обратите внимание на различие между пакетами, которые представляют собой совершенно разные примеры, и временными шагами в той же последовательности).
В отношении (2) большую часть времени используется контекст.