Глубина
~25 мин

Архитектуры: CNN, RNN, Transformer

Обзор семейств нейросетей — свёрточные, рекуррентные, трансформеры. Зачем каждое и где применяется.

Архитектуры нейросетей — CNN, RNN и трансформеры

MLP — это универсальный аппроксиматор, но на практике он неэффективен для структурированных данных. Картинка 224×224×3 — это 150 тысяч входов. Если скрытый слой 1024 нейрона, то первый слой MLP = 150M параметров. Это слишком много: модель переобучается, медленно считается и не учитывает пространственную структуру (соседние пиксели связаны, но MLP этого не знает).

Разные типы данных требуют разных inductive biases (архитектурных допущений): • Изображения — пространственная локальность, трансляционная инвариантность → CNN. • Последовательности (текст, аудио, временные ряды) — порядок элементов важен, нужна «память» → RNN/LSTM/GRU. • Произвольные зависимости — любой элемент может зависеть от любого → Transformer. В этой ноде — обзор ключевых архитектур на уровне понимания «что, зачем и когда». Углубляться в трансформеры будем в NLP-треке.

CNN — свёрточные нейросети для изображений

Свёртка (convolution) — главная идея CNN. Вместо того чтобы соединять каждый пиксель с каждым нейроном (как в MLP), мы скользим маленьким фильтром (ядром, обычно 3×3) по изображению и вычисляем скалярное произведение фильтра с каждым патчем. Один фильтр = один выученный паттерн (ребро, текстура, угол). Множество фильтров = множество паттернов.

Ключевые параметры свёртки:Kernel size — размер фильтра (3×3 — стандарт). Определяет, какой «кусочек» изображения видит фильтр. • Stride — шаг сдвига фильтра. Stride=1 — скользим по 1 пикселю. Stride=2 — уменьшаем пространственное разрешение вдвое (альтернатива пулингу). • Padding — дополнение нулями по краям, чтобы выход сохранил размер входа. padding=1 при kernel=3 → same size. • Channels — фильтр работает по всем каналам входа (3 для RGB), выходных каналов = число фильтров.

Pooling (субдискретизация) — уменьшает пространственное разрешение. Max pooling 2×2 берёт максимум из окна 2×2 — размер уменьшается вдвое. Зачем: уменьшает число параметров, увеличивает receptive field (область входа, которую «видит» нейрон), даёт частичную инвариантность к малым сдвигам. В современных архитектурах pooling заменяют на stride=2 в свёртке.

Receptive field — это область входного изображения, которая влияет на конкретный нейрон. После первой свёртки 3×3 — receptive field = 3×3. После двух — 5×5. После пулинга — удваивается. Глубокие слои «видят» большие области → могут распознавать целые объекты, а не отдельные рёбра.

Архитектура CNN: свёртки → пулинг → полносвязный слой
Типичная CNN: чередование свёрток (извлечение признаков) и пулинга (уменьшение размера), финальный полносвязный слой для классификации
import torch
import torch.nn as nn

class SimpleCNN(nn.Module):
    """CNN для классификации изображений 32×32 (CIFAR-10)."""
    def __init__(self, num_classes: int = 10):
        super().__init__()
        self.features = nn.Sequential(
            # Block 1: 3×32×32 → 32×16×16
            nn.Conv2d(3, 32, kernel_size=3, padding=1),   # 3→32 фильтров
            nn.BatchNorm2d(32),
            nn.ReLU(),
            nn.MaxPool2d(2),                               # 32×32 → 16×16

            # Block 2: 32×16×16 → 64×8×8
            nn.Conv2d(32, 64, kernel_size=3, padding=1),   # 32→64 фильтров
            nn.BatchNorm2d(64),
            nn.ReLU(),
            nn.MaxPool2d(2),                               # 16×16 → 8×8

            # Block 3: 64×8×8 → 128×4×4
            nn.Conv2d(64, 128, kernel_size=3, padding=1),
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.MaxPool2d(2),                               # 8×8 → 4×4
        )
        self.classifier = nn.Sequential(
            nn.Flatten(),                                  # 128×4×4 = 2048
            nn.Linear(128 * 4 * 4, 256),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(256, num_classes),
        )

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x = self.features(x)
        return self.classifier(x)

model = SimpleCNN()
print(f"Параметров: {sum(p.numel() for p in model.parameters()):,}")
# → ~640K — в 200 раз меньше, чем MLP для тех же изображений!
CNN: свёрточные фильтры извлекают признаки из входных данных
CNN forward pass: tensor shapes на каждом слое — Input [1,3,32,32] → Conv → Pool → ... → Output [1,10]

