Процесс обратного распространения заключается в том, чтобы передать эту ошибку обратно через сеть, корректируя веса каждого нейрона, чтобы в следующий раз ошибка была меньше. Это делается постепенно, слой за слоем, начиная с последнего (выходного) слоя и продвигаясь к входному. Цель этого процесса – минимизировать суммарную ошибку сети, заставляя её «учиться» лучше соответствовать эталонным данным.
Для понимания процесса обратного распространения ошибки и обучения сети создадим простую нейронную сеть с использованием библиотеки PyTorch. Эта сеть будет решать задачу бинарной классификации, предсказывая принадлежность к одному из двух классов.
Задача
Рассмотрим задачу, где мы классифицируем точки на плоскости в зависимости от их положения относительно заданной прямой. Наша цель – обучить нейронную сеть, которая сможет определить, в какой из двух классов (0 или 1) попадает каждая точка.
Решение с использованием обратного распространения и процесса обучения
В этом примере:
1. Мы создаем простую сеть с двумя полносвязными слоями.
2. Определяем функцию ошибки (Binary Cross Entropy).
3. Используем метод обратного распространения для корректировки весов сети на каждом этапе обучения.
Код решения
```python
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
# Генерация данных
np.random.seed(0)
torch.manual_seed(0)
data_size = 100
X = np.random.rand(data_size, 2) * 2 – 1 # точки на плоскости от -1 до 1
Y = (X[:, 0] + X[:, 1] > 0).astype(int) # класс 1, если сумма координат > 0, иначе 0
# Преобразование в тензоры
X_tensor = torch.FloatTensor(X)
Y_tensor = torch.FloatTensor(Y).reshape(-1, 1)
# Определение нейронной сети
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(2, 4) # первый полносвязный слой
self.fc2 = nn.Linear(4, 1) # выходной слой для предсказания класса
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.sigmoid(self.fc2(x))
return x
# Инициализация сети, функции потерь и оптимизатора
model = SimpleNet()
criterion = nn.BCELoss() # Binary Cross Entropy Loss
optimizer = optim.SGD(model.parameters(), lr=0.1)
# Обучение
epochs = 1000
losses = []
for epoch in range(epochs):
# Прямой проход
outputs = model(X_tensor)
loss = criterion(outputs, Y_tensor)