Резюме

В последнем посте мы представили понятие персептрона и то, как его можно использовать для моделирования линейного классификатора.

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

Однако остался без ответа один важный вопрос.

Как мы на самом деле находим наилучшие веса и смещения для нашего персептрона?

Дискретный и непрерывный

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

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

Наивный подход: алгоритм обучения персептрона

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

Вот высокоуровневое объяснение того, что он делает.

  • Произвольно инициализируйте веса и смещения (проведите случайную линию через данные).
  • Переберите все точки данных и проверьте, правильно ли текущий набор параметров классифицирует текущую точку.
  • Если точка неправильно классифицирована в текущей модели, обновите веса и смещения моделей следующим образом:

Здесь w(k) и b(k) представляют вектор весов и смещение после kошибок, x(i) и y(i) представляют i-ю точку данных (в виде вектора входных признаков) и метку (1 или 0 — помните активацию ступенчатой ​​функции ), соответственно.

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

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

Проблемы с дискретной оптимизацией

Давайте двигаться дальше, есть несколько серьезных проблем с описанным выше подходом.

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

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

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

Чтобы понять почему, нам нужно перейти от дискретной модели персептрона, где каждая точка либо правильно, либо неправильно классифицирована, к непрерывной модели персептрона, которая предсказывает вероятность того, что каждая точка попадает в определенный класс.

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

Если мы просто подсчитаем количество ошибочно классифицированных точек, приведенная выше строка будет в полном порядке.

Однако более естественно думать в терминах вероятностей, где точки, которые находятся дальше от границы решения, более вероятно будут правильно классифицированы, чем точки, которые ближе к линия.

На приведенном выше графике y шляпа будет представлять вероятность того, что вы принадлежите к определенному классу, давайте начнем с синего цвета. Мы можем видеть, что граница нашего решения — это линия, где почти наверняка все точки на ней синие, теперь мы лучше понимаем, почему это нехорошо. Похоже, что и красная, и синяя точки имеют почти одинаковую вероятность оказаться синими (обе они более или менее обе находятся на границе решения)!

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

Если у нас есть дискретная ошибка, как в случае с подсчетом количества правильно классифицированных точек, как только мы достигнем 2 (используя приведенный выше пример), мы закончим. Если мы используем непрерывную ошибку, такую ​​как вероятность, мы продолжаем работать, даже если линия правильно разделяет все точки, пока не найдем границу решения, которая является наиболее достоверной из ее предсказаний.

Непрерывный персептрон

Итак, какие изменения мы должны внести в наш персептрон, чтобы получить вероятности в качестве выходных данных вместо двоичных 0 или 1? Единственное изменение, которое нам нужно применить, это наша функция активации. Именно в этот момент мы ввели в нашу модель дискретизацию, решив использовать ступенчатую функцию, которая может принимать только значения 0 или 1.

Теперь нам нужна функция, которая будет давать непрерывный набор выходных данных, но все еще ограничена между 0 и 1 (нам нужны вероятности в качестве выходных данных). Поэтому мы заменим ступенчатую функцию на сигмовидную:

Как видите, сигмовидная функция (верхняя функция активации) принимает любое значение между ±∞ и сопоставляет его со значением от 0 до 1. Это означает, что наш конечный результат может эффективно представлять вероятность. Возвращаясь к нашему примеру с растением, это означает, что теперь мы предсказываем вероятность того, что данное растение вырастет, а не просто классифицируем, вырастет оно или нет!

Измерение вероятностной ошибки

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

Тем не менее, мы до сих пор не знаем, как найти оптимальные веса и смещения для нашей модели. По сути, мы знаем, что «оптимальная» модель будет найдена путем минимизации некоторого количества ошибок. Единственное, что мы добавили сейчас, это то, что мы хотим измерить какую-то вероятностную ошибку.

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

Здесь y_hat — это вероятность того, что точка данных относится к синему классу. Таким образом, один из способов, которым мы можем измерить ошибку, — это просто умножить, насколько «отклоняется» каждая точка данных от правильной вероятности:

Здесь мы знаем, что вероятность того, что красная точка данных будет синей, должна быть равна 0, а вероятность того, что синяя точка данных будет синей, должна быть равна 1. Таким образом, каждый вывод равен 0,8 '. выключенный'. Умножьте это вместе, и мы получим непрерывную величину, которая уменьшается по мере того, как мы лучше предсказываем, к какому классу (цвету) попадают наши точки данных.

Звучит идеально, верно? Есть только одна проблема, связанная с тем фактом, что наша ошибка для каждой точки данных ограничена между 0 и 1. Точнее, это связано с тем фактом, что чем больше у нас точек данных, тем больше чисел от 0 до 1 нам придется перемножить вместе, чтобы получить нашу окончательную ошибку. Это может оченьбыстро привести к тому, что мы получим абсолютно крохотные числа для нашей последней ошибки. Теоретически это не должно быть проблемой, однако в вычислительном отношении работа с крошечными числами приводит к нестабильному поведению. Таким образом, мы определенно хотим избежать ошибки измерения таким образом.

Другим вариантом было бы просто сложить ошибки вместе, а не умножать их. То есть:

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

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

