Нейросети: создание и оптимизация будущего - страница 7
Каждая функция активации помогает сети обрабатывать данные по-разному, обеспечивая подходящий баланс между скоростью, стабильностью обучения и интерпретируемостью вывода. Выбор функции зависит от сложности задачи, глубины сети и особенностей данных.
Обратное распространение ошибки и процесс обучения сети
Обратное распространение ошибки (backpropagation) – ключевой процесс, используемый для обучения нейронных сетей. Он начинается с того, что сеть выдает какой-то результат, который затем сравнивается с эталонным (правильным) значением. После этого сеть рассчитывает, насколько велика ошибка между предсказанием и реальным результатом.
Процесс обратного распространения заключается в том, чтобы передать эту ошибку обратно через сеть, корректируя веса каждого нейрона, чтобы в следующий раз ошибка была меньше. Это делается постепенно, слой за слоем, начиная с последнего (выходного) слоя и продвигаясь к входному. Цель этого процесса – минимизировать суммарную ошибку сети, заставляя её «учиться» лучше соответствовать эталонным данным.
Для понимания процесса обратного распространения ошибки и обучения сети создадим простую нейронную сеть с использованием библиотеки 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)
# Обратное распространение и оптимизация
optimizer.zero_grad() # очистка градиентов
loss.backward() # вычисление градиентов
optimizer.step() # обновление весов
losses.append(loss.item())
if (epoch+1) % 100 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
# График функции потерь
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Процесс обучения')
plt.show()
# Визуализация результатов