Оптимизация в машинном обучении: стохастический градиентный спуск (SGD)
Большие данные и паралич классических методов
Мы уже рассматривали классический метод градиентного спуска (GD), который шаг за шагом приближается к минимуму функции, вычисляя градиент (вектор частных производных). В машинном обучении, и особенно при обучении глубоких нейронных сетей, мы минимизируем функцию потерь (Loss function), которая показывает, насколько сильно нейросеть ошибается на обучающих данных. Параметрами оптимизации здесь выступают миллионы весовых коэффициентов синапсов сети.
Проблема заключается в масштабах. Функция потерь нейросети складывается из ошибок на каждом отдельном примере из обучающей выборки. Если ваша выборка состоит из 10 миллионов изображений (как в датасете ImageNet), то для того, чтобы сделать всего один крошечный шаг градиентного спуска, компьютеру нужно прогнать через огромную нейросеть все 10 миллионов картинок, вычислить ошибку для каждой, сложить их и найти производные. Это чудовищно долго. Классический (полнопакетный) градиентный спуск в эпоху Big Data оказался вычислительно парализован.
Стохастичность: скорость в обмен на шум
Гениальный выход из этой ситуации — Стохастический Градиентный Спуск (SGD). Идея SGD состоит в том, чтобы не вычислять точный градиент по всем миллионам примеров, а оценивать его приблизительно, используя только один случайно выбранный пример из выборки на каждом шаге.
Это кардинально меняет картину. Вместо того чтобы ждать часы ради одного абсолютно точного шага, нейросеть делает тысячи приблизительных шагов в секунду. Да, каждый отдельный шаг SGD сильно зашумлен — градиент от одного примера может указывать не совсем в сторону глобального минимума, заставляя траекторию поиска сильно «дрожать» и петлять. Однако, согласно закону больших чисел, математическое ожидание (среднее направление) этих хаотичных скачков верно ведет алгоритм к минимуму функции. Более того, доказано, что этот стохастический шум работает как форма регуляризации: он помогает алгоритму «выскакивать» из мелких локальных минимумов, что крайне полезно в невыпуклом ландшафте функций потерь глубоких сетей.
Мини-батчи и адаптивные оптимизаторы (Adam)
В чистом виде SGD (по одному примеру) плохо использует возможности современных видеокарт (GPU), которые созданы для параллельных матричных вычислений. Поэтому золотым стандартом индустрии стал компромисс — SGD по мини-батчам (Mini-batch SGD). Выборка делится на небольшие случайные пакеты (от 32 до 512 примеров). Градиент вычисляется по этому пакету. Это дает и достаточную скорость благодаря матричным вычислениям на GPU, и спасительный стохастический шум.
Чтобы справиться с проблемой подбора скорости обучения (learning rate) и зигзагообразными колебаниями SGD в оврагах, математики разработали мощные надстройки. Введение «импульса» (Momentum) позволяет алгоритму накапливать скорость, двигаясь в постоянном направлении, и пробивать мелкие препятствия по инерции. Вершиной этой эволюции стал алгоритм Adam (Adaptive Moment Estimation), который для каждого отдельного из миллионов параметров нейросети вычисляет свою собственную, адаптивную скорость обучения, базируясь на скользящих средних градиентов и их квадратов. Сегодня Adam и его модификации (AdamW) являются инструментами по умолчанию для обучения подавляющего большинства систем искусственного интеллекта, от распознавания образов до больших языковых моделей.