Простейшая нейронная сеть на Python | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Алгоритмы и структуры данных Team Lead Архитектура и шаблоны проектирования Разработчик IoT C# Developer. Professional PostgreSQL Разработчик на Spring Framework
-5%
Flutter Mobile Developer NoSQL iOS Developer. Basic
-10%
C++ Developer. Basic C++ Developer. Professional Android Developer. Professional Microservice Architecture Unity Game Developer. Professional Базы данных Node.js Developer React.js Developer Специализация Java-разработчик
-25%
Web-разработчик на Python Framework Laravel Cloud Solution Architecture Vue.js разработчик Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool" PHP Developer. Basic
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK Administrator Linux. Professional Дизайн сетей ЦОД Разработчик IoT PostgreSQL Экспресс-курс "Версионирование и командная работа с помощью Git"
-30%
Microservice Architecture Highload Architect Специализация Administrator Linux
-25%
Network engineer Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool" Network engineer. Basic
Корпоративные курсы
Безопасность веб-приложений IT-Recruiter Дизайн сетей ЦОД Компьютерное зрение Разработчик IoT Вебинар CERTIPORT Machine Learning. Professional
-6%
NoSQL Пентест. Практика тестирования на проникновение Java QA Engineer. Базовый курс Руководитель поддержки пользователей в IT
-8%
SRE практики и инструменты Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Infrastructure as a code Супер-практикум по использованию и настройке GIT Промышленный ML на больших данных Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» BPMN: Моделирование бизнес-процессов Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

Простейшая нейронная сеть на Python

В этой статье мы рассмотрим, как создать собственную простейшую нейронную сеть с помощью языка программирования «Питон». Мы не только создадим нейронную сеть с нуля, но и не будем использовать никаких библиотек. И займёт это всё не более девяти строчек кода на «Питоне».

Вот как выглядит код простейшей нейронной сети на «Питоне»:

4-20219-2bc477.png

Теперь давайте поговорим о том, как это получилось, а также посмотрим на расширенную версию кода. Внимательно изучив эту статью, вы сможете и сами написать свою нейронную сеть на «Питоне».

Что такое нейронная сеть (Neural Network)?

Прежде чем продолжить, вспомним, что из себя представляет нейронная сеть. Мы знаем, что мозг человека состоит из 100 млрд. клеток, которые мы называем нейроны. Они соединены синапсами, а когда нужное количество синаптических входов возбуждено, нейрон тоже возбуждается. Этот процесс учёные называют «мышлением».

1_HDWhvFz5t0KAjIAIzjKR1w_2-20219-7c47a9.png

Процесс можно смоделировать, если создать нейронную сеть на ПК. Причём нет необходимости моделировать сложнейшую модель мозга человека полностью, хватит лишь нескольких основных правил. Чтобы упростить реализацию, будем использовать классические матрицы и создадим модель из 3-х входных и одного выходного сигналов. И попробуем выполнить тренировку нейрона.

Первые 4 примера — это тренировочная выборка.

1_nEooKljI8XbKQh4cFbZu1Q_2-20219-2683ab.png

Обратите внимание, что значение столбца Output всегда равно значению самой левой колонки из столбца Input. Это значит, что правильный ответ в нашем случае будет равен 1.

Обучаем нейронную сеть

Теперь давайте добавим каждому входу вес (положительное или отрицательное число). Вход с большим отрицательным либо большим положительным весом существенно повлияет на выход нейрона. Но до начала обучения надо установить каждый вес случайной величиной. После этого можно приступать: 1. Возьмём входные данные из примера, скорректируем значения по весам и передадим их по формуле расчёта выхода нейрона. 2. Вычислим ошибочное значение (это, по сути, разница между выходом нейрона и желаемым нами выходом в примере используемого нами тренировочного набора). 3. Немного отрегулируем вес с учётом направления ошибки. 4. Повторим данный процесс десять тысяч раз.

