Обратное распространение (англ. 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, Елена Капаца
© Лена Капаца. Все права защищены.