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