В части 1 введения в нейронные сети мы узнали об одном из простейших искусственных нейронов, называемом нейроном Маккаллоха-Питтса, и реализовали его на питоне.
Проблема с MP-нейроном заключается в том, что на самом деле обучение не происходит. Веса устанавливаются вручную.
В этой статье мы увидим Perceptron, который является усовершенствованием нейрона MP. В отличие от MP-нейрона, персептрон может запоминать веса с течением времени.
Мы также увидим, как с нуля обучить перцептрон классифицировать логические операции, такие как И или ИЛИ.
Персептрон:
Персептрон — это, по сути, двоичный классификатор. Это алгоритм определения гиперплоскости, которая разделяет две категории данных.
Типичный персептрон будет иметь
-
- Входы
- Вес и смещение
- Функция активации
Персептрон получает входные данные, умноженные на случайные веса, и добавляет к ним смещение. Смещение функционирует как входной узел, который всегда выдает постоянное значение.
\text { Взвешенная сумма }=\quad \sum_{i=1}^{m} \mathrm{x}_{\mathrm{i}} \mathrm{W}_{\mathrm{i}}+\mathrm{ б}
\text { Взвешенная сумма }=x_{1} w_{1}+x_{2} w_{2}+x_{3} w_{3}+b
Затем к взвешенной сумме будет применена функция активации. Взвешенная сумма — это не что иное, как сумма всех входных данных, умноженная на ее веса + смещение.
Здесь мы собираемся использовать единичный шаг или функцию активации Хевисайда. Это пороговая функция активации.
f(x)=\left\{\begin{array}{ll}
0 & \text { for } x<0 \\
1 & \text { for } x \geq 0
\end{массив}\right.
Если входное значение больше 0, то возвращается 1, иначе возвращается 0.
Обучение перцептрону:
Теперь давайте посмотрим, какие именно шаги необходимы для обучения персептрона.
Обучение персептрона простое и понятное. Нам нужно получить набор весов, который классифицирует каждый экземпляр в нашем обучающем наборе.
Первым шагом является случайная инициализация весов и смещения.
Затем мы должны рассчитать чистый ввод, умножив ввод с весами вместе со смещением.
y_{in}=\sum_{i=1}^{m} x_{i} w_{i}+b
Затем мы должны применить функцию активации к сетевому входу. Здесь мы используем ступенчатую функцию, которая сжимает ввод между 0 и 1.
у = Ф(ув)
И на последнем этапе, если прогнозируемое значение не равно целевому значению, мы должны обновить веса и смещение.
ошибка = т – у
Здесь t — целевое значение, а y — прогнозируемое значение.
Обновление весов и смещений выглядит следующим образом:
жя(новый) = шя(старый) + альфа * ошибка * хя
b(новый) = b(старый) + альфа * ошибка
Альфа здесь — скорость обучения.
Выполнение:
Теперь давайте обучим персептрон предсказывать результат логического элемента ИЛИ.
import numpy as np # Функция активации def step (x): вернуть 1, если x > 0, иначе 0 # данные данных обучения = [[0,0],
[0,1],
[1,0],
[1,1]]#Целевые значения y = [0, 1, 1, 1] #Инициализация весов и смещения w = np.random.randn(2) b = np.random.randn() epochs = 30 alpha = 0.1 #перебор нужного количества эпох для i в диапазоне(эпохи): #перебор отдельных данных point for(x, target) in zip(data, y): #выполнение скалярного произведения между входными данными и весами z = sum(x * w) + b #прохождение чистого ввода через функцию активации pred = step( z) #вычисление ошибки error = target – pred #обновление весов и смещения для index,value в enumerate(x): w[index] += альфа * ошибка * значение b += альфа * ошибка #Тестовый тест = [0, 1]ты = ш[0] * тест[0] + ш[1] * тест[1] + b пред = шаг (и) печать (пред)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
Импортировать пустышка как нп #Функция активации деф шаг(Икс): возвращаться 1 если Икс > 0 еще 0 #Обучающие данные данные “=” [[0,0], [0,1], [1,0], [1,1]] #Целевые значения у “=” [0, 1, 1, 1] #Инициализация весов и смещения ж “=” нп.случайный.Рандн(2) б “=” нп.случайный.Рандн() эпохи “=” 30 альфа “=” 0,1 #перебрать желаемое количество эпох для я в диапазон(эпохи): #цикл по отдельной точке данных для(Икс, цель) в молния(данные, у): #выполнение скалярного произведения между входными данными и весами г “=” сумма(Икс * ж) + б #пропускаем сетевой вход через функцию активации пред “=” шаг(г) #вычисление ошибки ошибка “=” цель – пред #обновление весов и смещения для индекс,ценить в перечислить(Икс): ж[index] += альфа * ошибка * ценить б += альфа * ошибка #Тестирование тест “=” [0, 1] ты “=” ж[0] * тест[0] + ж[1] * тест[1] + б пред “=” шаг(ты) Распечатать(пред) |
Теперь давайте попробуем это для оператора AND. Нам просто нужно изменить целевые значения.
у = [0, 0, 0, 1]
Теперь, если мы запустим программу, мы получим вывод как 0. Поскольку 0 И 1 равно 0
Вы можете попробовать изменить тестовые значения как [0,0],[1,0] или [1,1].
Теперь, если вы попытаетесь классифицировать XOR с помощью персептрона, изменив целевые значения (y), независимо от того, сколько эпох вы обучаете сеть, вы никогда не сможете классифицировать, поскольку она не поддается линейной классификации.
Тогда как мы можем классифицировать функции, которые не являются линейно разделимыми. Для этого нам нужен многослойный персептрон, который имеет больше слоев, чем обычный персептрон.
ЗАКЛЮЧЕНИЕ:
В этой статье мы узнали, что такое персептрон и как реализовать их с нуля на питоне.
Персептрон — это бинарный классификатор, определяющий гиперплоскость, разделяющую две категории данных. Однако проблема с перцептроном заключается в том, что это линейный классификатор. Он не может решать нелинейные задачи.
В следующей части мы узнаем о многослойном персептроне, который может решать нелинейные задачи.