Я использую tf.truncated_normal_initializer для инициализации весов и смещений:
with tf.variable_scope('params'):
weights = tf.get_variable(name="weights1",shape = [2*rnn_size, n_classes],initializer = tf.truncated_normal_initializer(seed=seed))
biases = tf.get_variable(name="biases1",shape = [n_classes],initializer = tf.truncated_normal_initializer(seed=seed))
и чтобы они оставались одинаковыми для разных прогонов для воспроизводимости, я установил seed на уровне op. Также я установил то же начальное число внутри того же графика, используя
tf.reset_default_graph()
и позже:
tf.set_random_seed(seed)
Кроме этого, я также установил numy и random seed на то же значение, что и выше seed (tfseed имеет то же значение, что и seed).
np.random.seed(tfseed)
random.seed(tfseed)
При обучении и печати значения для прогона 1, прогона 2 и прогона 3 в эпоху 0 и сравнения их я заметил небольшие изменения в весах.
Эпоха 0 весов пробега 0 против 1
Эпоха 0 пробега 1 против 2
к эпохе 94 изменения становятся более заметными:
Эпоха 94 пробега 0 против 1
Эпоха 94 пробега 1 против 2
В гораздо более высокие эпохи 1000+ веса могут сильно различаться, что приводит к различной точности. Я пытаюсь иметь воспроизводимость, чтобы опробовать различные гиперпараметры.
В чем причина этих небольших различий в весах / смещениях для разных прогонов, даже несмотря на то, что семя одинаковое, и как нам его избежать?
И есть ли способ избежать разных весов для разных серий для полной воспроизводимости в очень высокие эпохи?
ОБНОВЛЕНИЕ РЕДАКТИРОВАНИЯ -
Веса, напечатанные в эпоху 0, были напечатаны после эпоха 0, я неправильно понял, что эти веса являются начальными весами. После того, как я заметил это и напечатал весы непосредственно перед вычислением эпохи. Я вижу, что начальные веса одинаковы. Итак, семя работает так, как задумано.
До эпохи 0 - Веса в прогоне 0 против весов в прогоне 1
До эпохи 0 - вес 1 в прогоне против веса 2 в прогоне
Из комментария и из других источников видно, что способ тензорного потока работает на GPU / CPU (https://github.com/tensorflow/tensorflow/issues/3103), tf.reduce_mean и tf.reduce_sum являются недетерминированными, что может объяснить, почему веса продолжают изменяться при разные эпохи для разных трасс, что приводит к разной точности в высокие эпохи (для меня на тренировках LSTM разница в 4-7% на 1000 эпох для 10 трасс для меня).
Как обычно выполняется настройка гиперпараметров, когда существуют различия в точности при использовании одних и тех же параметров (из-за недетерминированного поведения)? Как было решено, что увеличение точности на самом деле связано с изменением гиперпараметра?