2017-02-23 52 views
5

Я понял, что мои модели становятся разными каждый раз, когда я их тренирую, хотя я сохраняю случайное семя TensorFlow одинаковым.Недетерминированные вычисления градиента

Я проверил, что:

  • Initialization детерминирована; весы идентичны перед первым обновлением.
  • Входы детерминированы. Фактически, различные прямые вычисления, включая потерю, идентичны для самой первой партии.
  • Градиенты для первой партии различны. Конкретно, я сравниваю выходы tf.gradients(loss, train_variables). В то время как loss и train_variables имеют одинаковые значения, градиенты иногда разные для некоторых переменных. Различия довольно значительны (иногда разница в абсолютных значениях для градиента одной переменной больше 1).

Я пришел к выводу, что это вычисление градиента, которое вызывает недетерминизм. Я посмотрел на this question, и проблема не устраняется при работе на CPU с intra_op_parallelism_thread=1 и inter_op_parallelism_thread=1.

Как прохождение назад может быть недетерминированным, если передний проход не является? Как я мог отладить это дальше?

ответ

0

Этот ответ может показаться немного очевидным, но используете ли вы какую-то неопределенную регуляризацию, такую ​​как отсева? Учитывая, что при отборе «капли» некоторых соединений случайно возникают при тренировке, это может вызывать разницу на градиентах.

Edit: Похожие вопросы:

+0

Если бы это было так, то вперед вычисление будет отличаться тоже, верно? Кроме того, не должно (статическое) семя определять, какие соединения отбрасываются? – Georg

+0

Вы имеете в виду прямое вычисление во время обучения или оценки? Обычная практика - отключить отсева при проверке. Как это реализовано в вашем коде? И да, случайное семя должно определить, какие соединения отбрасываются. Возможно, у вас проблемы с аналогичными проблемами, упомянутыми в [this] (http://stackoverflow.com/a/36289575/3941813). – jabalazs

+0

Я имею в виду передовые вычисления во время обучения. Я использую 'tf.nn.dropout()', но я только что проверил, даже с 'keep_prob == 1' проблема остается. Я также проверил, что создается только один граф ('tf.Graph()' на самом деле никогда не вызывается в коде). – Georg

Смежные вопросы