Здесь ошибка:

Посмотрите, что происходит, когда наша модель становится еще более уверенной в том, что все сделано правильно.

Ошибки исчезли, хотя модель все еще неправильно классифицирует точку?! Эта модель может продолжать становиться все более и более уверенной в своем неверном прогнозе просто потому, что ошибка все равно будет уменьшаться. Вот почему простое измерение ошибки для каждой точки данных как разницы между предсказанной вероятностью и истинной меткой на практике не работает. Нам нужно что-то, что гораздо сильнее наказывает за неправильную классификацию, поэтому модель не может избежать наказания за описанное выше поведение.

Перекрестная энтропия - мера вероятностной ошибки

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

Где N — общее количество точек данных, y_i — метка (1 или 0 ) каждой точки данных, а p(y_i) — вероятность того, что эта точка данных находится в выбранном классе.

Давайте применим эту ошибку к нашему примеру с 3 точками данных и посмотрим, как это работает.

А теперь давайте посмотрим, что произойдет, если наша модель попытается повысить свою уверенность в том, что это граница наилучшего решения:

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

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

Оптимизация ошибок — градиентный спуск

Хорошо, мы почти подошли к тому, чтобы выяснить, как найти наши лучшие веса и смещения. Теперь, когда у нас есть мера ошибки, как нам ее минимизировать?

Точно так же, как мы должны были выбрать способ измерения ошибки, нам также нужно выбрать способ ее оптимизации. На практике есть несколько оптимизаторов, которые вы можете выбрать, однако, чтобы получить представление о том, как они все работают, мы рассмотрим стохастический градиентный спуск, «дедушку оптимизаторов». Как только вы поймете, как работает SGD (стохастический градиентный спуск), остальным будет намного легче научиться. Я рассмотрю общий обзор того, как это работает, и сохраню детали для будущей статьи.

Проход вперед

Давайте по умолчанию вернемся к нашему примеру с двумя точками данных, но на этот раз с некоторыми фактическими координатами (или значениями для входных объектов). Мы инициализируем наши веса и смещения w_0, w_1 и b значением 1.

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

Таким образом, для нашей красной точки данных мы получаем 0,832 вероятности быть синей. Установив метку синего класса как 0, мы можем передать это через нашу формулу для ошибки/стоимости (обозначается C): (обратите внимание, что это всего лишь бинарная формула перекрестной энтропийной потери, примененная к одним данным точка, а не целая партия):

Обратный проход

Теперь мы вычисляем следующие градиенты:

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

Затем мы запускаем прямой проход для второй точки данных, а также вычисляем эти градиенты.

Наконец, мы вычисляем среднее значение градиентов для каждого параметра и обновляем их следующим образом:

Этот символ, который немного похож на n, называется eta и является просто константой, которую мы устанавливаем, чтобы избежать слишком большого изменения наших параметров между итерациями, это обеспечивает более плавное обучение. процесс. Он известен как гиперпараметр, и мы рассмотрим его позже в серии проектов.

После того, как мы обновили наши параметры, мы снова пропускаем данные через модель, вычисляем нашу ошибку, затем усредняем градиенты и, наконец, снова обновляем параметры. Мы продолжаем делать это, пока не обнаружим, что ошибка не сильно уменьшается после каждой итерации. Достигнув этого этапа, мы говорим, что модель «обучена» и приступаем к ее тестированию. Если модель хороша, мы сохраняем ее или возвращаемся к обучению и меняем значение гиперпараметров, чтобы посмотреть, сможем ли мы получить лучший результат.

Вот как мы находим лучший набор весов и смещений.

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

Резюме

В этом посте мы затронули много разного материала. Если вам удалось выполнить все вышеперечисленное, то:

Чтобы сделать краткий обзор, мы начали с попытки ответить на вопрос,

Как найти наилучший набор значений для наших параметров, весов и смещений?

Затем мы узнали, что сначала нам нужно найти какой-то способ измерения ошибки для нашей модели, а затем должны были побеспокоиться о том, чтобы найти метод ее минимизации.

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

Затем мы рассмотрели, как можно модифицировать персептрон, чтобы заставить его выводить вероятности. Мы достигли этого, заменив ступенчатую функцию и используя вместо нее сигмоид в качестве функции активации.

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

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

Следующие шаги

Следующее, с чем нам придется иметь дело, — это нелинейные границы решений. До сих пор во всех примерах, с которыми мы имели дело, все данные можно было полностью разделить, проведя линию через набор данных. Что происходит, когда мы не можем аккуратно разделить данные? Это основной мотив для объединения этих персептронов в нейронные сети, о чем мы поговорим далее.

Вопросы

Для чего нужны фактические выражения:

(Бонус, можете ли вы определить сходство между тем, как веса обновляются в алгоритме обучения дискретного персептрона, и тем, как мы делаем это с помощью градиентного спуска с использованием двоичной перекрестной потери энтропии?

Почему для градиентного спуска требуется непрерывная функция ошибок? Что произойдет, если мы попытаемся использовать его, когда ошибка состоит только в количестве ошибочно классифицированных точек?