Загрузка интерактивного виджета...

Эволюция CNN: от LeNet к EfficientNet

LeNet-5 (LeCun, 1998) — первая практическая CNN. 2 свёртки + 2 пулинга + 3 полносвязных слоя. 60K параметров. Распознавала рукописные цифры на почтовых конвертах. Доказала, что свёрточные сети работают.

AlexNet (2012) — прорыв на ImageNet. По сути, масштабированный LeNet: 5 свёрток, ReLU вместо sigmoid, Dropout, обучение на GPU. Победа в ImageNet 2012 запустила революцию глубокого обучения.

VGGNet (2014) — простая идея: стек 3×3 свёрток. Две 3×3 свёртки = receptive field 5×5, но меньше параметров и больше нелинейностей. VGG-16 (138M параметров) — baseline для многих задач.

ResNet (He et al., 2015) — революция. Ключевая идея: skip connections (residual connections). Вместо y = F(x) учим y = F(x) + x. Если F(x) = 0, получаем identity — слой «не мешает». Это решило vanishing gradients и позволило обучать сети глубиной 50, 101, даже 1000+ слоёв. ResNet-50 — стандартный backbone для computer vision и по сей день.

EfficientNet (Tan & Le, 2019) — оптимальное масштабирование ширины, глубины и разрешения через compound scaling. EfficientNet-B0 даёт точность ResNet-50 при 8× меньшем числе параметров. Серия B0→B7 для разного бюджета compute.

Что использовать в 2024+

Для computer vision: ResNet-50 (baseline, всегда работает), EfficientNet-V2 (точность/скорость tradeoff), ConvNeXt (модернизированный ResNet с трюками из трансформеров). Для SOTA: ViT (Vision Transformer) + pretrain на больших данных. Начинай с pretrained модели из torchvision или timm — не обучай CNN с нуля.

RNN — рекуррентные нейросети для последовательностей

MLP и CNN обрабатывают вход целиком — фиксированный размер. Но текст, аудио, временные ряды — это последовательности переменной длины, где порядок критичен. RNN (Recurrent Neural Network) обрабатывает элементы по одному, передавая скрытое состояние (hidden state) от шага к шагу — это «память» сети о прошлом.

Vanilla RNN: на каждом шаге t скрытое состояние hₜ зависит от текущего входа xₜ и предыдущего состояния hₜ₋₁.

Проблема vanilla RNN — long-term dependencies. При backprop через T шагов градиент умножается на Wₕₕ T раз. Если спектральный радиус Wₕₕ < 1 → vanishing, если > 1 → exploding. На практике RNN «забывает» всё, что было 10-20 шагов назад.

LSTM (Long Short-Term Memory, Hochreiter & Schmidhuber, 1997) решает эту проблему через gates (вентили): • Forget gate — что забыть из предыдущей памяти (sigmoid → [0,1]) • Input gate — что добавить в память • Output gate — что показать на выходе • Cell state — «магистраль», по которой информация течёт без изменений (аналог skip connection в ResNet) LSTM может хранить информацию сотни шагов. GRU (Gated Recurrent Unit) — упрощённая версия LSTM: 2 гейта вместо 3, меньше параметров, сопоставимая точность.

RNN в 2024

Для большинства задач NLP RNN заменены трансформерами. Но RNN/LSTM остаются актуальны: (1) временные ряды с ограниченным контекстом, (2) edge-устройства (маленький footprint), (3) online processing (поток данных, нельзя ждать полную последовательность). Также на собеседованиях RNN спрашивают стабильно — фундаментальная тема.
RNN развёрнутая по времени: один модуль обрабатывает последовательность шаг за шагом
RNN forward pass с tensor shapes: Input [B,D] → RNN cell → Hidden [B,H] → Output [B,H]

Загрузка интерактивного виджета...

LSTM cell: forget gate, input gate, output gate — управление памятью

Transformer — архитектура, которая изменила всё

Transformer (Vaswani et al., «Attention Is All You Need», 2017) отказался от рекуррентности и свёрток. Ключевой механизм — self-attention: каждый элемент последовательности «смотрит» на все остальные элементы и вычисляет взвешенную сумму. Это позволяет моделировать зависимости на любом расстоянии без проблемы vanishing gradients. Вычисления полностью параллельны (в отличие от RNN, где шаги последовательны), что радикально ускоряет обучение на GPU.

На основе трансформера построены все современные модели: BERT (encoder), GPT (decoder), T5 (encoder-decoder), LLaMA, Claude. Трансформеры захватили NLP, а потом распространились на computer vision (ViT), аудио (Whisper), белки (AlphaFold 2), код (Codex) — практически все домены.

📚 Deep dive — в NLP-роадмапе

Self-attention, multi-head attention, positional encoding, архитектура encoder/decoder — всё это подробно разбирается в NLP-треке. Здесь достаточно понять главное: трансформер заменил RNN благодаря параллелизму и способности моделировать дальние зависимости через attention.

ViT — трансформер для изображений

Vision Transformer (ViT) (Dosovitskiy et al., 2020) применил трансформер к изображениям. Идея проста: разрезать изображение на патчи (16×16 пикселей), «развернуть» каждый патч в вектор (аналог токена в NLP), добавить positional embedding и подать в стандартный трансформер-энкодер. Никаких свёрток.

Почему ViT работает: на больших данных (ImageNet-21k, JFT-300M) ViT превосходит CNN. У трансформера нет inductive bias про локальность (в отличие от CNN), поэтому ему нужно больше данных для обучения, но зато он более гибкий. На маленьких датасетах CNN всё ещё побеждает. На практике: бери pretrained ViT (из timm или transformers) и дообучай на своей задаче. Обучать ViT с нуля на своих данных — дорого и бессмысленно без миллионов картинок.

Когда какую архитектуру выбрать

  • Табличные данные → MLP (или gradient boosting — часто лучше нейросетей на табличке)
  • Изображения (мало данных) → CNN (ResNet-50, EfficientNet) с pretrained весами
  • Изображения (много данных) → ViT или ConvNeXt с pretrained весами
  • Текст, NLP → Transformer (BERT, GPT, LLaMA) — безальтернативно
  • Временные ряды → LSTM/GRU (короткие ряды), Transformer (длинные ряды), или specialized архитектуры (TFT, PatchTST)
  • Аудио → CNN (спектрограмма как изображение) или Transformer (Whisper, HuBERT)
  • Мультимодальные задачи → Transformer (CLIP, Flamingo) — единая архитектура для разных модальностей

🎯 На собеседовании

Junior

Чем CNN лучше MLP для изображений? Weight sharing (один фильтр на всё изображение → меньше параметров), locality (фильтр смотрит на соседние пиксели), translation equivariance (кот в углу и в центре детектируются одним фильтром). • Что такое stride и pooling? Stride — шаг свёртки (stride=2 уменьшает размер вдвое). Pooling — агрегация (max/avg) по окну, тоже уменьшает размер. • RNN vs MLP — в чём разница? RNN обрабатывает последовательность шаг за шагом, передавая hidden state. MLP обрабатывает весь вход разом, без понятия порядка.

Middle

Что такое residual connection и зачем? y = F(x) + x — skip connection. Решает vanishing gradients (градиент имеет путь, минующий нелинейности). Позволяет обучать сети 100+ слоёв. • LSTM vs vanilla RNN? LSTM добавляет cell state и gates (forget, input, output). Cell state — «магистраль» без нелинейностей, через которую градиент не затухает. Vanilla RNN забывает через 10-20 шагов, LSTM — сотни. • Почему трансформер заменил RNN? (1) Параллелизм: все позиции обрабатываются одновременно. (2) Attention напрямую связывает любые два токена — нет проблемы дальних зависимостей. (3) Масштабируется лучше с ростом compute.

Senior

Receptive field — как посчитать? RF растёт с глубиной: после L слоёв 3×3 свёрток RF = 2L+1. Pooling/stride удваивают RF. Dilated convolutions увеличивают RF без потери разрешения. • ViT vs CNN — tradeoffs? ViT не имеет inductive bias → нужно больше данных, но более гибкий. CNN имеет locality + translation equivariance → работает лучше на маленьких датасетах. ConvNeXt показал, что CNN с современными трюками конкурирует с ViT. • Что такое compound scaling (EfficientNet)? Одновременное масштабирование ширины (число каналов), глубины (число слоёв) и разрешения входа с фиксированным коэффициентом. Более эффективно, чем масштабировать одно измерение.

Собираем всё вместе

Каждая архитектура встраивает inductive bias под свой тип данных. CNN — locality и translation equivariance для изображений. RNN/LSTM — последовательная обработка и «память» для временных рядов. Transformer — attention для произвольных зависимостей. Современный тренд: трансформер как универсальная архитектура для всех модальностей (текст, изображения, аудио, код).

Знание архитектур на уровне «что, зачем, когда» — must have. ResNet и skip connections, LSTM и gates, self-attention — эти концепции спрашивают на каждом собеседовании по ML. Детальный разбор трансформеров — в NLP-треке.