Я понял, что мои модели становятся разными каждый раз, когда я их тренирую, хотя я сохраняю случайное семя TensorFlow одинаковым.Недетерминированные вычисления градиента
Я проверил, что:
- Initialization детерминирована; весы идентичны перед первым обновлением.
- Входы детерминированы. Фактически, различные прямые вычисления, включая потерю, идентичны для самой первой партии.
- Градиенты для первой партии различны. Конкретно, я сравниваю выходы
tf.gradients(loss, train_variables)
. В то время какloss
иtrain_variables
имеют одинаковые значения, градиенты иногда разные для некоторых переменных. Различия довольно значительны (иногда разница в абсолютных значениях для градиента одной переменной больше 1).
Я пришел к выводу, что это вычисление градиента, которое вызывает недетерминизм. Я посмотрел на this question, и проблема не устраняется при работе на CPU с intra_op_parallelism_thread=1
и inter_op_parallelism_thread=1
.
Как прохождение назад может быть недетерминированным, если передний проход не является? Как я мог отладить это дальше?
Если бы это было так, то вперед вычисление будет отличаться тоже, верно? Кроме того, не должно (статическое) семя определять, какие соединения отбрасываются? – Georg
Вы имеете в виду прямое вычисление во время обучения или оценки? Обычная практика - отключить отсева при проверке. Как это реализовано в вашем коде? И да, случайное семя должно определить, какие соединения отбрасываются. Возможно, у вас проблемы с аналогичными проблемами, упомянутыми в [this] (http://stackoverflow.com/a/36289575/3941813). – jabalazs
Я имею в виду передовые вычисления во время обучения. Я использую 'tf.nn.dropout()', но я только что проверил, даже с 'keep_prob == 1' проблема остается. Я также проверил, что создается только один граф ('tf.Graph()' на самом деле никогда не вызывается в коде). – Georg