Проблема оптимизации (Optimisation Problem)
Проблема оптимизации (Optimisation Problem) — это задача поиска наилучшего решения среди множества возможных вариантов с учётом заданных ограничений. В Data Science оптимизация используется постоянно. Модель должна найти такие значения своих параметров, при которых ошибка предсказаний будет минимальной.
Из чего состоит задача оптимизации
Обычно у проблемы оптимизации есть три основных элемента:
- Целевая функция (Objective Function) — показывает, насколько хорошим является решение
- Переменные — значения, которые можно изменять, чтобы найти лучшее решение
- Ограничения (Constraints) — условия, которым решение должно соответствовать.
Например, производитель хочет определить, сколько товаров двух типов произвести, чтобы получить максимальную прибыль.
Переменные:
- количество товара A;
- количество товара B.
Целевая функция — максимизация прибыли.
Ограничения:
- количество доступного сырья
- производственные мощности
- бюджет.
Оптимизация в машинном обучении
Обучение модели можно рассматривать как оптимизационную задачу. У модели есть параметры — например, веса нейронной сети. Во время обучения алгоритм пытается найти такие значения весов, при которых функция потерь будет минимальной. Процесс выглядит примерно так:
Данные
↓
Модель
↓
Предсказание
↓
Loss Function
↓
Оптимизатор
↓
Новые веса
↓
Модель
Этот процесс повторяется много раз.
Градиентный спуск
Один из самых распространённых алгоритмов оптимизации в машинном обучении — Gradient Descent (градиентный спуск). Его идея проста:
- определить направление, в котором функция потерь увеличивается;
- двигаться в противоположную сторону;
- повторять процесс, пока значение функции не станет достаточно маленьким.
Размер шага определяется параметром Learning Rate. Если Learning Rate слишком большой:
- оптимизатор может перескочить через минимум;
- обучение становится нестабильным.
Если слишком маленький: обучение идёт очень медленно.
Локальный и глобальный минимум
Целевая функция может иметь несколько минимумов. Локальный минимум — точка, которая лучше ближайших вариантов, но не обязательно является лучшим решением вообще. Глобальный минимум — лучшее решение среди всех возможных.
Для простых функций найти глобальный минимум относительно легко. В машинном обучении функция потерь может иметь очень сложную форму, поэтому поиск глобального оптимума становится значительно сложнее.
Простой пример на Python
Рассмотрим простую задачу:
найти значение
x, при котором функцияf(x) = (x - 3)²принимает минимальное значение.
Минимум очевиден — x = 3. Но попробуем найти его с помощью градиентного спуска.
def gradient(x):
return 2 * (x - 3)
x = 0.0
learning_rate = 0.1
for _ in range(100):
x -= learning_rate * gradient(x)
print(x)
Результат будет близок к:
3.0
Здесь:
x— оптимизируемая переменная;gradient(x)— градиент целевой функции;learning_rate— размер шага;- цикл — процесс оптимизации.
То есть алгоритм постепенно приближает x к значению, при котором функция достигает минимума.
Градиентный спуск имеет множество модификаций. Популярные оптимизаторы:
- SGD (Stochastic Gradient Descent)
- Mini-Batch Gradient Descent
- Momentum
- RMSprop
- Adam
- AdamW
Например, Adam широко используется при обучении нейронных сетей, поскольку адаптирует шаг обновления параметров и обычно хорошо работает на широком диапазоне задач.