Модель персептрона - это бинарный классификатор, классификации которого основаны на линейной модели. Итак, если ваши данные линейно разделимы, эта модель найдет разделяющую их гиперплоскость. Модель работает как таковая:

По сути, для данной выборки вы умножаете каждую характеристику x_i на ее собственный вес w_i и просуммируете все. Затем возьмите эту сумму и примените функцию активации. Это будет ваш прогноз. Но какую функцию активации вы используете?

Функции активации

Метки двоичной классификации обычно отображаются как {-1, 1} или {0, 1}. Функция активации, используемая в модели персептрона, будет зависеть от того, какой набор двоичных меток вы выберете. Если вы выберете {0, 1}, вам нужно будет использовать ступенчатую функцию Хевисайда в качестве функции активации, поскольку она принимает любое действительное число и выводит либо 0, либо 1. В противном случае вы будете используйте функцию знака.

Получите данные

Скажем, ваши двоичные метки - {0, 1}. Прогноз модели персептрона будет

выдача либо 0, либо 1. Давайте взглянем на быстрый пример с некоторыми данными, любезно взятыми из блога Джейсона Браунли Machine Learning Master.

Давайте разделим фрейм данных на обучающие данные и метки.

Вывод персептрона

Чтобы получить прогноз на основе модели персептрона, вам необходимо реализовать уравнение 1. Напомним, что векторизованный эквивалент уравнения 1 просто

скалярное произведение вектора весов w и вектора признаков x.

Итак, у вас есть x, который представляет один образец, где x_i - это некоторая функция для образца (например, has_scales или has_fur, если вы пытаетесь предсказать млекопитающие против рептилий). Но где взять вес w_i? Это то, чему модель перцептрона должна научиться на ваших помеченных образцах. Вначале вы не знаете, какими должны быть эти значения, поэтому можете просто позволить им быть нулями.

Попробуйте предсказать первую выборку:

Prediction: 1.0, Label: 0, Error: -1.0

Неудивительно, что модель не так хорошо справляется. Давайте посмотрим, сможете ли вы придумать способ, позволяющий модели перцептрона узнать, какие веса ей нужны, чтобы вывести ожидаемую метку.

Обучение перцептрона обучению

Для начала вам нужно указать функцию потерь, которая сообщает вам, насколько плохо работает ваша модель. Чем меньше убыток, тем лучше. В нашем примере вы можете использовать сумму квадратов ошибок в качестве функции потерь:

где yhat_i - прогноз модели перцептрона, а y - то, каким должен был быть прогноз (т. е. метка). Эта функция просто определяет квадрат расстояния между предсказанием и истинным значением и суммирует все эти расстояния.

Как и в случае с большинством современных методов машинного обучения, теперь у вас может возникнуть соблазн использовать градиентный спуск, при котором вы берете градиент функции потерь, описанной выше, относительно весов и используете этот градиент для обновления весов в направлении, которое минимизирует потери. Результирующий градиент будет:

но видите ли вы здесь проблему? Производная ступенчатой ​​функции равна 0 везде, кроме x = 0, где она не определена. Это приведет к тому, что весь градиент будет равен 0, и веса никогда не будут обновлены. Модель перцептрона никогда не научится. Та же проблема беспокоит и знаковую функцию.

Так как же обновить веса? Что ж, оказывается, что если ваши данные линейно разделимы, то следующее правило обновления веса гарантировано (через доказательство теоремы сходимости) сходится к набору весов за конечное число шагов, которые будут линейно разделять данные на два разных класса. Это правило обновления определяется как:

и применяется только в том случае, если x был неправильно классифицирован моделью перцептрона.

Но это правило обновления было получено в предположении, что двоичные метки были {-1, 1}, а не {0, 1}. Если бы ваши метки были {-1, 1}, тогда y в правиле обновления было бы либо -1, либо 1, тем самым изменяя направление обновления весов.

Но поскольку ваши двоичные метки - {0, 1}, это представляет проблему, поскольку y может быть 0. Это будет означать, что если x был неправильно классифицирован, и его истинное значение было 0, тогда w = w + 0 · x = w, и веса никогда не будут обновлены.

К счастью, вы можете учесть это, изменив правило обновления, которое по-прежнему гарантирует сходимость, но подходит для обоих {-1, 1} и {0, 1} как двоичные метки:

Обратите внимание, что если ваши двоичные метки равны {0, 1}, (y - yhat) равно 0, если модель персептрона спрогнозировала правильно (тем самым оставляя веса неизменными) и 1 или -1, если прогноз неверен (что гарантирует, что веса обновляются в правильном направлении). Если ваши двоичные метки равны {-1, 1}, (y - yhat) равно 0, если модель перцептрона спрогнозирована правильно, и 2 или -2, если спрогнозировано неверно. Это измененное правило обновления веса гарантирует правильное изменение направления независимо от того, какой набор двоичных меток вы выберете.

Теперь, когда вы знаете, как обновлять веса, попробуйте взять образец, спрогнозировать его метку, а затем обновить веса. Повторите это для каждого имеющегося у вас образца.

SSE: 2.0
Weights: [4.84644761, 0.20872523, 0.]

Похоже, что модель персептрона еще не нашла весов, чтобы идеально разделить два класса. Как насчет того, чтобы дать ему больше времени на обучение, сделав несколько проходов по данным. Давайте попробуем 3 прохода.

SSE: 2.0
SSE: 1.0
SSE: 0.0
Weights: [ 2.06536401, -2.34181177, -1.]

Отлично! Сумма квадратов ошибок равна нулю, что означает, что модель персептрона не допускает ошибок при разделении данных.

Персептрон применяется к различным двоичным меткам

Теперь предположим, что ваши двоичные метки - {-1, 1}. Используя те же данные выше (заменяя 0 на -1 для метки), вы можете применить тот же алгоритм перцептрона. На этот раз вы увидите, что w = w + y · x и w = w + (y - yhat) · x оба находят набор весов для разделения данные правильно (даже если веса разные).

Вот модель персептрона с правилом обновления w = w + y · x:

SSE: 5.0
SSE: 4.0
SSE: 0.0
Weights: [ 2.06536401, -2.34181177, -1.]

А теперь с правилом обновления w = w + (y - yhat) · x:

SSE: 5.0
SSE: 8.0
SSE: 0.0
Weights: [ 3.98083288, -6.85733669, -3.]

Оба сошлись!

Подведение итогов

В этом посте вы узнали, что такое модель перцептрона, к каким данным она может применяться, какова математика модели и как она обучается, а также реализовала все свои открытия на Python!

Конечно, в реалистичной обстановке вы захотите провести перекрестную проверку своей модели и предпочтительно использовать проверенную реализацию модели, доступную в библиотеках, таких как scikit-learn. Но я надеюсь, что этот взгляд на модель перцептрона был полезен, и если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне на bobbywlindsey.com или подписывайтесь на меня здесь в Medium или Twitter.

Первоначально опубликовано на https://www.bobbywlindsey.com 7 октября 2019 г.