Градиентный спуск - сердце машинного обучения
Разберемся с ключевым понятием машинного обучения – градиентным спуском. Фактически это способ оптимизации модели путем поиска параметров, минимизирующих функцию стоимости. Последняя является мерой эффективности модели и принимает разные значения в зависимости от задачи, например, для предсказания цены квартиры она может принять следующий вид:
В данном случае функция стоимости считает сумму квадратов разности предсказанной и реальной цены по всем примерам. Так как чем сумма меньше, тем прогнозы больше приближаются к реальным, коэффициенты β, минимизирующие данное выражение, будут оптимальными.
Они находятся методом градиентного спуска, в основе которого лежит понятие производной. Последняя показывает возрастает или убывает функция в окрестности очередной точки (вектор из параметров). Соответственно, чтобы функция убывала (нам же ее надо минимизировать) необходимо изменять каждый параметр на величину имеющую противоположный знак с производной (производная положительная → функция возрастает → аргумент надо уменьшить → прибавляем к нему (-v*∇L); производная отрицательная → функция убывает → аргумент надо увеличить → прибавляем к нему (-v*∇L), где v – скорость обучения, v> 0). Таким образом на очередном шаге коэффициенты преобразуются следующим образом:
Выбор скорости обучения является принципиальным для успешности градиентного спуска. Так, слишком малое значение приведет к затягиванию процесса, а большое может вызвать скачки вблизи минимума, что сделает затруднительным его достижение. Кроме того, при малой скорости обучения процесс оптимизации может застрять в локальном минимуме, так и не достигнув глобального.
Представляю три графика, отражающих хорошую, медленную и слишком быструю скорость изменения параметра при параболической функции стоимости.
Процесс изменения параметров модели происходит до тех пор, пока корректировка функции стоимости не достигнет очень маленьких значений либо количество итераций не превысит определенного значения.
Также для градиентного спуска крайне важна нормализация данных (приведение к одному масштабу, как правило, вычитают среднее и делят на стандартное отклонение). Так, если значение некоторой независимой переменной является слишком малым по сравнению с остальными, то зависимый от нее параметр может требовать больших приращений чем остальные для ускорения оптимизации (например, если в производной они перемножаются). Это можно визуализировать следующим образом:
На графике значения независимой переменной_1 имеют слишком малые величины, из-за чего алгоритму приходится перемещаться вдоль плато по ее оси.
В зависимости от размера используемых для обучения данных и имеющихся вычислительных ресурсов используются разные формы градиентного спуска: пакетный, стохастический и мини-пакетный.
Пакетный обновляет параметры на основе значений всех имеющихся данных (если хватает ресурсов на помещение их в память и обработку), стохастический – на основе каждого поступившего образца, а мини-пакетный осуществляет те же действия, но с использованием небольшого количества экземпляров за раз. Последние два способа являются предпочтительными в условиях ограниченных ресурсов, однако из-за возможных ошибок в данных слишком малая выборка может привести к неэффективной корректировке вектора параметров и проскакиванию через глобальный минимум функции (аналогично тому, как на графике со слишком быстрой скоростью обучения).
С другой стороны, стохастическое и мини-пакетное обучение быстрее оптимизируют параметры из-за частых обновлений. Важным нюансом их использования является перемешивание вводимых данных, чтобы при наличии зависимости между последовательными образцами, это не оказывало преимущественное влияние на итоговые результаты.
Следует отметить, что алгоритмы машинного обучения могут оптимизироваться не только с использованием градиентного спуска, но для постоянного обучения по мере поступления данных он является незаменимым инструментом (многие другие алгоритмы не предусматривают возможность дообучения и находят параметры единоразово на всех имеющихся данных).
Основными классами, реализующими алгоритмы машинного обучения на основе градиентного спуска в Python, являются sklearn.linear_model.SGDClassifier (классификация), sklearn.linear_model.SGDRegressor (регрессия). В зависимости от указанной функции стоимости с их помощью можно реализовать регрессию, логистическую регрессию, машины опорных векторов.
Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: