PyTorch — это популярная библиотека для построения и обучения нейросетей. Она используется как в академии, так и в индустрии, потому что сочетает в себе мощь, гибкость и простоту.
В этом материале мы рассмотрим:
- Что такое тензоры и как с ними работать
- Как работает автодифференцирование
- Как писать собственные модели
- Как обучать модель шаг за шагом
1. Тензоры — сердце PyTorch
Тензор — это просто многомерный список чисел. Например:
- скаляр (одно число) — это 0D тензор,
- вектор (список) — это 1D тензор,
- таблица (матрица) — это 2D тензор,
- и дальше ввысь: 3D, 4D и т.д.
import torch
# Создание тензора из списка
x = torch.tensor([1.0, 2.0, 3.0])
# Операции
print(x + 1) # tensor([2., 3., 4.])
print(x * 2) # tensor([2., 4., 6.])
print(x.shape) # torch.Size([3])
# Работа с матрицами
A = torch.randn(2, 3)
B = torch.randn(3, 4)
C = A @ B # матричное умножение
Для работы на GPU:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
x = x.to(device)
2. Автоматическое дифференцирование (autograd)
Когда мы обучаем нейросеть, она должна понимать: в какую сторону и насколько нужно изменить свои параметры, чтобы улучшить результат? Для этого используется градиент — это просто число, показывающее насколько сильно изменение одного параметра влияет на ошибку модели.
PyTorch автоматически отслеживает операции с тензорами, у которых включён requires_grad=True
. Это позволяет вычислять градиенты — ключ к обучению модели.
x = torch.tensor(2.0, requires_grad=True)
y = x**2 + 3 * x # y = x^2 + 3x
y.backward() # dy/dx = 2x + 3 = 7
print(x.grad) # tensor(7.)
3. Создание модели (nn.Module)
Модель — это набор вычислений, которые мы применяем к данным, чтобы получить результат. В PyTorch модель описывается как класс, который наследуется от nn.Module
. Мы описываем, что внутри (слои), и как они работают (метод forward
).
import torch.nn as nn
class SimpleModel(nn.Module):
def __init__(self):
super().__init__()
self.linear1 = nn.Linear(10, 50)
self.relu = nn.ReLU()
self.linear2 = nn.Linear(50, 1)
def forward(self, x):
x = self.linear1(x)
x = self.relu(x)
return self.linear2(x)
model = SimpleModel()
4. Обучение модели (train loop)
Чтобы модель научилась делать правильные предсказания, мы сравниваем её ответы с правильными (из обучающих данных). Это сравнение называется функция потерь (loss function) — она говорит, насколько модель ошибается.
Чтобы модель стала лучше, мы находим градиенты ошибки по её параметрам и обновляем параметры в нужную сторону. Это и есть процесс обучения.
loss_fn = nn.MSELoss() # MSE = среднеквадратичная ошибка
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10):
model.train()
# вход и правильный ответ (тензоры)
x = torch.randn(32, 10)
y = torch.randn(32, 1)
pred = model(x) # прямой проход (forward)
loss = loss_fn(pred, y) # вычисляем ошибку (loss)
optimizer.zero_grad() # обнуляем старые градиенты
loss.backward() # вычисляем новые градиенты (backward)
optimizer.step() # обновляем параметры
print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")
5. Что дальше?
- Использовать
DataLoader
для работы с большими наборами данных - Добавить шаги проверки качества (validation, test)
- Перевести модель на GPU для ускорения
- Сохранять и загружать модель с помощью
torch.save()
/torch.load()
Вопросы, которые могут возникнуть
Зачем нужны градиенты? Чтобы знать, в какую сторону и на сколько изменить параметры модели, чтобы ошибка стала меньше.
Что такое forward и backward? forward
— прямой проход: модель считает предсказание. backward
— обратный проход: модель находит, где и насколько ошиблась.
Что делает оптимизатор? Он корректирует параметры модели на основе градиентов, чтобы уменьшить ошибку.
PyTorch — мощный и удобный инструмент, с которого приятно начинать. Главное — не бояться, практиковаться и шаг за шагом разбираться, что происходит под капотом.