Нейронные сети
May 17, 2021

Нейронные сети простым языком. Часть 2. Вычисление предсказания.

В прошлой статье мы узнали из чего состоит нейронная сеть, узнали о ее проблемах, а так же немного затронули историю ИНС.

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

Что такое прямое распространение?

Прямое распространение

Прямое распространение (forward propagate) – это процесс передачи входных значений в нейронную сеть и получения выходных данных, которые называются прогнозируемым значением. Когда входные значения передаются в первый слой нейронной сети, процесс проходит без каких-либо операций. Второй уровень сети принимает значения первого уровня, а после операций по умножению и активации передает значения далее. Тот же процесс происходит на более глубоких слоях.

Пускай у нашей нейронной сети будет 2 входных нейрона, 2 нейрона в скрытом слое и 1 выходной нейрон.

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

Для начала разберемся что означает каждая переменная.

Каждая цифра соответствует номеру нейрона в слое. X - входной нейрон, H (hidden) - нейрон скрытого слоя, O (output) - выходной нейрон, W (weights) - веса (синапсы).

Формула для вычисления слоя нейросети такая:

f(x) = (inputs * weights) + bias

f(x) - функция активации, bias - нейрон отклонения (смещения). Давайте разберемся что это такое.

Функция активации

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

Существует несколько функций активаций. Вот самые распространенные.

Функция ReLU

Сигмоидная функция

Функция гиперболического тангенса

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

Например, сигмоида хорошо показывает себя в задачах классификации.

Так же стоит отметить что у каждой функции активации своя производная (есть исключения). О производной в следующей статье.

Нейрон смещения

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

Это более понятно на картинке.

Без нейрона отклонения
С нейроном отклонения

Нейрон смещения обычно добавляется к каждому слою, кроме входного.

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

Для начала рассмотрим пошаговую реализацию для понимания алгоритма. Будем использовать сеть приведенную выше.

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

Теперь инициализируем параметры.

Вычисляем нейроны скрытого слоя.

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

Ответ сети: 0.7075

Этот метод не совсем корректен, так как при большом количестве параметров сети, код будет просто огромным, да и сам Python считается достаточно медленным, поэтому реализуем все на NumPy.

Что такое NumPy?

NumPy - это библиотека с открытым исходным кодом для языка программирования Python. Поддерживает многомерные массивы; высокоуровневые математических функций, предназначенных для работы с многомерными массивами и т. д.

Импортируем нужные нам функции, а так же создадим функцию сигмоиды.

Инициализируем параметры случайным образом.

random.randn(2, 2) - создает 2 ячейки по 2 случайных значения

random.randn(2, 1) - создает 1 ячейку по 2 случайных значения

В данном случае массивы с весами инициализируются таким образом - кол. нейронов входного слоя -> кол. нейронов скрытого слоя, кол. нейронов скрытого слоя -> кол. нейронов выходного слоя.

Вычисляем скрытый слой.

Вычисляем выходной слой.

Сгенерированные параметры:

weights_1 = [[1.76, 0.40], [0.99, 2.24]]
weights_2 = [[ 1.87], [-0.98]]
bias1 = 0.95

bias2 = -0.15

Ответ сети: 0.6951

Что такое dot() в NumPy?

Функция dot() выполняет произведение матриц. В нашем случае это требуется для вычисления слоев.

Что такое random.seed() для чего нужна эта функция, узнаете в следующей статье.

В следующей статье рассмотрим как обучить нейронную сеть.

Ссылки

https://ru.wikipedia.org/wiki/Нейронная_сеть#Нейронные_сети_прямого_распространения

https://proglib.io/p/neural-nets-guide