1__1trgA6DUEaafJZv3k0mGw_1-20219-3abd97.jpeg

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

Формулируем расчёт выхода нейрона

Теперь посмотрим на формулу расчёта выхода нейрона. Поначалу возьмём взвешенную сумму входов:

1_RV7_CFkmmByfcXKkPcbAYQ_1-20219-f77039.png

Потом выполним нормализацию, и результат будет между 0 и 1. Теперь задействуем математическую функцию Sigmoid:

1_5il5GLo0gamypklQQ_z0AA_1-20219-7b1689.png

Функция Sigmoid нарисует S-образную кривую:

1_sK6hjHszCwTE8GqtKNe1Yg_1-20219-8046bd.png

Подставим 1-е уравнение во 2-е и получим интересующую нас формулу выхода:

1_7YdyG6fc6f6zMmx3l0ZGsQ_1-20219-f6eb78.png

Правда, пороговый потенциал использовать не будем в целях упрощения примера.

Формула корректировки веса

В процессе тренировочного цикла мы выполняем корректировку весов. Но насколько происходит корректировка? Тут подойдёт формула взвешенной ошибки:

1_SQBjpbBcCT3lTQlPEdr1eg_1-20219-3cabb6.png

Формула позволяет выполнять корректировку пропорционально величине ошибки. Также умножение происходит на входное значение, равное 0 либо 1. Когда входное значение будет равно 0, вес корректироваться не будет. Дополнительно мы выполняем умножение на градиент сигмовидной кривой. Что тут нужно учесть: 1. Сигмовидная кривая использовалась для расчёта выхода нейрона. 2. При больших числах кривая имеет небольшой градиент.

Если нейрон уверен в правильности существующего веса, он не хочет корректировать его слишком сильно. Умножение на градиент кривой именно это и делает.

Градиент Сигмоды образуется, если будем выполнять расчёты взятием производной:

1_HdHm9u3_wjwBPmwuLg3D3g_1-20219-c6d4b7.png

Если мы вычтем 2-е уравнение из 1-го, то получим необходимую итоговую формулу:

1_Jow4WVWNOp6rtiJ7vNQ0gQ_1-20219-ed752d.png

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

Пример нейронной сети на Python

Было заявлено, что библиотеки задействоваться не будут. Так-то оно так, но четыре метода из numpy импортировать придётся: — exp — для экспоненцирования; — dot — для перемножения матриц; — array — для создания матрицы; — random — для генерации случайных чисел.

Тот же array() можно применять для представления обучающего множества.

3-20219-aff6e0.png

В нашем случае “.T” является функцией транспонирования матриц.

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

Этот код вы найдёте и по ссылке на GitHub. Если будете работать с Python 3, замените лишь xrange на range.

1-20219-c92f17.png

Итог

Давайте запустим нейронную сеть через терминал:

python main.py

Результат должен быть приблизительно следующим:

2-20219-f4a656.png

Если у вас всё получилось, поздравляем — вы только что написали простейшую нейросеть!

Смотрите, изначально нейросеть присваивала себе случайные значения весов, потом она обучалась с помощью тренировочного набора. Далее она рассмотрела новую ситуацию [1, 0, 0], предсказав 0.99993704. Так как правильный ответ равен единице, можно сказать, что предсказание получилось довольно точным.

Источник — How to build a simple neural network in 9 lines of Python code.

Поначалу может показаться, что всё просто. Но если вы хотите освоить работу нейронных сетей на практике и всерьёз, стоит подумать о специализированных курсах. На них вы узнаете про нейронные сети гораздо больше, ведь простого чтения статей из интернета явно недостаточно. Вы разберёте нейросети прямого распространения, обратного распространения, скрытого слоя и т. д. и т. п., узнаете про функции потерь, функцию активации, обучение с подкреплением, ознакомитесь с другой важной информацией. Записаться на курс по нейронным сетям в качестве студента можно по ссылке ниже: https://otus.ru/lessons/deep-learning-engineer/.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться