Значения потерь, похоже, колеблются, но веса верные.

Вопрос или проблема

Я делаю свои первые шаги с 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. После каждого обновления направление градиента будет меняться на противоположное. В результате значения потерь могут зависеть от того, считаете ли вы потери средними или суммой индивидуальных потерь. Если нечто подобное происходит в вашем случае, осцилляция не постоянна из-за взаимосвязи между двумя входными переменными (в игрушечном примере есть только одна входная переменная, поэтому осциляция постоянна).

Ответ или решение

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

  1. Коэффициент обучения (Learning Rate): Как вы уже заметили, при значении коэффициента обучения равном 0.03 наблюдаются колебания значений потерь. Это может происходить из-за того, что этот коэффициент достаточно высок для вашего конкретного датасета и модели. При высоком коэффициенте обучения модель может «перепрыгивать» через минимум функции потерь, что приводит к колебаниям, а не к плавному снижению потерь.

  2. Строка потерь (Loss Surface): Колебания могут возникать из-за особенностей поверхности потерь. Если в вашем случае есть несколько локальных минимумов, модель может застревать в одном из них, из-за чего значения потерь могут колебаться вокруг этого минимума. Чем более сложной будет ваша модель и данные, тем более вероятно, что поверхность потерь будет иметь сложную структуру.

  3. Шум в данных: Так как вы добавляете шум при генерации целевых значений (в вашем уравнении есть шум, распределенный равномерно), это может также влиять на процесс обучения. Шум приводит к более высокой изменчивости в значениях потерь, потому что алгоритм пытается «подстроиться» под шумные данные, что затрудняет нахождение стабильного решения.

  4. Градиенты: Если ваши параметры (веса) слишком высокие из-за нестабильного обновления градиентов, с некоторыми итерациями ваша оптимизация может приводить к значительно изменяющимся значениям потерь. Например, если ваша модель находится в окрестности минимума, но вы используете слишком большой шаг обновления, вы просто можете перескакивать его, что приводит к тому, что значения потерь изменяются.

Что вы можете попробовать:

  • Снижение коэффициента обучения: Попробуйте уменьшить коэффициент обучения до 0.01 или даже 0.001 и посмотрите, получится ли более стабильное снижение значений потерь.

  • Использование адаптивных методов оптимизации: Рассмотрите возможность использования адаптивных оптимизаторов, таких как Adam, который автоматически регулирует скорость обучения для разных параметров.

  • Нормализация данных: Убедитесь, что данные правильно нормализованы — это может помочь в достижении более стабильных результатов.

  • Добавление регуляризации: Примените методы регуляризации, такие как L2-регуляризация, чтобы уменьшить возможность переобучения.

  • Визуализация функций потерь: Постройте график значений функции потерь в процессе обучения, чтобы лучше понять их поведение и внести соответствующие изменения.

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

Оцените материал
Добавить комментарий

Капча загружается...