Алгоритм обратного распространения ошибки (BackPropagation) - Лена Капаца
Алгоритм обратного распространения ошибки (BackPropagation) by Лена Капаца Dec. 7, 2023 Основы

Обратное распространение ошибки — это метод обучения Нейронных сетей (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, облегчает реализацию нейронных сетей и обратного распространения ошибки.

 

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

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