← Назад к вопросам

Какие знаешь архитектуры нейронных сетей?

2.3 Middle🔥 212 комментариев
#Глубокое обучение

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие знаешь архитектуры нейронных сетей?

Введение

Архитектуры нейронных сетей — это фундамент глубокого обучения. За последние 10 лет я видел эволюцию от классических MLP до современных трансформеров. Рассмотрю основные и наиболее важные архитектуры.

1. Полносвязная нейронная сеть (Multi-Layer Perceptron, MLP)

Описание: Самая простая архитектура с полносвязными слоями.

import torch
import torch.nn as nn

class MLP(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super().__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, hidden_size)
        self.fc3 = nn.Linear(hidden_size, output_size)
    
    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.relu(self.fc2(x))
        x = self.fc3(x)
        return x

Применение: Регрессия, классификация структурированных данных Сложность: O(n * m) где n — количество нейронов на слое

2. Сверточная нейронная сеть (CNN, Convolutional Neural Network)

Описание: Использует свёрточные слои для обработки изображений и пространственных данных. Основана на принципе локальной связанности и общей памяти весов.

class CNN(nn.Module):
    def __init__(self, num_classes=10):
        super().__init__()
        # Сверточные слои
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        
        # Pooling слои
        self.pool = nn.MaxPool2d(2, 2)
        
        # Полносвязные слои
        self.fc1 = nn.Linear(128 * 4 * 4, 256)
        self.fc2 = nn.Linear(256, num_classes)
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.5)
    
    def forward(self, x):
        # [N, 3, 32, 32] -> [N, 32, 32, 32]
        x = self.relu(self.conv1(x))
        x = self.pool(x)  # -> [N, 32, 16, 16]
        
        x = self.relu(self.conv2(x))  # -> [N, 64, 16, 16]
        x = self.pool(x)  # -> [N, 64, 8, 8]
        
        x = self.relu(self.conv3(x))  # -> [N, 128, 8, 8]
        x = self.pool(x)  # -> [N, 128, 4, 4]
        
        x = x.view(x.size(0), -1)  # Flatten
        x = self.relu(self.fc1(x))
        x = self.dropout(x)
        x = self.fc2(x)
        return x

Примеры: ResNet, VGG, EfficientNet, MobileNet Применение: Классификация изображений, детектирование объектов, сегментация

3. Рекуррентная нейронная сеть (RNN, LSTM, GRU)

Описание: Обрабатывает последовательности, сохраняя информацию в скрытом состоянии.

class RNNModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size, num_layers=2):
        super().__init__()
        # LSTM более эффективна, чем простой RNN
        self.lstm = nn.LSTM(
            input_size=input_size,
            hidden_size=hidden_size,
            num_layers=num_layers,
            batch_first=True,
            dropout=0.5 if num_layers > 1 else 0
        )
        self.fc = nn.Linear(hidden_size, output_size)
    
    def forward(self, x, hidden=None):
        # x: [batch_size, seq_len, input_size]
        lstm_out, (h_n, c_n) = self.lstm(x, hidden)
        # lstm_out: [batch_size, seq_len, hidden_size]
        
        # Берём последний выход последовательности
        last_out = lstm_out[:, -1, :]
        output = self.fc(last_out)
        return output

Примеры: Vanilla RNN, LSTM, GRU, Bidirectional RNN Применение: Машинный перевод, предсказание текста, анализ временных рядов

4. Трансформер (Transformer, Attention-based)

Описание: Революционная архитектура, основанная на механизме самовнимания. Полностью параллелизируемая, не требует рекурсии.

