Вопрос или проблема
Я делаю свои первые шаги с tensorflow (и в машинном обучении в целом) и использую этот код для тренировки очень простой модели, которая пытается найти основное линейное соотношение: f(x,y) = 4x + 7y – 2 (+ шум, взятый из равномерного распределения от -1 до 1).
model = tf.keras.Sequential([
tf.keras.layers.Dense(output_size,
kernel_initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1),
bias_initializer=tf.random_uniform_initializer(minval=-0.1, maxval=0.1))
])
custom_optimizer = tf.keras.optimizers.SGD(learning_rate=0.03)
model.compile(optimizer=custom_optimizer, loss="mean_squared_error")
model.fit(training_data['inputs'], training_data['targets'], epochs=100, verbose=2)
Я пробовал несколько значений скорости обучения (lr) и обнаружил, что для lr < 0.03 значение потерь на каждой итерации уменьшается до определенного момента, после которого оно остается постоянным, а для lr > 0.03 потери очень высоки с первой итерации, достигая бесконечности вскоре после этого. Для lr = 0.03 я получаю значения потерь, которые, кажется, колеблются; вот они для последующих 10 итераций:
Epoch 90/100
32/32 - 0s - loss: 4.1204
Epoch 91/100
32/32 - 0s - loss: 1.3650
Epoch 92/100
32/32 - 0s - loss: 0.4946
Epoch 93/100
32/32 - 0s - loss: 1.3834
Epoch 94/100
32/32 - 0s - loss: 2.7705
Epoch 95/100
32/32 - 0s - loss: 2.3662
Epoch 96/100
32/32 - 0s - loss: 2.8347
Epoch 97/100
32/32 - 0s - loss: 0.7657
Epoch 98/100
32/32 - 0s - loss: 3.2244
Epoch 99/100
32/32 - 0s - loss: 2.9569
Epoch 100/100
32/32 - 0s - loss: 1.7180
Весы очень близки к фактическим весам (3.98 вместо 4 и т.д.), что очень похоже на то, что я получаю при использовании lr < 0.03 (т.е. точность количественно такая же).
Мне интересно, как это возможно, поскольку функция потерь, похоже, не достигает определенного предела, как в случае lr < 0.03. Я пытаюсь понять математику, которая “вызывает” колебания значений потерь, и в то же время производит правильные веса.
Для разъяснения: я знаю, что с lr = 0.03 нет ничего “особенного”, но в моем случае это скорость обучения, которая вызвала это явление.
(Добавляю свои комментарии к вопросу в качестве ответа): Я не уверен, что это соответствует вашему случаю, было бы полезно увидеть графики потерь. Но возьмем игрушечный пример, где ваша функция просто f(x) = 4x, а ваш текущий вес равен 3.98. После каждого обновления направление градиента будет меняться на противоположное. В результате значения потерь могут зависеть от того, считаете ли вы потери средними или суммой индивидуальных потерь. Если нечто подобное происходит в вашем случае, осцилляция не постоянна из-за взаимосвязи между двумя входными переменными (в игрушечном примере есть только одна входная переменная, поэтому осциляция постоянна).
Ответ или решение
Проблема колебаний значений потерь при правильных весах может быть связана с несколькими факторами, включая выбор коэффициента обучения, распределение данных и характеристику используемой модели. Давайте рассмотрим, что может вызывать этот эффект и как его можно объяснить.
-
Коэффициент обучения (Learning Rate): Как вы уже заметили, при значении коэффициента обучения равном 0.03 наблюдаются колебания значений потерь. Это может происходить из-за того, что этот коэффициент достаточно высок для вашего конкретного датасета и модели. При высоком коэффициенте обучения модель может «перепрыгивать» через минимум функции потерь, что приводит к колебаниям, а не к плавному снижению потерь.
-
Строка потерь (Loss Surface): Колебания могут возникать из-за особенностей поверхности потерь. Если в вашем случае есть несколько локальных минимумов, модель может застревать в одном из них, из-за чего значения потерь могут колебаться вокруг этого минимума. Чем более сложной будет ваша модель и данные, тем более вероятно, что поверхность потерь будет иметь сложную структуру.
-
Шум в данных: Так как вы добавляете шум при генерации целевых значений (в вашем уравнении есть шум, распределенный равномерно), это может также влиять на процесс обучения. Шум приводит к более высокой изменчивости в значениях потерь, потому что алгоритм пытается «подстроиться» под шумные данные, что затрудняет нахождение стабильного решения.
-
Градиенты: Если ваши параметры (веса) слишком высокие из-за нестабильного обновления градиентов, с некоторыми итерациями ваша оптимизация может приводить к значительно изменяющимся значениям потерь. Например, если ваша модель находится в окрестности минимума, но вы используете слишком большой шаг обновления, вы просто можете перескакивать его, что приводит к тому, что значения потерь изменяются.
Что вы можете попробовать:
-
Снижение коэффициента обучения: Попробуйте уменьшить коэффициент обучения до 0.01 или даже 0.001 и посмотрите, получится ли более стабильное снижение значений потерь.
-
Использование адаптивных методов оптимизации: Рассмотрите возможность использования адаптивных оптимизаторов, таких как Adam, который автоматически регулирует скорость обучения для разных параметров.
-
Нормализация данных: Убедитесь, что данные правильно нормализованы — это может помочь в достижении более стабильных результатов.
-
Добавление регуляризации: Примените методы регуляризации, такие как L2-регуляризация, чтобы уменьшить возможность переобучения.
-
Визуализация функций потерь: Постройте график значений функции потерь в процессе обучения, чтобы лучше понять их поведение и внести соответствующие изменения.
В заключение, ваши веса могут быть близки к правильным значениям даже при колебаниях потерь, поскольку минимизация функции потерь не всегда приводит к идеальному результату. Главное — это найти баланс между хорошей производительностью модели и стабильностью процесса обучения.