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

Что такое полносвязанная нейронная сеть?

2.0 Middle🔥 242 комментариев
#Глубокое обучение#Машинное обучение

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

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

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

Что такое полносвязанная нейронная сеть?

Полносвязанная нейронная сеть (Fully Connected Neural Network, Dense Neural Network, MLP — Multi-Layer Perceptron) — это архитектура искусственной нейронной сети, в которой каждый нейрон в одном слое связан со всеми нейронами в соседних слоях. Это самая простая и базовая архитектура глубокого обучения.

Структура полносвязанной сети

Входной слой (Input Layer)      Скрытые слои (Hidden Layers)    Выходной слой (Output Layer)
x₁ ━━━━━━━━━━━━━━━━━━━━━━━━━━┓
                               ├─→ h₁ ━━━━┓
x₂ ━━━━━━━━━━━━━━━━━━━━━━━━━━┤            ├─→ y₁
                               ├─→ h₂ ━━━━┤
x₃ ━━━━━━━━━━━━━━━━━━━━━━━━━━┛            ├─→ y₂
                               ┌─→ h₃ ━━━━┛
                               │
                               └─→ h₄

Каждый нейрон в слое l вычисляет:

z = Σ(w·x) + b
a = activation(z)

Математическая формула

Входной слой: a⁰ = X (размер: n₀ × m)
Скрытый слой 1: z¹ = W¹·a⁰ + b¹, a¹ = σ(z¹) (размер: n₁ × m)
Скрытый слой 2: z² = W²·a¹ + b², a² = σ(z²) (размер: n₂ × m)
Выходной слой: ŷ = W³·a² + b³ (размер: n_output × m)

где:
- W — матрица весов
- b — смещение (bias)
- σ — функция активации
- m — количество примеров

Реализация на Python (PyTorch)

import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# Загрузить данные
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# Стандартизировать
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Определить модель
class FullyConnectedNN(nn.Module):
    def __init__(self, input_size, hidden_sizes, output_size):
        super(FullyConnectedNN, self).__init__()
        layers = []
        prev_size = input_size
        
        # Скрытые слои
        for hidden_size in hidden_sizes:
            layers.append(nn.Linear(prev_size, hidden_size))
            layers.append(nn.ReLU())  # Функция активации
            layers.append(nn.Dropout(0.2))  # Регуляризация
            prev_size = hidden_size
        
        # Выходной слой
        layers.append(nn.Linear(prev_size, output_size))
        
        self.network = nn.Sequential(*layers)
    
    def forward(self, x):
        return self.network(x)

# Создать модель
model = FullyConnectedNN(
    input_size=4,
    hidden_sizes=[64, 32, 16],
    output_size=3
)

# Функция потерь и оптимизатор
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# Обучение
X_train_tensor = torch.FloatTensor(X_train)
y_train_tensor = torch.LongTensor(y_train)

train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

num_epochs = 100
for epoch in range(num_epochs):
    for X_batch, y_batch in train_loader:
        # Forward pass
        outputs = model(X_batch)
        loss = criterion(outputs, y_batch)
        
        # Backward pass
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
    if (epoch + 1) % 20 == 0:
        print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item():.4f}')

# Оценка
X_test_tensor = torch.FloatTensor(X_test)
y_test_tensor = torch.LongTensor(y_test)

with torch.no_grad():
    predictions = model(X_test_tensor)
    accuracy = (predictions.argmax(1) == y_test_tensor).float().mean()
    print(f'Accuracy: {accuracy:.4f}')

Реализация на TensorFlow/Keras

import tensorflow as tf
from tensorflow.keras import layers, models

# Модель
model = models.Sequential([
    layers.Input(shape=(4,)),
    layers.Dense(64, activation='relu'),
    layers.Dropout(0.2),
    layers.Dense(32, activation='relu'),
    layers.Dropout(0.2),
    layers.Dense(16, activation='relu'),
    layers.Dense(3, activation='softmax')  # Выходной слой
])

# Компилировать
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# Обучить
model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.2)

# Предсказать
y_pred = model.predict(X_test)

Функции активации

# ReLU (Rectified Linear Unit) — самая популярная
# Вывод: max(0, x)

# Sigmoid — для вероятностей
# Вывод: 1 / (1 + e^(-x)) → [0, 1]

# Tanh — улучшенный Sigmoid
# Вывод: (e^x - e^(-x)) / (e^x + e^(-x)) → [-1, 1]

# Softmax — для многоклассовой классификации
# Вывод: вероятности каждого класса, сумма = 1

Плюсы и минусы

Плюсы:

  • Просто реализовать и понять
  • Универсальные (могут аппроксимировать любую функцию)
  • Работают хорошо для табличных данных
  • Быстрое обучение на малых данных

Минусы:

  • Неэффективны для изображений (используй CNN вместо этого)
  • Не учитывают последовательность (используй RNN/Transformers для текста)
  • Много параметров → переобучение
  • Медленно для больших входов (28×28 = 784 нейрона)

Когда использовать полносвязанные сети

  • Табличные данные (структурированные признаки)
  • Классификация и регрессия
  • Рекомендательные системы
  • Прогнозирование временных рядов (с правильной подготовкой данных)