Что такое линейная классификация и как она относится к нейронным сетям?

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

Нейронные сети имеют долгую историю в области создания искусственного интеллекта. Они относятся к середине 20-го века.

Основной строительный блок мозга – нейрон. Поэтому термин «нейронная сеть» означает сеть нейронов. Посмотрите на картинку:

Что такое линейная классификация и как она относится к нейронным сетям?

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

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

Существуют весьма сложные модели нейронов, связанные с системами нелинейных дифференциальных уравнений. Первой из них была модель Ходжкина–Хаксли:

Что такое линейная классификация и как она относится к нейронным сетям?

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

Есть и более простая модель, называемая моделью Фицхью–Нагумо:

Что такое линейная классификация и как она относится к нейронным сетям?

Как видите, она всё ещё основывается на системе нелинейных дифференциальных уравнений, а у нас нет никакого желания иметь с ними дело.

Но вот что мы можем взять из того, что уже знаем о нейронах:

  1. Первая аналогия с линейным классификатором – это, как вы уже могли видеть, состоит в том, что нейрон принимает много входных сигналов и обрабатывает их, формируя исходящий сигнал.
  2. Второе – нейрон имеет порог возбудимости, и если напряжение достигает этого порога, происходит всплеск, в противном случае всплеска не происходит. Это то же самое, что и двоичный классификатор, на выходе имеющий сигнал «да»/«нет» или 0/1.
  3. Аналогия номер три. Давайте возьмём микроскоп и посмотрим на соединение нейронов под увеличением.

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

Что такое линейная классификация и как она относится к нейронным сетям?

Теперь легко понять, почему учёные были так взволнованы этой моделью. Возникает вопрос – можно ли объединив вместе группу нейронов, создать умный, думающий мозг внутри компьютера? Можно ли создать сознание?

Как рассчитать выход нейронного логистического классификатора. Теория

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

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

 

Итак, у нас есть две входных переменных x1 и x2, а на выходе имеем y (о значении кружков мы поговорим чуть позже). Мы знаем, что должны умножить каждую входную переменную на весовой коэффициент, так что каждую из линий мы можем рассматривать как w1x1 и w2x2. Таким образом, кружки означают умножение. Другую функцию можно рассматривать как сумму их входящих переменных: w1x1 + w2x2. Так что можете думать о логистической регрессии как о кружке, предшествующем y. Его также называют логистической функцией или сигмоидой.

Нарисуем сигмоиду, чтобы вы знали, как она выглядит. В общем случае это S-образная кривая, имеющая предел и при x, стремящемся к бесконечности, и при x, стремящимся к минус бесконечности.

Существует ряд сигмоидных функций, но из них выделяются две общеупотребимые. Это гиперболический тангенс th(x), находящийся в пределах от минус единицы до единицы, и пересекающий ось y в нуле. Другой функцией, которой мы будем пользоваться, является логистическая функция (сигмоида):

\sigma (z) = \frac{1}{1 + e^-^z}.

Эта функция пробегает значения в пределах от нуля до единицы и пересекает ось y при x = 0,5. Учитывая всё это, можем сказать, что результатом логистической регрессии является величина 

\sigma (w^Tx).

Что это значит?

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

Если же произведение будет очень велико, но со знаком «минус», мы получим величину, очень близкую к нулю. Если же значение функции будет равно 0,5, то это значит, что произведение равно нулю, что, в свою очередь, означает, что мы находимся прямо на границе между двумя классами. Иными словами, вероятность принадлежности к классу равна 50%.

Какова же разница между логистической регрессией и общим линейным классификатором, который обсуждали ранее? В конце мы получаем логистическую функцию, выдающую нам число между нулём и единицей, и когда мы проводим классификацию, можем говорить, что всё, что больше 0,5, принадлежит классу 1, а всё остальное – к классу 0. Это, в принципе, то же самое, поскольку значение сигмоиды при нуле равно 0,5.

Как рассчитать выход нейронного логистического классификатора. Код

Теперь мы напишем код для выполнения логистической регрессии.

Итак, прежде всего нам понадобятся данные для работы регрессии. Создадим матрицу размерности 100х2 с данными, подчиняющимися нормальному распределению.

import numpy as np

N = 100

D = 2

X = np.random.randn(N,D)

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

ones = np.array([[1]*N]).T

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

Xb = np.concatenate((ones, X), axis=1)

Далее установим случайным образом вектор весовых коэффициентов. Теперь он уже должен иметь размерность D+1.

w = np.random.randn(D + 1)

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

Итак, первое, что надо сделать, – вычислить скалярное произведение между каждой строкой x и w. Вы, вероятно, подумаете, что мы это сделаем с помощью оператора цикла for, но на самом деле гораздо эффективнее использовать встроенную в Python функцию умножения матриц. Если вы привыкли пользоваться MATLAB, то полагаете, что звёздочка означает умножение матриц, но на языке Python она означает лишь умножение элемента на элемента. Если нужно перемножить матрицы в Python, то фактически используется функция dot. Поэтому вот что мы сделаем.

Да, и вот ещё какая интересная вещь. Мы рассчитываем w^Txкак скалярное произведение, но поскольку w и x, как правило, представлены одномерным вектором-столбцом, мы имеем размерность NxD, только каждый x будет представлен вектором-строкой размерности 1xD, так что у нас всё выйдет немного задом наперёд.

z = Xb.dot(w)

Это даст нам вектор размерности Nx1, что вы можете проверить, распечатав его.

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

def sigmoid(z):

return 1/(1 + np.exp(-z))

print sigmoid(z)

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

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

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: