Практический курс по ML: https://stepik.org/course/209247/
На предыдущем
занятии мы с вами рассмотрели простейший пример обучения модели бинарной
линейной классификации вот в таком виде:
где -
вектор настраиваемых (в процессе обучения) параметров. И всю задачу свели к
поиску всего одного коэффициента :
Кроме того, мы,
фактически, придумали алгоритм для нахождения этого единственного коэффициента.
Однако, хотелось бы свести эту задачу к задаче математической оптимизации по
некоторому критерию качества, а также обобщить на произвольное число
коэффициентов.
Начнем с определения
показателя качества. На предыдущем занятии он у нас вычислялся по количеству
неверно классифицируемых наблюдений (входных векторов):
Напомню, что
здесь в качестве отступа мы используем величину:
а в качестве
функции потерь:
(Здесь
квадратные скобки – это индикатор ошибки. В соответствии с нотацией Айверсона
они возвращают 1 для True и 0 – для False).
Если изобразить
эту функцию потерь, зависящую от отступа, то получим ступенчатый график:
Как вы
понимаете, он не имеет производных в точках перегиба, да и во всех остальных
производные будут равны 0. То есть, эта функция не подходит для задачи
математической оптимизации при поиске весовых коэффициентов .
Как же быть? Давайте немного схитрим и возьмем какую-нибудь похожую, но
дифференцируемую функцию. И таких функций напридумывали огромное количество.
Вот некоторые, наиболее известные:
-
-
кусочно-линейная
(SVM);
-
-
кусочно-линейная
(Hebb’s
rule);
-
-
логарифмическая
(LR);
-
-
квадратичная
(FLD);
-
-
сигмоидная
(ANN);
-
-
экспоненциальная
(AdaBoost).
Особенность всех
этих функций (помимо того, что они всюду дифференцируемы) в том, что они по
значению больше, либо раны исходной пороговой. Следовательно, минимизируя любую
из них, мы автоматически будем минимизировать потери и при пороговой функции.
Давайте
посмотрим, как это можно использовать для квадратичной функции потерь:
Тогда функционал
качества запишется в виде:
Здесь мы можем
найти оптимальный вектор коэффициентов чисто
математически:
откуда
Давайте сделаем
вычисления по этой формуле в программе на Python, применительно
к нашей задаче бинарной классификации гусениц и божьих коровок:
№
|
Ширина
|
Длина
|
Жук
|
1
|
10
|
50
|
гусеница
|
2
|
20
|
30
|
божья
коровка
|
3
|
25
|
30
|
божья
коровка
|
4
|
20
|
60
|
гусеница
|
5
|
15
|
70
|
гусеница
|
6
|
40
|
40
|
божья
коровка
|
7
|
30
|
45
|
божья
коровка
|
8
|
20
|
45
|
гусеница
|
9
|
40
|
30
|
божья
коровка
|
10
|
7
|
35
|
гусеница
|
Здесь каждое
наблюдение представлено двумя признаками: ширина и длина. Но у нас, в общем
виде вектор параметров состоит из трех
компонент:
(добавляется еще
смещение), так как уравнение разделяющей прямой записывается в виде:
Поэтому мы
добавим к нашим наблюдениям еще один признак – константу 1:
Программа на Python будет следующей:
machine_learning_7.py
После выполнения
увидим значения коэффициентов:
[ 0.05793234
-0.0346272 0.1912188 ]
и график
разделяющей линии:
То есть, здесь
и угловой
коэффициент
прямой:
Вот так просто
мы решили ту же самую задачу бинарной классификации, но при этом использовали
математический аппарат для поиска оптимальных коэффициентов. В этом одно из
преимуществ замены пороговой не дифференцируемой функции на гладкие и всюду
дифференцируемые. В различных известных методах классификации именно так и
поступают – выбирают подходящие функции потерь и решают задачу минимизации
эмпирического риска.
Практический курс по ML: https://stepik.org/course/209247/