Перцептрон – это простая модель искусственной нейронной сети, используемая для классификации входных данных. Она была разработана Фрэнком Розенблаттом в 1957 году и является основой для более сложных моделей нейронных сетей.
Перцептрон имеет форму одного или нескольких входных сигналов, связанных с ними весовых коэффициентов и функции активации. Входные сигналы могут быть числами или другими бинарными значениями, а весовые коэффициенты определяют важность каждого входного сигнала для классификации. Функция активации определяет, какой выходной сигнал будет сгенерирован на основе входных данных и весовых коэффициентов.
Основная идея перцептрона заключается в том, чтобы найти линейное разделение между классами входных данных. Это означает, что перцептрон может определить, к какому классу относится каждая точка данных, основываясь на их положении относительно гиперплоскости.
Обучение перцептрона происходит путем настройки весовых коэффициентов с помощью алгоритма обратного распространения ошибки. В начале обучения весовые коэффициенты инициализируются случайными значениями, а затем для каждой подачи входных данных перцептрон генерирует выходной сигнал. Если значение выходного сигнала не совпадает с ожидаемым, то весовые коэффициенты корректируются в соответствии с ошибкой.
Перцептрон имеет ограниченные возможности в обработке сложных данных, так как он способен дать только линейное разделение между классами. Однако, путем комбинирования нескольких перцептронов можно создавать более сложные модели нейронных сетей. Также существуют модификации перцептрона, такие как многослойный перцептрон, которые способны решать более сложные задачи.
По своей сути перцептрон является алгоритмом машинного обучения, который находит применение в различных областях, таких как распознавание образов, обработка данных и прогнозирование. Он является одним из основных строительных блоков в области искусственного интеллекта и широко применяется в практике.
Для написание нейросети я буду использовать Python и библиотеку Numpy
Для обучения парцептрона мы возьмем задачу выше.
Код перцептрона:
С самого начала нужно импортировать нашу библиотеку:
Далее добавляем функцию активатор – sigmoid:
В 4 строке используем np.exp (энпи.экспи) - математическую функцию, используемую в Python для нахождения экспоненциальных значений всех элементов, присутствующих во входном массиве. С помощью её мы подсчитываем во сколько раз увеличивается функция, если мы на столько увеличим аргумент. Стоит вспомнить легенду о шахматной доске: когда Сисса создал шахматы, индийский император решает наградить его за это. Он позволил Сиссе выбрать награду. Изобретатель попросил у короля за первую клетку шахматной доски заплатить ему одно зерно пшеницы, за вторую — два, за третью — четыре и так далее. Императору не понравился такой расклад – ему казалось, что Сисса просит слишком мало. Но при подсчете оказалось, что кол-во зёрен равняется 18 446 744 073 709 551 615. Чтобы это всё это подсчитать, нужно использовать формулы и exp-функция одна из таких.
Затем мы вписываем тренировочные данные: сначала условия задачи, а потом ожидаемый ответ.
Для начала нам нужны хоть какие-то веса, поэтому мы добавим их рандомом. На самом деле числа у нас не совсем случайные, команды написаны так, что веса, сколько бы раз мы не запускали код, всегда будут одинаковыми
Теперь вводим команду print (принт) – она преобразует объект, который мы хотим вывести на экран, в строку, а затем печатает его. Сначала пишем, под каким названием нужно отобразить значение, а потом какое значение нужно вывести. Мы получили случайные веса .
Теперь обучим нашу нейросеть:
Использовать будем метод обратного распространения: входные данные передаются нейрону, он вычисляет свое значение активации на основе входных данных и текущих весов. После прямого распространения вычисляется разница между предсказанными значениями и целевыми значениями. Эта ошибка является мерой того, насколько хорошо нейронная сеть выполнила задачу. Далее градиент функции потерь по весам вычисляется с использованием метода градиентного спуска. Градиент показывает направление наибольшего возрастания функции, от этого показателя находится значение, на которое нужно уменьшить градиент. Веса нейронной сети обновляются с использованием градиента, вычисленного на предыдущем шаге. Этот процесс мы повторим 20 000 раз, чтобы функция потерь достигла желаемого значения.
Нейросеть смогла найти нужные веса и придти к правильным ответам.
Примечание: мы смотрим не на всё число, а на первые три цифры и округляем их.
Проведем проверку, значения A, B, C равняются 1, 0, 0:
В итоге наша нейронная сеть выдает правильный результат.