Почему TensorFlow не может соответствовать простой линейной модели, если я сводя к минимуму абсолютную среднюю ошибку вместо средней квадратной ошибки?
-
16-10-2019 - |
Вопрос
В Введение Я только что изменился
loss = tf.reduce_mean(tf.square(y - y_data))
к
loss = tf.reduce_mean(tf.abs(y - y_data))
И модель не может узнать, что потеря стала больше со временем. Почему?
Решение
Я попробовал это и получил тот же результат.
Это потому, что градиент .abs
Простое оптимизатор труднее следовать минимумам, в отличие от разницы в квадрате, где градиент медленно приближается к нулю, градиент абсолютной разницы имеет фиксированную величину, которая резко меняется, что имеет тенденцию вызывать оптимизатор колебаться вокруг минимальной точки. Основной градиентный спуск очень чувствителен к величине градиента и к скорости обучения, что, по сути, является просто множителем градиента для размеров шагов.
Самое простое исправление - снизить уровень обучения, например, линия изменения
optimizer = tf.train.GradientDescentOptimizer(0.5)
к
optimizer = tf.train.GradientDescentOptimizer(0.05)
Кроме того, играйте с разными оптимизаторами. Некоторые смогут справиться с .abs
-СА на основе потеря лучше.