Раздел помощи SpaceWeb

Нейросеть на Python

01 апр, 2024

Программа для создания нейросети: почему хорошим решением будет выбрать Python для программирования нейронных сетей.

Искусственный интеллект (ИИ) – одна из наиболее обсуждаемых технологий в мире. Даже люди далекие от сферы IT горячо спорят про перспективы использования нейросетей. И несмотря на то, что нет окончательного мнения в вопросе “представляет ли искусственный интеллект угрозу для человечества или нет”, по итогам 2022 года вложения в развитие прикладного искусственного интеллекта достигли  $104 млрд.[1] 

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

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

Что такое нейросеть простым языком? 

Нейросеть — это компьютерная программа, которая построена по аналогии с нашим мозгом. Она состоит из множества «нейронов», которые работают вместе, чтобы обрабатывать информацию. 

Нейроны моделируют работу нервных клеток в биологическом мозге. 
Вот как это происходит.

Каждый нейрон имеет несколько входов и один выход. Эти выходы соединены со входами других нейронов, и каждое соединение имеет свой вес. Веса определяют важность данных на каждом входе. 

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

Устройство нейросети

Нейросеть “видит” данные как векторы, представленные многомерными массивами. Это позволяет, с одной стороны, использовать инструменты линейной алгебры для ускорения вычислений, с другой — обрабатывать входные данные единообразно и не зависеть от размеров и форм.  

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

Структура нейросети строго определена следующими элементами: 

  • входной слой, 
  • скрытые слои (все промежуточные слои),
  • выходной слой,
  • набор весов и смещений между каждым слоем,
  • функция активации для каждого скрытого слоя.

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

Архитектура однослойной (один скрытый слой) нейросети выглядит так:


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

Пишем первую нейросеть на Python

Кстати, почему именно Python? 

  • Этот язык позволяет быстро создавать сложные алгоритмы.
  • Он прост в использовании, в том числе и для новичков, может быть интегрирован с кодом С и С++.
  • Python обладает высокой степенью модальности.
  • Возможно, в силу всех перечисленных факторов, он быстро «оброс» обширной экосистемой библиотек, где представлены готовые инструменты и модули для разработки нейросетей. 
  • К тому же, Python имеет большое и активное сообщество разработчиков в области машинного обучения и глубокого обучения. Так что и начинающий, и опытный пользователь справится с трудностями в написании нейросети. 

Итак, давайте решим такую задачу: разработать простую однослойную нейросеть для бинарной классификации (например, определение съедобности грибов по их характеристикам) на языке Python.

Этапы написания нейросети:

  1. Сначала мы импортируем библиотеку NumPy, которая предоставляет функционал для работы с массивами и матрицами, что сильно упрощает математические операции, необходимые для работы с неросетями. NumPy — это лишь один из возможных вариантов, но для начала он нам подходит.

 

  1. Затем мы определяем наборы входных ( input_data) и ожидаемых выходных данных (expected_output). В нашем примере, это может быть таблица характеристик грибов и метки «съедобен/несъедобен».

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


  1. Чтобы «научить» нейросеть правильно работать со входными данными, ей необходимо «объяснить», что некоторые входные значения более важны для принятия решения. Для этого каждому нейрону в сети задается вес и смещение. Веса определяют важность входящего параметра, а смещение позволяет изменять нейрону выход в зависимости от получаемых данных. Значения случайных весов и биасов будет корректироваться нейросетью в процессе обучения.
  2. Определяем функцию активации и ее производную. Функция активации задаёт, как нейрон реагирует на полученное значение. Благодаря ей нейрон может вычислить активацию, которая будет передана следующим слоям нейронов.

Такой функцией может выступать ReLU (Rectified Linear Unit). Она имеет вид f(x) = max(0, x) и позволяет нейрону передавать значение без изменений, если оно положительно, и обнулять отрицательное. Другой вид активации — гиперболический тангенс, который переводит вход в диапазон между -1 и 1.

Но чаще всего вы будете встречать другую функцию. 

Сигмода – функция, которая превращает большие отрицательные числа в числа, близкие к нулю, а большие положительные — к единице. 

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

В своем примере мы используем сигмоидную функцию активации и её производную, которые позволяют нейрону "активироваться" в зависимости от входных данных следующим образом:

  1. Метод обратного распространения ошибки как способ обучения нейросети. 

В этом шаге происходит обучение нейросети. Мы многократно прогоняем данные через сеть, рассчитываем ошибку и корректируем веса и биасы, чтобы свести вероятность ошибки к минимуму. Но как отследить изменение результата в зависимости от коррекции веса вводных данных? Чтобы ответить на этот вопрос, используем метод backpropagation или иначе —метод обратного распространения. 

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

И вот уже здесь используется метод backpropagation. Ошибка распространяется назад через сеть, и на каждом этапе вычисляются градиенты (производные) ошибки по отношению к весам и смещениям нейронов. Градиенты показывают, как веса и смещения влияют на ошибку. 

Итак, мы рассмотрели основные этапы создания простой нейросети на Python. И даже коснулись её математической базы.
В мире Python есть множество библиотек, таких как TensorFlow и PyTorch, которые сделают процесс создания нейросетей более простым и эффективны.
Важно помнить, что написание нейросети - это процесс, требующий терпения и практики. Начните с простых задач и постепенно двигайтесь к более сложным. Стремитесь к пониманию основных концепций, таких как веса, смещения, функции активации и обратное распространение ошибки. Это может стать вашим преимуществом, если вы поставили своей целью занять место в быстро развивающейся отрасли нейросетей.

_______________
[1] По данным исследования компании McKinsey, результаты которого обнародованы 20 июля 2023 года.