Предварительные условия

  • Линейная регрессия
  • Основная линейная алгебра
  • Исчисление (частные производные)
  • Матричное исчисление (необязательно)
  • Основная вероятность
  • Питон (NumPy)

Введение в логистическую регрессию

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

Линейный классификатор

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

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

Предположим, мы выбрали фиолетовую точку над линией

Теперь давайте выберем желтую точку под линией

Обратите внимание, что результат будет отрицательным, если мы выберем точку над линией, и положительным, если мы выберем точку ниже линии. Именно так мы можем классифицировать любую новую точку данных. Если точка лежит прямо на линии, результатом будет 0, что не является классом. В общем случае для входов D уравнение можно записать так.

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

Нейрон

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

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

Это создает поведение «все или ничего», при котором нейрон срабатывает только тогда и только тогда, когда напряжение превышает пороговое значение. Следовательно, выходной сигнал биологического нейрона может быть 1 или 0, включен или выключен. Как вы скоро увидите, наша модель логистической регрессии основана на архитектуре и механизме нейронов человеческого мозга.

Настройка модели

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

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

Поскольку вероятности того, что x принадлежит y=1 и y=0, в сумме должны равняться 1, мы также получаем

Это хорошо, потому что мы можем просто округлить наши вероятности, чтобы получить значение прогноза. Таким образом, если вероятность принадлежности к классу 1 равна 0,7, мы можем просто округлить ее до 1. А если вероятность принадлежности к классу 1 равна 0,2, мы можем округлить в меньшую сторону, чтобы получить прогноз 0.

Быстрая визуализация нашей модели.

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

Обзор переменных

Когда я впервые изучал нейронные сети и логистическую регрессию, самым трудным было просто запомнить значение и размер всех переменных. Итак, давайте подведем итоги, прежде чем двигаться дальше. Переменные почти такие же, как из блога Linear Reгрессия.

  • N = количество образцов
    - Измерение веса 10 особей, N=10
  • D = количество признаков в образце
    – Измерьте рост, вес и возраст, чтобы спрогнозировать артериальное давление. Д=3
  • w = весовой вектор размера Dx1
  • X = матрица данных размером NxD
    . Каждая строка представляет собой образец, а каждый столбец представляет собой признак этого образца.
  • x = одна выборка размером Dx1.

Обычно прописные буквы относятся к матрицам, а строчные — к векторам.

  • yn = одна целевая метка или прогноз на основе модели из n-го образца
  • Y = все целевые метки или прогнозы моделей в виде вектора размера Nx1.
  • tn = одна целевая метка из n-го образца
  • T = Все целевые метки в виде вектора размера Nx1.
  • P(y=1|x) = предсказание наших моделей как вероятность

Причина, по которой у нас есть два разных значения Y, заключается в том, чтобы облегчить запись наших выводов. При выводе писать P(y=1|x) довольно громоздко, поэтому мы устанавливаем P(y=1| x) = y и вместо этого используйте t для нашей цели. Если вы видите t и y вместе, предположим, что t=цель и y=прогноз

  • Функция ошибок = функция затрат = целевая функция

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

Настройка функции ошибок

Теперь давайте настроим способ измерения ошибки нашей модели. Первоначальная идея могла бы заключаться в том, чтобы просто использовать нашу функцию среднеквадратической ошибки (MSE) из линейной регрессии. Если мы разберем нашу проблему, мы поймем, что функция MSE не идеальна в этом сценарии. Во-первых, MSE предполагает распределение ошибки по Гауссу, однако каждый прогноз в нашей модели логистической регрессии соответствует распределению Бернулли. Во-вторых, мы хотим, чтобы наша ошибка была экспоненциально большей, если наша модель очень уверена в совершенно неправильном ответе. Это невозможно смоделировать, используя квадратичную природу MSE. Природа нашей проблемы связана с вероятностью, поэтому имеет смысл выбрать функцию ошибок, основанную на вероятности. Мы можем позаимствовать идею «энтропии» из теории информации. Если вы не знаете об информационной энтропии, предлагаю посмотреть это видео, раскрывающее эту тему.

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

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

Когда наш прогноз равен 1, а цель равна 1, наша ошибка равна нулю, но ошибка увеличивается экспоненциально, чем более уверена наша модель в неправильном ответе, и наоборот, если наш прогноз равен 0. Это известно как ошибка перекрестной энтропии. , формула такая.

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

Максимальная вероятность

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

Предположим, мы подбрасываем монету, но не знаем, честная она или нет. Мы не знаем вероятность выпадения орла или решки. Подбрасываем монету 10 раз и наблюдаем 8 орлов и 2 решки. Вероятность наблюдения этого результата

