Использование базового Python для реализации простой нейронной сети с нуля

Добро пожаловать в Deep Learning with PyTorch Part # 4! Если вы новичок, не стесняйтесь взглянуть на предыдущие части. Все предыдущие части находятся на моей странице Medium. В качестве напоминания в прошлой статье я рассмотрел математику упреждающей связи. Feed-Forward - одна из фундаментальных концепций нейронных сетей. Прямая связь - это процесс, в котором ваша нейронная сеть принимает ваши входные данные, пропускает их через скрытые слои и выплевывает выходные данные.

В этой статье я подробно расскажу о реализации прямой связи в Python. Весь код, представленный в этой статье, можно найти на моей странице Github в этом репозитории. Я приложил все усилия, чтобы тщательно прокомментировать код, чтобы вы понимали, что происходит на каждом этапе. Я настоятельно рекомендую вам взять образец кода и поэкспериментировать с ним. В конце концов, когда дело доходит до кодирования, вы учитесь так же, как и делаете. Без лишних слов, приступим к работе!

Базовая настройка

Прежде чем мы перейдем прямо к коду, очень, очень важно убедиться, что наша среда настроена правильно. Редактор, который вы используете, действительно зависит от вас. Я настоятельно рекомендую вам скачать Платформу Anaconda. Это связано с тем, что вы автоматически установите все основные инструменты Data Science, такие как Jupyter Notebook, sklearn и т. Д. Если вы решите не загружать Anaconda, убедитесь, что у вас установлена ​​библиотека NumPy. Это можно сделать, набрав следующую команду:

  • pip установить NumPy

Честно предупреждаю, в этом руководстве я предполагаю, что у вас есть базовые знания Python и знания о концепциях объектно-ориентированного программирования (ООП).

Код

Архитектура нейронной сети, которую мы будем строить, будет простой трехслойной нейронной сетью. Рисунок 1 дает визуальное представление об архитектуре такой нейронной сети.

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

Вы могли заметить, что архитектура нейронной сети относительно проста. Основная причина этого в том, что я хочу дать вам простое, но конкретное понимание того, как работает прямая связь в нейронных сетях. Если мы реализуем более сложную архитектуру со многими-многими скрытыми слоями, я гарантирую, что ваш мозг будет полностью перегружен после реализации ее с нуля. Кроме того, нейронная сеть, которую мы будем внедрять, скорее всего, не будет хорошо работать с наборами данных. На это есть 2 причины:

  • Нейронная сеть еще не обучена. Я расскажу об обучающем аспекте нейронных сетей в следующей статье.
  • Это слишком просто. Крайне редко можно встретить проблему, которую можно решить с помощью этой архитектуры нейронной сети. Я знаю, что нет ничего невозможного, но эта ситуация была бы очень и очень близка к этому.

Вот полный код:

Этого кода очень много, поэтому давайте рассмотрим его. Если вы обратите внимание на нижнюю часть рисунка 2, вы увидите, что я реализовал сигмовидную функцию. Как я уже упоминал выше, эта функция будет служить функцией активации нейронной сети. Если вы не знакомы с функцией активации сигмовидной кишки, на рисунке 3 представлено ее математическое представление.

Более того, рисунок 4 показывает его графическое представление.

Как вы можете видеть на рисунке 4, сигмовидная функция гордится сжатием значений между 0 и 1. Если вы знакомы с классическим машинным обучением, вы можете распознать это как логистическую регрессию.

Достаточно о сигмовидной функции, давайте обратим внимание на прямую функцию, которая является ядром этого кода. В функции пересылки вы можете увидеть, как я помещаю ввод X через скрытые слои и слой вывода. Другими словами, я выполняю фазу прямой связи нейронной сети. Как мы обсуждали в предыдущих статьях, прямая связь - это, по сути, множество умножений матриц. Это видно в коде. Как видите, я сначала объединяю матрицы смещения и ввода в одну матрицу. Затем я умножаю эту матрицу на веса с помощью умножения матриц. Я повторяю эти шаги как для скрытого, так и для выходного слоя. Единственная разница между двумя слоями состоит в том, что я применил функцию активации сигмоида к выходам скрытого слоя. Я не применил сигмовидную функцию к выходному слою для простоты; однако бывают случаи, когда вы хотите применить функцию активации к выходному слою. Например, вы можете захотеть получить вероятности в качестве выходных данных, поэтому вы можете применить функцию softmax activation к своему выходному слою.

Последнее, что я хотел бы отметить, - это объявление весов и смещений в конструкторе (функция __init__). Как видите, я установил веса на случайные числа. Здесь важно отметить, что всякий раз, когда вы создаете нейронную сеть, вы всегда всегда начинаете со случайными весами. Это связано с тем, что если мы установим каждый вес, например, равным 0, то обратное распространение может иметь проблемы с обновлением весов и так далее. Чтобы не ввязываться в эту неразбериху, мы устанавливаем веса случайным образом. Кроме того, вы также можете заметить, что я установил смещения равными 1. Обычно смещения в нейронной сети имеют значение 1.

Зачем использовать фреймворки?

Я хотел бы завершить эту статью, обсудив, почему мы используем фреймворки глубокого обучения, когда мы могли бы просто реализовать нейронные сети с нуля. Честно говоря, на этот вопрос есть очень простой ответ: для нас было бы слишком сложно реализовать очень глубокую нейронную сеть (например, 100+ скрытых слоев) с нуля. Кроме того, математика, лежащая в основе очень глубокой нейронной сети, может буквально взорвать ваш мозг. Такие фреймворки, как PyTorch и Tensorflow, делают за нас всю тяжелую работу. Они позволяют очень просто и легко создавать нейронные сети. Все, что нам нужно сделать, это определить нашу архитектуру, функцию потерь и многое другое. Зачем нам «изобретать колесо заново»?

Закрытие

Спасибо, если вы дочитали до конца этой статьи. Ваша поддержка как читателя действительно мотивирует меня создавать более значимый контент. Надеюсь, вы узнали кое-что о реализации прямой связи с нуля. Как всегда, если у вас есть какие-либо вопросы, не стесняйтесь оставлять их в комментариях ниже. Если у вас есть какие-либо отзывы, дайте мне знать в комментариях ниже или в личном комментарии к этой статье. Если вы заинтересованы в контакте, не стесняйтесь связаться со мной в LinkedIn. До следующего раза! Наслаждайтесь глубоким обучением!