Нейросети ближе, чем вы думаете.
Для простого обывателя нейросеть кажется чем то сверхъестественным, граничащим с человеческим разумом, и вскоре поработит все человечество. Однако это глубокое заблуждение. Нейросеть – не больше чем простой алгоритм, способный самообучаться, но уж точно не способный к разумной деятельности)). Они встречаются сплошь и рядом, программы для определения лиц на фотографиях, генераторы текстов и изображений, различные приложения по автозамене лиц, все это ни что иное, как нейросеть. Они могут иметь совершенно разную архитектуру, в зависимости от тех задач, которые они призваны решать, но сегодня Ваш покорный слуга расскажет Вам про самую простую из этих задач, а именно классификации, и нейросеть, предназначенную для выполнения таких задач – перцептрон.
Матчасть
Для начала небольшой экскурс в архитектуру нейросетей в общем случае. Любая нейронная сеть состоит, внезапно, из нейронов, подобно тому, как состоит из них мозг человека, насчитывающий около ста миллиардов таких нейронов. В случае с нейросетями нейроном называют структурную единицу нейросети, которая формирует выходные данные на основе данных, поступающих на вход и формализованного закона, по которому формируются выходные. Если проще, в нейроне выполняется некая математическая операция над входными данными. В частности:
Здесь выход у формируется на основе входов х и синапсов w, где каждый входной параметр умножается на соответствующие ему синапс, иначе его называют вес, (в дальнейшем будем использовать это понятие), затем они суммируются и получается некоторое число h, которое подставляется в функцию активации, которая и определяет выходной результат. Существует огромное количество таких функций, но в целях обучения обычно используется сигмоида, поэтому не будем изобретать велосипед и отходить от канонов программирования, для нашей сегодняшней задачи она более чем подойдет. Сегодня мы будем реализовывать работу именно этого нейрона, это конечно не нейросеть, которая может насчитывать тысячи таких нейронов, но нам важно сконструировать скелет, понять принцип, по которому работает нейросеть, чтобы в дальнейшем на наш скелет нарастить уже мясо.
Реализация.
Наряду с нейросетями, популярность набирает и язык программирования Python, благодаря своей простоте и гибкости, он позволяет решать почти весь спектр задач программирования, в том числе и реализацию нейросетей. Для своих целей я использую среду разработки Spyder версии 4.
И да, даже если вы почти ничего не знаете в программировании на этом языке, не беда, сегодняшний урок будет очень простым для понимания, но советую все же освоить хотя бы базовые вещи.
Итак, для начала нам необходимо импортировать библиотеку NumPy, довольно мощная штука для работы с большими массивами чисел, а так же подготовить 4 датасета для нашей нейросети.
Итак, что же мы сделали? Логично предположить, что для обучения нейросети ей необходимо иметь какой то датасет, причем довольно большой, но это не наш случай. Условно можно считать, что у нас есть вопросы, и правильные ответы на них, каждая строка массива, это вопрос, а каждый элемент строки, это наш параметр, аналогично в ответе. Можно заметить, что последний столбец массива вопросов совпадает с массивом ответов, это сделано намеренно для наглядности работы. Отсюда, наша нейросеть должна дать число, близкое к единице, когда мы подадим на вход переменную vhod. И конечно, нам нужны наши веса для параметров, число весов должно быть равно числу параметров в каждой строке, у нас их 4. Веса выбираете рандомные, можете даже сгенерировать с помощью встроенной функции random.
Далее необходимо прописать нашу функцию активации, у нас это сигмоида и следующую конструкцию, сейчас поясню:
Итак, как я уже говорил, наш нейрон представляет собой простейший сумматор, где наши входные данные умножаются на веса (они же синапсы), затем складываются и отправляются на функцию активации. В качестве функции мы выбрали сигмоиду, так как ее область допустимых значений варьируется от 0 до 1, к тому же она непрерывна и мы можем найти ее производную, это нам понадобится чуть ниже. Функция dot фактически выполняет за нас половину работы, а именно умножает веса на соответствующие параметры и суммирует их, в результате мы получаем некоторый вектор-столбец значений, равный длине вектора весов, и отправляется в функцию активации, после которой мы уже получаем вектор-столбец со значениями от 0 до 1. Отлично! Но этого недостаточно.
Для того, чтобы обучить модель, надо усвоить одну вещь, в нашем случае здесь все зависит от весов, которые мы задали в самом начале, и для того, чтобы наша нейросеть могула делать предсказания, нам необходимо скорректировать эти веса определенным образом. Вот тут нам и пригодится производная от сигмоиды. Как только мы посчитали наши значения в первый раз, нам нужно найти разницу между ними, и ответами, которые мы прописали в самом начале. У нас это переменная err, со временем она должна принимать все меньшее и меньшее значение. Далее, переменная adjust у нас играет роль корректировки весов. Буква T возле переменной vopros означает, что это транспонированная матрица, то есть строка меняется на столбец. Выражение out*(1-out) это и есть производная функции активации, так что если вы намерены использовать другую, это надо учитывать. В конце мы корректируем наши веса.
Итак, фактически наша модель готова, после первого запуска она вам выдаст это:
Нас это не совсем устраивает, поэтому делаем цикл, около 20 000 итераций:
Уже ближе к истине, с каждой новой итерацией веса корректируются и нейросеть работает уже с новыми. Давайте посмотрим, как уменьшается ошибка для первого параметра из каждой строки вопроса:
На графике видно, что уже после 5000 итераций ошибка практически не уменьшается, так что циклов можно сделать меньше.
Вот так, я надеюсь эта статья была полезной для вас, в следующей на основе перцептрона мы уже будем делать нейросеть, которая будет работать уже с изображениями, перцептрон хоть и прост, но у него колоссальный потенциал, мы еще не рассматривали нейросети как таковые, только самую основу, но уже на ней можно делать разные интересные штуки, всем мир!))
- 2Поделились
2 комментария