Нейросети: создание и оптимизация будущего - страница 15

Шрифт
Интервал


Градиентный спуск бывает нескольких типов:

– Обычный (batch) градиентный спуск: Он учитывает весь набор данных на каждом шаге и обновляет веса, основываясь на средней ошибке, что может быть вычислительно затратным.

– Стохастический градиентный спуск (SGD): Здесь обновление весов происходит на каждом отдельном примере, что делает обучение более быстрым, но с шумом, так как веса могут изменяться от случая к случаю.

– Мини-batch градиентный спуск: Здесь данные разделяются на небольшие группы (мини-батчи), на основе которых рассчитывается ошибка и корректируются веса, что позволяет использовать преимущества обоих методов.

Оптимизация параметров сети включает выбор скорости обучения и других гиперпараметров, таких как момент, чтобы корректировка весов происходила достаточно быстро, но без переборов. Существуют также адаптивные методы оптимизации, такие как Adam и RMSprop, которые динамически настраивают скорость обучения для каждого веса, учитывая историю изменений, что позволяет избежать проблем с оптимизацией и улучшает эффективность обучения.

Этот процесс позволяет сети с каждым шагом приближаться к решению задачи, становясь все более точной.


Примеры для разных типов градиентного спуска с использованием библиотеки PyTorch


Для каждого типа градиентного спуска мы решим простую задачу регрессии: предскажем значение (y) для каждого (x) по уравнению ( y = 2x + 3 ) с добавлением небольшого шума.


1. Обычный (Batch) Градиентный Спуск

В этом случае мы используем весь набор данных для вычисления средней ошибки на каждом этапе, после чего обновляем веса.

```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)

X = np.linspace(-1, 1, 100)

Y = 2 * X + 3 + 0.1 * np.random.randn(100)

# Преобразование в тензоры

X_tensor = torch.FloatTensor(X).view(-1, 1)

Y_tensor = torch.FloatTensor(Y).view(-1, 1)

# Простая линейная модель

model = nn.Linear(1, 1)

criterion = nn.MSELoss()

optimizer = optim.SGD(model.parameters(), lr=0.01)

# Обучение с использованием batch градиентного спуска

epochs = 1000

losses = []

for epoch in range(epochs):

optimizer.zero_grad()

predictions = model(X_tensor)

loss = criterion(predictions, Y_tensor)

loss.backward()

optimizer.step()

losses.append(loss.item())