Мы хотим выяснить вероятность монеты, которая максимизирует вероятность наблюдения этих данных. Мы хотим максимизировать p по отношению к L. В этой ситуации мы максимизируем логарифмическую вероятность, взяв логарифм обеих сторон. Почему? Конечный результат останется тем же, поскольку log является монотонно возрастающей функцией (если a>b, то log(a) > log(b) также верно). Использование логарифмов по правилу произведения значительно облегчит наш вывод. Обратите внимание: в машинном обучении журнал подразумевает естественный журнал.

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

В нашей задаче мы наблюдаем данные размера N. Метки этих данных представляют собой последовательности 0 и 1 вместо орел и решка. Мы хотим выяснить вероятность нашей модели с учетом x (входных данных), которая максимизирует вероятность наблюдения этих данных. Напомним определение нашей модели.

Настройка проблемы

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

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

Упражнение: Решение весов.

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

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

Решение

Возьмем первую производную по yn

Далее возьмем производную yn по (функции активации)

Наконец, взяв производную от wi, которую мы уже вычислили, когда выполняли линейную регрессию.

Теперь мы можем объединить результаты и вычислить окончательную производную.

Мы можем векторизовать это уравнение

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

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

Градиентный спуск/восхождение

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

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

  • Итерация 1: w = 5 -0,1*10 = 4
  • Итерация 2: w=4 – 0,1*8= 3,2
  • Итерация 3: w=3,2 -0,1*6,4 = 2,65

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

Упражнение: Кодирование модели

В репозитории есть файл под названием «logisitic_reгрессия_practice», откройте его в редакторе и заполните переменные и функции, используя изученные вами данные. Также обязательно загрузите данные «logisitic_data.csv». Если вам нужны дополнительные задачи, попробуйте написать модель с нуля без посторонней помощи. Просто загрузите logisitic_data. Если вы застряли, вы всегда можете посмотреть решение под названием «logisitic_reгрессия_solution».

Многоклассовая логистическая регрессия

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

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

Теперь наши веса больше не вектор, а матрица.

В общем, мы можем думать о X и W для входных данных D, классов K и выборок N как

Активация Софтмакс

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

Пас вперед

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

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

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

Ошибка расчета

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

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

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

Обзор переменных

Упражнение: Получение решения.

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

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

Вы заметите, что здесь есть несколько фиктивных переменных n и k’, при выполнении вывода может возникнуть путаница и двусмысленность, на какие индексы мы будем ссылаться, поэтому мы используем эти фиктивные переменные. Вы можете думать об этих переменных как о том, что мы используем в циклах for в стиле C для перебора массива.

Вторая производная в этой цепочке производных – самая сложная. Тогда же мы переключаемся с k’ на k. Мы переключаемся с просмотра всех классов, которые k' перебирает, на k, который является конкретным классом, по которому мы берем производную.

Причина, по которой это происходит, заключается в том, что функция softmax зависит от всех входных сигналов активации, а не только от своей собственной. Поэтому функция softmax принимает вектор в качестве входных данных. Вот краткий пример с k=3.

Результатом будет матрица Якобиана.

Решение

Начнем с того, что возьмем первую производную

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

Здесь у нас есть два разных случая: k != k' и когда k = k', поскольку мы берем производную по ank, когда k != k' мы рассматриваем член ank' как константу, а когда они равны, мы придется также взять производную от него. Также для суммирования мы должны учитывать момент j=k и брать соответствующую производную.

Давайте сначала рассмотрим, когда k != k’

Теперь давайте рассмотрим, когда k = k’

Мы можем использовать функцию «Дельта Кронекера» для случаев, когда нам нужно значение, равное 0 или 1.

Я заменил ynk на ynk’ в конечном результате производной, когда k = k’, чтобы мы могли получить аккуратное окончательное выражение, суммирующее оба случая.

Теперь мы можем перейти к третьей и последней производной.

Объединив все три производные вместе, получим

Теперь, чтобы изолировать дельту, давайте на мгновение забудем о суммировании по N и расширим выражение

Мы знаем, что дельта Кронекера = 1 тогда и только тогда, когда k = k’, поэтому мы знаем, что все суммирование по дельте будет умножено на ноль, за исключением случаев, когда k = k’.

Поскольку yk не зависит от суммирования, мы можем его факторизовать, и существует только одна цель для всех k возможностей, поэтому мы знаем суммирование для tk’ = 1.

Теперь вернём суммирование по N.

Этот результат очень похож на решение двоичной логистической регрессии, и это хорошо.

Заключение

Вы можете попытаться написать алгоритм регрессии Softmax самостоятельно. Причина, по которой я не пишу его здесь, заключается в том, что мы углубимся в него, когда будем заниматься нейронными сетями в следующем блоге. Если я поделюсь здесь очень похожим кодом, это станет излишним. Идеи, которые мы здесь изучили, станут идеальной ступенькой к нейронным сетям, и если вы хорошо понимаете логистическую регрессию, это сделает нейронные сети намного проще. Есть много вещей, которые я не затронул в этом блоге, например, регуляризация и другие практические вопросы. Считайте это кратким введением, а не исчерпывающим руководством. Удачи !