Практический курс по ML: https://stepik.org/course/209247/
На предыдущем занятии
мы с вами познакомились с двумя подходами к реализации псевдоградиентных
алгоритмов – это SGD и SAG. Чтобы в дальнейшем этот теоретический
материал лучше воспринимался, на этом занятии я приведу пример использования SGD для все той же
задачи бинарной классификации гусениц и божьих коровок.
Напомню, что у
нас с вами имеется следующая обучающая выборка:
№
|
Ширина
|
Длина
|
Жук
|
1
|
10
|
50
|
гусеница
|
-1
|
2
|
20
|
30
|
божья
коровка
|
+1
|
3
|
25
|
30
|
божья
коровка
|
+1
|
4
|
20
|
60
|
гусеница
|
-1
|
5
|
15
|
70
|
гусеница
|
-1
|
6
|
40
|
40
|
божья
коровка
|
+1
|
7
|
30
|
45
|
божья
коровка
|
+1
|
8
|
20
|
45
|
гусеница
|
-1
|
9
|
40
|
30
|
божья
коровка
|
+1
|
10
|
7
|
35
|
гусеница
|
-1
|
И нужно
построить линейный классификатор:
который выдает
-1 гусениц и +1 – для божьих коровок. То есть, целевые выходы .
Как всегда будем
минимизировать эмпирический риск непрерывной функцией потерь:
В этот раз
выберем сигмоидную функцию в качестве loss function:
Ее производная
по ,
равна:
Таким образом, у
нас есть все исходные данные для нахождения вектора параметров с
помощью алгоритма SGD. Напомню его псевдокод:
-
Вход:
выборка ,
шаг сходимости ,
скорость «забывания» .
-
Выход:
вектор весовых коэффициентов .
1) инициализация
весов некоторыми
начальными значениями;
2) начальное
вычисление функционала качества:
3) цикл
4) случайный выбор
наблюдения из
5) вычисление
функции потерь
6) шаг
псевдоградиентного алгоритма:
7) пересчет
функционала качества:
8) пока и/или
не
достигнут заданных значений
Реализуем теперь
эти шаги на языке Python. Программу можно скачать по ссылке:
machine_learning_9_sgd.py
После запуска
увидим следующие значения коэффициентов:
[ 0.32536188
-0.16612466 0.00541073]
и график
разделяющей линии для двух классов:
Как видите, мы
смогли найти решение с помощью довольно простой реализации алгоритма стохастического
градиентного спуска. Если дополнительно посмотреть на график показателя
качества на разных итерациях, то видно, как он на протяжении всех 500 итераций
постепенно уменьшается:
Конечно, это не
самое лучшее решение и, очевидно, можно подобрать параметры так, чтобы
сходимость была более быстрой. Например, уменьшать шаг по линейному
закону:
или
экспоненциальному:
Здесь T – параметр,
определяющий скорость уменьшения шага обучения.
Некоторые другие
рекомендации по выбору шага обучения можно посмотреть на занятии, посвященном
градиентному алгоритму:
https://www.youtube.com/watch?v=OKeZEbJgQKc&list=PLA0M1Bcd0w8yZNgl5J814WQykTZnzj771&index=3
Я предлагаю вам
в качестве практики поиграться гиперпараметрами этого алгоритма и попробовать
найти лучшее решение.
Вообще, глядя на
реализацию SGD, можно увидеть
следующие его преимущества:
-
малый
объем вычислений;
-
легко
реализуется для самых разных функций потерь;
-
можно
использовать при потоковом обучении (когда наблюдения поступают непрерывно на
вход алгоритма и обучающую выборку можно не сохранять в памяти);
-
на
очень больших выборках можно использовать только ее часть для обучения
алгоритма;
-
можно
использовать в задачах с Big Data.
Ну а недостатки
общие, присущие всем градиентным алгоритмам:
-
застревание
в локальных оптимумах;
-
подбор
гиперпараметров (шаг обучения, скорость «забывания», критерии останова и т.п.);
-
может
приводить к переобучению модели.
На последующих
занятиях мы с вами посмотрим, как можно бороться с проблемами переобучения и
застревания в локальных оптимумах градиентных алгоритмов.
Практический курс по ML: https://stepik.org/course/209247/