Как уменьшить дисперсию потери модели во время обучения?

Я знаю, что стохастический градиентный спуск всегда дает разные результаты. Каковы лучшие практики для уменьшения этой дисперсии сегодня? Я пытался предсказать простую функцию с помощью двух разных подходов, и каждый раз, когда я их тренирую, я вижу очень разные результаты.

Входные данные:

def plot(model_out):
  fig, ax = plt.subplots()
  ax.grid(True, which='both')
  ax.axhline(y=0, color='k', linewidth=1)
  ax.axvline(x=0, color='k', linewidth=1)

  ax.plot(x_line, y_line, c='g', linewidth=1)
  ax.scatter(inputs, targets, c='b', s=8)
  ax.scatter(inputs, model_out, c='r', s=8)

a = 5.0; b = 3.0; x_left, x_right = -16., 16.
NUM_EXAMPLES = 200
noise   = tf.random.normal((NUM_EXAMPLES,1))

inputs  = tf.random.uniform((NUM_EXAMPLES,1), x_left, x_right)
targets = a * tf.sin(inputs) + b + noise
x_line  = tf.linspace(x_left, x_right, 500)
y_line  = a * tf.sin(x_line) + b

Тренировка Keras:

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(50, activation='relu', input_shape=(1,)))
model.add(tf.keras.layers.Dense(50, activation='relu'))
model.add(tf.keras.layers.Dense(1))

model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(0.01))
model.fit(inputs, targets, batch_size=200, epochs=2000, verbose=0)

print(model.evaluate(inputs, targets, verbose=0))
plot(model.predict(inputs))

введите здесь описание изображения

Ручное обучение:

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(50, activation='relu', input_shape=(1,)))
model.add(tf.keras.layers.Dense(50, activation='relu'))
model.add(tf.keras.layers.Dense(1))

optimizer = tf.keras.optimizers.Adam(0.01)

@tf.function
def train_step(inpt, targ):
  with tf.GradientTape() as g:
    model_out = model(inpt)
    model_loss = tf.reduce_mean(tf.square(tf.math.subtract(targ, model_out)))

  gradients = g.gradient(model_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))
  return model_loss

train_ds = tf.data.Dataset.from_tensor_slices((inputs, targets))
train_ds = train_ds.repeat(2000).batch(200)

def train(train_ds):
  for inpt, targ in train_ds:
    model_loss = train_step(inpt, targ)
  tf.print(model_loss)

train(train_ds)
plot(tf.squeeze(model(inputs)))

введите здесь описание изображения


person dereks    schedule 01.12.2019    source источник
comment
Попробуйте опубликовать свой вопрос в AI Stack Exchange: ai.stackexchange.com   -  person AhmaD    schedule 01.12.2019
comment
Арагон С, хорошо, спасибо.   -  person dereks    schedule 01.12.2019
comment
увеличение размера партии напрямую снижает вафайн   -  person jeremy_rutman    schedule 01.12.2019
comment
Цель - использовать небольшой набор данных. У меня есть 200 примеров в наборе данных и batch_size=200.   -  person dereks    schedule 01.12.2019
comment
Веса выбираются случайным образом, поэтому, очевидно, каждый раз вы будете получать разные результаты, установите случайные начальные числа (numpy's, tf's и python) на предопределенные значения, и вы сможете воспроизвести   -  person bluesummers    schedule 01.12.2019
comment
Вопрос не в том, как воспроизвести. Речь идет о том, как сойтись с низкой дисперсией.   -  person dereks    schedule 01.12.2019
comment
См. здесь; без дополнительных указаний, дисперсия потерь связана с воспроизводимостью - в противном случае вам необходимо определить в отношении какие колебания потерь (гиперпараметры, повторные прогоны и т. д.). Также покажите некоторые графики потерь   -  person OverLordGoldDragon    schedule 01.12.2019
comment
@OverLordGoldDragon Спасибо, это было полезно. Но я все еще не понимаю, что мне делать. Вы знаете, где найти подходящий пример сравнения моделей в TF2?   -  person dereks    schedule 01.12.2019
comment
Я не слежу за вопросом; что именно вы спрашиваете? Да, потери будут изменяться в зависимости от различных гиперпараметров, как и должно быть, но если они меняются для тех же гиперпараметров, у вас есть проблема воспроизводимости. Если вы спрашиваете, как выбрать гиперпараметры, это совершенно другой вопрос, но см. здесь, чтобы получить идею   -  person OverLordGoldDragon    schedule 01.12.2019
comment
Ищу пример сравнения моделей с the same hyperparameters и different random seeds в TF2. Я имею в виду, как уменьшить дисперсию, вызванную инициализацией случайных весов.   -  person dereks    schedule 01.12.2019