Почему мой оптимизатор градиентного спуска взрывается после приближения к решению? - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь выполнить простой пример линейной регрессии в Tensorflow, и кажется, что алгоритм обучения сходится к решению, но как только он приближается к решению, он начинает подпрыгивать и в конечном итоге взрывается.

Я передаю данные для строки y = 2x, поэтому оптимизатор градиентного спуска должен легко сходиться к решению.

import tensorflow as tf

M = tf.Variable([0.4], dtype=tf.float32)
b = tf.Variable([-0.4], dtype=tf.float32)

x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)

linear_model = M * x + b

error = linear_model - y
loss = tf.square(error)

optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)
    for i in range(100):
        sess.run(optimizer, {x: i, y: 2 * i})
        print(sess.run([M, b]))

Вот результат.Я обвел часть, где это приближается к решению.Почему градиентный спуск нарушается, когда он приближается к решению, или я что-то не так делаю?

enter image description here

Ответы [ 3 ]

1 голос
/ 05 июля 2019

Ваш код передает данные обучения по одному только за одну эпоху.Это соответствует стохастическому градиентному спуску, когда величина потерь имеет тенденцию колебаться чаще, чем периодический и мини-спуск градиентного спуска во время тренировки.Более того, поскольку данные подаются в порядке возрастания x, значение градиента также увеличивается вместе с x.Вот почему вы видите большие колебания в более поздней части эпохи.

0 голосов
/ 06 июля 2019

Полагаю, вы выбрали высокий уровень обучения. Вы можете использовать поиск по сетке и найти оптимальную скорость обучения, а затем подбирать данные, используя оптимальную скорость обучения.

0 голосов
/ 05 июля 2019

Это может произойти, если скорость обучения слишком высока; попробуйте опустить его.

...