Метод обратного распространения ошибки (BackProp) - Лена Капаца
Метод обратного распространения ошибки (BackProp) by Лена Капаца April 23, 2023 Продвинуто

Обратное распространение (англ. Back Propagation) — это алгоритм, используемый для обучения Нейронных сетей (Neural Network) путем вычисления градиентов Функции потерь (Loss Function) по отношению к весам. Веса (Weights) — это значения, которые присваиваются каждому Признаку (Feature) и передают его важность при прогнозировании.

После итерации обучения входным данным в обратном направлении назначаются новые веса

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

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

import numpy as np

В этом примере мы определяем простую нейронную сеть с одним входным слоем, одним скрытым слоем и одним выходным слоем. Входной слой имеет три узла, скрытый слой — четыре узла, а выходной слой — один узел. Мы определяем входные данные X и выходные данные y.

X = np.array([[0, 0, 1],
              [0, 1, 1],
              [1, 0, 1],
              [1, 1, 1]])

y = np.array([[0],
              [1],
              [1],
              [0]])

Мы используем Сигмоиду (Sigmoid) для активации для обоих слоев. Функция активации (Activation Function) – это фрагмент программного кода, добавляемый в нейронную сеть, чтобы помочь ей изучить сложные закономерности данных.

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_derivative(x):
    return x * (1 - x)

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

Мы инициализируем веса сети, используя случайные значения от -1 до 1. Затем мы повторяем обучающие данные для указанного количества итераций.

learning_rate = 0.1
num_iterations = 10000

np.random.seed(1)
weights_0 = 2 * np.random.random((3, 4)) - 1
weights_1 = 2 * np.random.random((4, 1)) - 1

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

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

for i in range(num_iterations):

    layer_0 = X
    layer_1 = sigmoid(np.dot(layer_0, weights_0))
    layer_2 = sigmoid(np.dot(layer_1, weights_1))


    error = y - layer_2

    layer_2_delta = error * sigmoid_derivative(layer_2)
    layer_1_error = layer_2_delta.dot(weights_1.T)
    layer_1_delta = layer_1_error * sigmoid_derivative(layer_1)

    weights_1 += learning_rate * layer_1.T.dot(layer_2_delta)
    weights_0 += learning_rate * layer_0.T.dot(layer_1_delta)

print(layer_2)
[[0.03499461]
 [0.95478633]
 [0.96201778]
 [0.05337798]]

Обратное распространение ошибки — это мощный алгоритм для обучения нейронных сетей, но он может быть дорогостоящим для больших сетей и Датасетов (Dataset).

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

Авторы материала: chatGPT, Елена Капаца

Подари чашку кофе дата-сайентисту ↑

© Лена Капаца. Все права защищены.