class TransformerModel(nn.Module):
    def __init__(self, vocab_size, d_model=512, nhead=8, num_layers=6, dim_feedforward=2048):
        super().__init__()
        
        self.embedding = nn.Embedding(vocab_size, d_model)
        self.positional_encoding = self._create_positional_encoding(d_model, max_len=512)
        
        # Encoder layers
        encoder_layer = nn.TransformerEncoderLayer(
            d_model=d_model,
            nhead=nhead,
            dim_feedforward=dim_feedforward,
            batch_first=True,
            dropout=0.1
        )
        self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)
        self.fc = nn.Linear(d_model, vocab_size)
    
    def _create_positional_encoding(self, d_model, max_len):
        pe = torch.zeros(max_len, d_model)
        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, d_model, 2).float() * 
                            (-torch.log(torch.tensor(10000.0)) / d_model))
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        return pe.unsqueeze(0)
    
    def forward(self, src, src_mask=None):
        x = self.embedding(src)
        x = x + self.positional_encoding[:, :x.size(1), :].to(x.device)
        x = self.transformer_encoder(x, src_key_padding_mask=src_mask)
        return self.fc(x)

Примеры: BERT, GPT, T5, Vision Transformer (ViT) Применение: NLP (машинный перевод, классификация текста), Computer Vision, Multimodal модели

5. Граф нейронная сеть (GNN, Graph Neural Network)

Описание: Обрабатывает график структуры данных, сохраняя связи между узлами.

import torch_geometric
from torch_geometric.nn import GCNConv

