Архитектуры: 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. После пулинга — удваивается. Глубокие слои «видят» большие области → могут распознавать целые объекты, а не отдельные рёбра.

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: от 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+
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
Загрузка интерактивного виджета...
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-роадмапе
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
Middle
Senior
Собираем всё вместе
Каждая архитектура встраивает inductive bias под свой тип данных. CNN — locality и translation equivariance для изображений. RNN/LSTM — последовательная обработка и «память» для временных рядов. Transformer — attention для произвольных зависимостей. Современный тренд: трансформер как универсальная архитектура для всех модальностей (текст, изображения, аудио, код).
Знание архитектур на уровне «что, зачем, когда» — must have. ResNet и skip connections, LSTM и gates, self-attention — эти концепции спрашивают на каждом собеседовании по ML. Детальный разбор трансформеров — в NLP-треке.
Материалы
Подробный разбор CNN: свёртки, пулинг, stride, архитектуры от LeNet до ResNet.
Визуализация: как CNN видит изображения, что такое свёртка геометрически.
Лучшая визуализация LSTM: gates, cell state, информационный поток. Классика.
Визуальный гайд по трансформеру: self-attention, multi-head attention, positional encoding.