PyTorch: Пошаговое введение

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 — мощный и удобный инструмент, с которого приятно начинать. Главное — не бояться, практиковаться и шаг за шагом разбираться, что происходит под капотом.