Минимизация потерь Tensorflow увеличивает потери

Я реализовал модель линейной регрессии, показанную на главной странице Tensorflow: https://www.tensorflow.org/get_started/get_started

import numpy as np
import tensorflow as tf

# Model parameters
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)
# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# training data
x_train = [1,2,3,4]
y_train = [0,-1,-2,-3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
  sess.run(train, {x:x_train, y:y_train})

# evaluate training accuracy
curr_W, curr_b, curr_loss  = sess.run([W, b, loss], {x:x_train, y:y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))

Однако, когда я меняю тренировочные данные на x_train=[2,4,6,8] и y_train=[3,4,5,6], потери со временем начинают увеличиваться, пока не достигнут значения «nan».


person Baba    schedule 31.03.2017    source источник
comment
Как ваши веса и предубеждения меняются со временем? В качестве еще одного примечания вы должны использовать reduce_mean вместо reduce_sum.   -  person Steven    schedule 31.03.2017
comment
Мои веса и смещения принимают все более высокие значения, и они чередуются между большими положительными и отрицательными значениями. Вы просите меня использовать reduce_mean, потому что тогда вычисленный градиент ниже, чем то, что вы получаете с помощью reduce_sum? Но я не понимаю, как это могло бы помочь.   -  person Baba    schedule 02.04.2017
comment
Хм, единственное, о чем я могу думать, это уменьшить скорость обучения. Честно говоря, все остальное вроде нормально. Если ваша скорость обучения слишком велика, это может привести к тому, что вы будете постоянно хуже справляться с вашими потерями, поскольку градиенты будут продолжать увеличиваться с каждым шагом. Попробуйте уменьшить его и дайте мне знать.   -  person Steven    schedule 02.04.2017


Ответы (1)


Как предложил Steven, вам, вероятно, следует использовать reduce_mean(), который, кажется, решает проблему возрастающей функции потерь. Обратите внимание, что я также увеличил количество тренировочных шагов, так как для сходимости для метода reduce_mean() требуется немного больше времени. Будьте осторожны с увеличением скорости обучения, так как это может воспроизвести проблему. Вместо этого, если время обучения не является критическим фактором, вы можете уменьшить скорость обучения и увеличить количество итераций обучения.

С функцией reduce_sum() она хорошо работала после уменьшения скорости обучения с 0,01 до 0,001. Еще раз спасибо Steven за предложение.

import numpy as np
import tensorflow as tf

# Model parameters
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)
# loss
loss = tf.reduce_mean(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# training data
x_train = [2,4,6,8]
y_train = [0,3,4,5]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(5000):
    sess.run(train, {x:x_train, y:y_train})

    # evaluate training accuracy
    curr_W, curr_b, curr_loss  = sess.run([W, b, loss], {x:x_train, y:y_train})
    print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))
person ml4294    schedule 11.04.2017