class GCN(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super().__init__()
        self.gc1 = GCNConv(input_dim, hidden_dim)
        self.gc2 = GCNConv(hidden_dim, output_dim)
        self.relu = nn.ReLU()
    
    def forward(self, x, edge_index):
        # x: [num_nodes, input_dim]
        # edge_index: [2, num_edges]
        x = self.relu(self.gc1(x, edge_index))
        x = self.gc2(x, edge_index)
        return x

Примеры: GCN, GraphSAGE, GAT (Graph Attention Networks) Применение: Рекомендации на социальных сетях, молекулярная химия, анализ сетей

6. Автоэнкодер (Autoencoder, VAE)

Описание: Неконтролируемый метод для обучения латентного представления.

class Autoencoder(nn.Module):
    def __init__(self, input_dim, latent_dim):
        super().__init__()
        # Кодер
        self.encoder = nn.Sequential(
            nn.Linear(input_dim, 256),
            nn.ReLU(),
            nn.Linear(256, 128),
            nn.ReLU(),
            nn.Linear(128, latent_dim)
        )
        
        # Декодер
        self.decoder = nn.Sequential(
            nn.Linear(latent_dim, 128),
            nn.ReLU(),
            nn.Linear(128, 256),
            nn.ReLU(),
            nn.Linear(256, input_dim),
            nn.Sigmoid()
        )
    
    def forward(self, x):
        latent = self.encoder(x)
        reconstructed = self.decoder(latent)
        return reconstructed, latent

# Вариационный автоэнкодер (VAE)
class VAE(nn.Module):
    def __init__(self, input_dim, latent_dim):
        super().__init__()
        self.encoder = nn.Sequential(
            nn.Linear(input_dim, 256),
            nn.ReLU(),
            nn.Linear(256, latent_dim * 2)  # mean и log_var
        )
        self.decoder = nn.Sequential(
            nn.Linear(latent_dim, 256),
            nn.ReLU(),
            nn.Linear(256, input_dim),
            nn.Sigmoid()
        )
    
    def encode(self, x):
        h = self.encoder(x)
        mean, log_var = h.chunk(2, dim=-1)
        return mean, log_var
    
    def reparameterize(self, mean, log_var):
        std = torch.exp(0.5 * log_var)
        eps = torch.randn_like(std)
        return mean + eps * std
    
    def forward(self, x):
        mean, log_var = self.encode(x)
        z = self.reparameterize(mean, log_var)
        recon = self.decoder(z)
        return recon, mean, log_var

Применение: Сжатие данных, генерация изображений, аномалия детектирование

7. Генеративная состязательная сеть (GAN)

Описание: Две сети конкурируют: генератор создаёт данные, дискриминатор их классифицирует.

class Generator(nn.Module):
    def __init__(self, latent_dim, output_dim):
        super().__init__()
        self.fc = nn.Sequential(
            nn.Linear(latent_dim, 256),
            nn.BatchNorm1d(256),
            nn.ReLU(),
            nn.Linear(256, 512),
            nn.BatchNorm1d(512),
            nn.ReLU(),
            nn.Linear(512, output_dim),
            nn.Tanh()
        )
    
    def forward(self, z):
        return self.fc(z)

class Discriminator(nn.Module):
    def __init__(self, input_dim):
        super().__init__()
        self.fc = nn.Sequential(
            nn.Linear(input_dim, 512),
            nn.LeakyReLU(0.2),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )
    
    def forward(self, x):
        return self.fc(x)

Примеры: DCGAN, StyleGAN, WGAN, CycleGAN Применение: Генерация изображений, style transfer, data augmentation

8. Рекуррентно-сверточная сеть (CNN-RNN)

Описание: Комбинирует CNN для обработки признаков и RNN для последовательности.

class CNNRNNModel(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        
        # CNN для обработки текста
        self.conv1d = nn.Conv1d(embedding_dim, 100, kernel_size=3, padding=1)
        
        # RNN для последовательности
        self.lstm = nn.LSTM(100, hidden_dim, batch_first=True)
        
        self.fc = nn.Linear(hidden_dim, vocab_size)
    
    def forward(self, x):
        x = self.embedding(x)  # [batch, seq_len, embed_dim]
        x = x.transpose(1, 2)  # [batch, embed_dim, seq_len] для Conv1d
        x = torch.relu(self.conv1d(x))  # [batch, 100, seq_len]
        x = x.transpose(1, 2)  # [batch, seq_len, 100] для LSTM
        
        _, (h_n, _) = self.lstm(x)
        return self.fc(h_n[-1])

9. Разреженная сеть (Sparse Network)

Описание: Много нулевых весов для экономии памяти и вычислений.

from torch.nn.utils.prune import l1_unstructured

class SparseNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(1000, 100)
    
    def forward(self, x):
        return self.fc(x)

# Применяем прунинг
model = SparseNetwork()
l1_unstructured(model.fc, name='weight', amount=0.9)  # 90% нулей

10. Нейронная сеть с ботлнеком (Bottleneck Architecture)

Описание: Сеть с узким местом в середине, используется для compression.

class BottleneckAutoencoder(nn.Module):
    def __init__(self):
        super().__init__()
        # Энкодер с сужением
        self.encoder = nn.Sequential(
            nn.Linear(784, 512),
            nn.ReLU(),
            nn.Linear(512, 128),
            nn.ReLU(),
            nn.Linear(128, 32)  # Узкое место
        )
        
        # Декодер с расширением
        self.decoder = nn.Sequential(
            nn.Linear(32, 128),
            nn.ReLU(),
            nn.Linear(128, 512),
            nn.ReLU(),
            nn.Linear(512, 784),
            nn.Sigmoid()
        )
    
    def forward(self, x):
        encoded = self.encoder(x)
        decoded = self.decoder(encoded)
        return decoded

Сравнение архитектур

АрхитектураПрименениеСкоростьПараметрыПопулярность
MLPТаблицированные данныеБыстроМалоБазовая
CNNИзображенияБыстроСреднеВысокая
RNN/LSTMПоследовательностиМедленноМногоВысокая
TransformerNLP, VisionСреднеМногоОчень высокая
GNNГрафыСреднеСреднеРастёт
AutoencoderUnsupervisedБыстроСреднеСредняя
GANГенерацияМедленноМногоВысокая
CNN-RNNVideo, TextМедленноМногоСредняя

Заключение

Для 2024+ года Трансформеры — это золотой стандарт для большинства задач. Однако, выбор архитектуры зависит от:

  • Типа данных: таблица (MLP) → изображение (CNN) → текст (Transformer) → граф (GNN)
  • Объёма данных: малый объём требует меньше параметров
  • Требований к инференсу: мобильные устройства (MobileNet, DistilBERT) → облако (большие модели)
  • Интерпретируемости: MLP проще объяснить, чем чёрный ящик трансформера

Опыт из 10+ лет показывает, что комбинирование архитектур часто даёт лучшие результаты.