Какие знаешь архитектуры нейронных сетей?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие знаешь архитектуры нейронных сетей?
Введение
Архитектуры нейронных сетей — это фундамент глубокого обучения. За последние 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 | Последовательности | Медленно | Много | Высокая |
| Transformer | NLP, Vision | Средне | Много | Очень высокая |
| GNN | Графы | Средне | Средне | Растёт |
| Autoencoder | Unsupervised | Быстро | Средне | Средняя |
| GAN | Генерация | Медленно | Много | Высокая |
| CNN-RNN | Video, Text | Медленно | Много | Средняя |
Заключение
Для 2024+ года Трансформеры — это золотой стандарт для большинства задач. Однако, выбор архитектуры зависит от:
- Типа данных: таблица (MLP) → изображение (CNN) → текст (Transformer) → граф (GNN)
- Объёма данных: малый объём требует меньше параметров
- Требований к инференсу: мобильные устройства (MobileNet, DistilBERT) → облако (большие модели)
- Интерпретируемости: MLP проще объяснить, чем чёрный ящик трансформера
Опыт из 10+ лет показывает, что комбинирование архитектур часто даёт лучшие результаты.