Подход для настройки гиперпараметра, когда одни и те же параметры имеют разную точность (из-за недетерминированного поведения) - LSTM обучение Tensorflow - PullRequest
0 голосов
/ 27 августа 2018

Я использую 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 трасс для меня).

Как обычно выполняется настройка гиперпараметров, когда существуют различия в точности при использовании одних и тех же параметров (из-за недетерминированного поведения)? Как было решено, что увеличение точности на самом деле связано с изменением гиперпараметра?

...