В этой статье я буду использовать нейронную сеть для разделения нелинейно разделяемых данных (то есть вентиля XOR) с использованием библиотеки numpy.

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



Введение

Я буду делить эту статью на различные разделы, перечисленные ниже:

1-Обзор алгоритма

2-набор данных

3-Архитектура нейронной сети

4-Математика нейронной сети

5-реализация алгоритма Python

6-Визуализация и настройка гиперпараметров

Схема алгоритма-

Основные этапы обучения нейронной сети приведены ниже:

1-Случайная инициализация весов.

2-Итерация полных данных-

a) Feed Forward- вычисление выходных данных нейронной сети со случайно инициализированными весами и вычисление функции потерь между фактическим выходным и прогнозируемым выходными данными.

b) Обратное распространение — вычисление градиента функции потерь по отношению к весам и обновление весов с использованием градиентного спуска.

4-Повторяйте, пока потеря не станет минимальной.

Набор данных

Нейронные сети более полезны, когда набор данных нелинейно разделим и его нельзя разделить с помощью базовых методов, таких как линейная регрессия, логистическая регрессия и т. д. В этом случае мы будем использовать нелинейно разделяемый набор данных (XOR Gate) и покажем, как нейронные сети могут легко классифицировать этот набор данных, используя разработку признаков с помощью различных скрытых слоев.

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

Архитектура нашей модели-

Пробуя различные наборы архитектур, я обнаружил, что нейронная сеть с 1 скрытым слоем, содержащим 16 нейронов, сходится быстрее всего. Итак, для моей модели я буду использовать архитектуру, имеющую 2 входных нейрона в качестве функций, за которыми следует скрытый слой, содержащий 16 нейронов, за которым следует выходной слой. Дальше. Я буду использовать сигмовидную функцию активации со среднеквадратичной ошибкой потерь.

Математика нейронной сети

В этом разделе я буду математически выводить градиенты функции потерь по отношению к двум наборам весов: один между выходным и скрытым слоями (т. е. W1), а другой — между скрытым и входным слоями (т. е. W2). Для простоты расчета я будем учитывать смещения =0 для обоих слоев.

Уравнения прямой связи

Здесь z — результат скрытого слоя, а y — окончательный прогноз.

Уравнения обратного распространения

Сначала мы вычислим функцию стоимости. Мы будем использовать среднеквадратичную ошибку в качестве функции потерь для простоты расчетов.

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

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

Градиент функции стоимости относительно W2

Это можно рассматривать как цепное правило. Для вычисления градиента по отношению к W2 можно записать как градиент функции стоимости по отношению к выпуску (y), умноженный на градиент y по отношению к W2. Математические уравнения показаны ниже в пошаговом порядке:

Градиент функции стоимости относительно W1

Это также можно рассматривать как цепное правило. Для вычисления градиента относительно W1 можно записать как градиент функции стоимости относительно выхода (y), умноженный на градиент y относительно z, умноженный на градиент z относительно W1. Математические уравнения показаны ниже в пошаговом порядке:

Реализация Python-

Используя уравнения, полученные в предыдущем разделе. Теперь мы реализуем их на python, используя библиотеку numpy. В нашем случае мы будем запускать алгоритм на 10000 итераций с тремя разными значениями скорости обучения: 0,01, 0,1 и 1.

Вывод с эпохами = 10 000 и скоростью обучения = 0,1 выглядит следующим образом:

Визуализация и настройка гиперпараметров

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

Основываясь на трех значениях скорости обучения, мы видим, что скорость обучения = 1 сходится быстрее всего. Следовательно, для нашей модели наилучшее значение скорости обучения для 10000 эпох будет равно 1.

Спасибо за чтение!

Если вам нравится моя работа и вы хотите поддержать меня. ЛУЧШИЙ способ поддержать меня — подписаться на меня на Medium.