Обратное распространение ошибки — это метод обучения Нейронных сетей (Neural Networks), который используется для минимизации ошибки между предсказанными значениями и истинными значениями. Основная идея заключается в том, чтобы распространять ошибку от конечного слоя назад к начальным слоям сети, корректируя веса на каждом этапе. Этот процесс повторяется до тех пор, пока сеть не достигнет приемлемого уровня точности.
Давайте создадим простую нейронную сеть и реализуем алгоритм обратного распространения ошибки. Для примера возьмем двухслойную нейронную сеть с использованием библиотеки NumPy:
import numpy as np
Создадим функцию активации (sigmoid):
def sigmoid(x):
return 1 / (1 + np.exp(-x))
Определим производную функции активации (sigmoid)
def sigmoid_derivative(x):
return x * (1 - x)
Сгенерируем входные + выходные данные:
inputs = np.array([[0, 0],
[0, 1],
[1, 0],
[1, 1]])
outputs = np.array([[0], [1], [1], [0]])
Установим случайные веса:
np.random.seed(1)
weights_input_hidden = 2 * np.random.random((2, 3)) - 1
weights_hidden_output = 2 * np.random.random((3, 1)) - 1
Обучим нейросеть:
epochs = 10000
learning_rate = 0.1
for epoch in range(epochs):
# Прямое распространение
hidden_layer_input = np.dot(inputs, weights_input_hidden)
hidden_layer_output = sigmoid(hidden_layer_input)
output_layer_input = np.dot(hidden_layer_output, weights_hidden_output)
predicted_output = sigmoid(output_layer_input)
# Вычисление ошибки
error = outputs - predicted_output
# Обратное распространение ошибки
output_error = error * sigmoid_derivative(predicted_output)
hidden_layer_error = output_error.dot(weights_hidden_output.T) * sigmoid_derivative(hidden_layer_output)
# Обновление весов
weights_hidden_output += hidden_layer_output.T.dot(output_error) * learning_rate
weights_input_hidden += inputs.T.dot(hidden_layer_error) * learning_rate
Тестируем обученную сеть:
new_inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
predicted_output = sigmoid(np.dot(sigmoid(np.dot(new_inputs, weights_input_hidden)), weights_hidden_output))
print("Predicted Output after training:")
print(predicted_output)
Predicted Output after training: [[0.09081321] [0.9111173 ] [0.9121349 ] [0.5113526 ]]
Этот пример демонстрирует базовый принцип работы алгоритма обратного распространения ошибки. В реальных проектах использование библиотек, таких как TensorFlow или PyTorch, облегчает реализацию нейронных сетей и обратного распространения ошибки.
Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.
© Лена Капаца. Все права защищены.