Свёрточные нейронные сети: от основ до современных технологий

Привет, Хабр! Я подготовил для вас подробную статью о свёрточных нейронных сетях (Convolutional Neural Networks, CNN) — мощном инструменте машинного обучения, который изменил подход к обработке изображений. Моя цель — объяснить, как работают CNN, начиная с базовых понятий для новичков и заканчивая практическими примерами и сравнением с современными технологиями вроде Vision Transformers. Мы разберём их устройство, процесс обучения, популярные архитектуры и даже напишем код на Python. Давайте начнём!

1. Введение

Свёрточные нейронные сети (CNN) — это специализированный класс искусственных нейронных сетей, разработанный для задач, где важна пространственная структура данных, например, обработка изображений или видео. Впервые их идея была предложена Яном Лекуном в 1988 году, а широкую известность они получили после победы AlexNet в конкурсе ImageNet в 2012 году. CNN вдохновлены биологией: в зрительной коре мозга есть нейроны, реагирующие на локальные области, и эта концепция легла в основу их архитектуры.

Сегодня CNN применяются повсеместно: от распознавания лиц в смартфонах до анализа медицинских снимков и управления беспилотными автомобилями. В этой статье я расскажу, как они устроены, как обучаются и почему остаются актуальными даже с появлением новых подходов, таких как Transformers.

2. Основы нейронных сетей

Прежде чем погружаться в CNN, разберёмся с основами нейронных сетей. Этот раздел для тех, кто только начинает изучать машинное обучение — он поможет понять фундаментальные концепции.

2.1. Что такое нейронные сети?

Нейронные сети — это вычислительные модели, которые имитируют работу человеческого мозга. Они состоят из множества искусственных нейронов, соединённых между собой. Каждый нейрон принимает входные данные, обрабатывает их и передаёт результат дальше. Вместе они решают задачи, такие как классификация, регрессия или генерация данных.

Аналогия простая: представьте нейронную сеть как команду людей, где каждый выполняет свою маленькую задачу, а в итоге получается сложное решение.

Например, сеть может научиться отличать кошек от собак на фотографиях или распознавать рукописные цифры.

2.2. Искусственный нейрон

Искусственный нейрон — это базовый элемент сети. Он принимает несколько входных сигналов, каждый из которых умножается на вес — число, показывающее важность сигнала. Затем все взвешенные входы суммируются, добавляется смещение (bias), и результат пропускается через функцию активации.

Математически:

y = f\left(\sum_{i} (x_i \cdot w_i) + b\right)
  • x_i — входные данные (например, значения пикселей изображения).

  • w_i — веса (параметры, которые сеть подстраивает).

  • b — смещение (корректирующее значение).

  • f — функция активации, например, ReLU (f(x) = \max(0, x)), добавляющая нелинейность.

Пример: если сеть распознаёт кошку, один нейрон может «голосовать» за наличие ушей, другой — за шерсть, а веса определяют, что важнее.

2.3. Слои в нейронной сети

Нейроны группируются в слои:

  • Входной слой: принимает исходные данные (например, 784 нейрона для изображения 28×28 пикселей).

  • Скрытые слои: обрабатывают данные, извлекая признаки.

  • Выходной слой: выдаёт результат (например, 10 нейронов для классификации цифр от 0 до 9).

Чем больше скрытых слоёв, тем сложнее задачи может решать сеть — это называется «глубокое обучение».

2.4. Процесс обучения

Обучение — это настройка весов, чтобы сеть предсказывала правильные ответы. Процесс включает:

  1. Прямой проход: данные проходят через слои, и сеть делает предсказание.

  2. Вычисление ошибки: сравнение предсказания с реальным значением (например, с помощью функции потерь).

  3. Обратное распространение ошибки: корректировка весов с использованием градиентного спуска.

Аналогия: вы настраиваете радиоприёмник, крутя ручку (веса), пока не поймаете чёткий сигнал.

3. Свёрточные нейронные сети (CNN)

Теперь перейдём к CNN — специальной разновидности нейронных сетей, оптимизированной для изображений.

3.1. Почему обычные сети не подходят?

Полносвязные нейронные сети, где каждый нейрон соединён со всеми нейронами предыдущего слоя, плохо работают с изображениями. Для картинки 100×100 пикселей (10 000 входов) и скрытого слоя с 100 нейронами потребуется 1 миллион весов. Это не только медленно, но и не учитывает, что соседние пиксели связаны между собой (например, образуют края или текстуры). CNN решают эту проблему с помощью локальных операций.

3.2. Операция свёртки

Свёртка — это процесс, где небольшое ядро (фильтр) скользит по изображению и вычисляет новые значения, выделяя локальные признаки.

Математика свёртки

Для изображения I и ядра K размером m \times n:

(I * K)(x, y) = \sum_{i=0}^{m-1} \sum_{j=0}^{n-1} I(x+i, y+j) \cdot K(i, j)

Пример:

  • Изображение 5×5:

    1 2 3 4 5
    2 3 4 5 6
    3 4 5 6 7
    4 5 6 7 8
    5 6 7 8 9
    
  • Ядро 3×3 (для поиска вертикальных краёв):

    -1  0  1
    -1  0  1
    -1  0  1
    
  • Свёртка в позиции (1,1): (-1) \cdot 1 + 0 \cdot 2 + 1 \cdot 3 + (-1) \cdot 2 + 0 \cdot 3 + 1 \cdot 4 + (-1) \cdot 3 + 0 \cdot 4 + 1 \cdot 5 = -1 + 3 - 2 + 4 - 3 + 5 = 6.

Результат — карта признаков, где яркие области показывают вертикальные края.

Параметры

  • Размер ядра: обычно 3×3 или 5×5.

  • Шаг (stride): расстояние сдвига ядра (1 или 2).

  • Дополнение (padding): добавление нулей по краям (same padding — сохраняет размер, valid — уменьшает).

Визуализация свёртки

3.3. Компоненты CNN

CNN состоит из нескольких типов слоёв:

Свёрточный слой (Convolutional Layer)

  • Применяет несколько фильтров для извлечения признаков.

  • Выход — набор карт признаков.

Слой активации

  • Обычно ReLU (f(x) = \max(0, x)).

  • Добавляет нелинейность, улучшая способность сети учить сложные зависимости.

Слой субдискретизации (Pooling Layer)

  • Уменьшает размер карт признаков.

  • Max Pooling: берёт максимум в окне (например, 2×2).

  • Пример:

    4  3    ->  4
    2  1
    

Полносвязный слой (Fully Connected Layer)

  • «Вытягивает» карты признаков в вектор и выполняет классификацию.

4. Архитектура CNN

Архитектура CNN — это комбинация слоёв, оптимизированная для конкретных задач. Рассмотрим ключевые примеры.

4.1. LeNet-5 (1998)

  • Автор: Ян Лекун.

  • Задача: распознавание цифр (MNIST).

  • Структура: 2 свёрточных слоя, 2 пулинга, 3 полносвязных.

  • Значимость: первая успешная CNN.

4.2. AlexNet (2012)

  • Прорыв в ImageNet.

  • Инновации: глубокая структура (8 слоёв), ReLU, dropout (случайное отключение нейронов для регуляризации).

  • Структура: 5 свёрточных, 3 полносвязных.

4.3. VGG (2014)

  • Особенность: много слоёв с фильтрами 3×3.

  • Глубина: до 19 слоёв.

4.4. GoogleNet (Inception, 2014)

  • Инновация: модули Inception (параллельные свёртки).

  • Эффективность: высокая точность при меньшем числе параметров.

4.5. ResNet (2015)

  • Проблема: глубокие сети теряют точность из-за затухания градиента.

  • Решение: остаточные связи (y = x + F(x)).

  • Глубина: до 152 слоёв.

5. Обучение CNN

Обучение CNN похоже на обучение обычных сетей, но с учётом свёрточных операций.

5.1. Обратное распространение ошибки

  1. Прямой проход: вычисление выхода.

  2. Функция потерь (например, кросс-энтропия):

    L = -\frac{1}{N} \sum_{i=1}^{N} y_i \cdot \log(\hat{y}_i)

    Где y_i — истинный класс, \hat{y}_i — предсказание.

  3. Обратный проход: обновление весов.

5.2. Оптимизаторы

  • Adam: адаптивный алгоритм, популярный для CNN.

  • Роль: ускоряет минимизацию ошибки.

6. Преимущества и недостатки CNN

6.1. Преимущества

  • Эффективность для изображений.

  • Меньше параметров благодаря общим весам.

  • Автоматическое извлечение признаков.

6.2. Недостатки

  • Требуют больших данных.

  • Менее эффективны для неструктурированных данных (например, текста).

  • Высокая вычислительная сложность.

7. Связь с современными технологиями

CNN долгое время были стандартом в компьютерном зрении, но появились альтернативы.

7.1. Vision Transformers (ViT)

  • Год: 2020.

  • Идея: изображение делится на патчи, которые обрабатываются как последовательность с механизмом self-attention.

  • Преимущества: лучше масштабируются на больших данных.

  • Недостатки: требуют больше вычислений.

  • Подробнее: Vision Transformer Paper.

7.2. Комбинация подходов

Модели вроде ConViT объединяют свёртки и трансформеры для лучшего результата.

8. Практический пример

Давайте реализуем CNN для классификации одежды из датасета Fashion MNIST.

8.1. Код на Python с TensorFlow

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

# Загрузка данных
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.fashion_mnist.load_data()

# Предобработка
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255

# Создание модели
model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),  # Первый свёрточный слой
    layers.MaxPooling2D((2, 2)),                                           # Первый пулинг
    layers.Conv2D(64, (3, 3), activation='relu'),                          # Второй свёрточный слой
    layers.MaxPooling2D((2, 2)),                                           # Второй пулинг
    layers.Conv2D(64, (3, 3), activation='relu'),                          # Третий свёрточный слой
    layers.Flatten(),                                                      # Вытягивание в вектор
    layers.Dense(64, activation='relu'),                                   # Полносвязный слой
    layers.Dense(10, activation='softmax')                                 # Выходной слой
])

# Компиляция
model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy', 
              metrics=['accuracy'])

# Обучение
model.fit(train_images, train_labels, epochs=5, batch_size=64)

# Оценка
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Точность на тесте: {test_acc}')

8.2. Пояснения

  • Данные: 60 000 обучающих и 10 000 тестовых изображений 28×28.

  • Архитектура: 3 свёрточных слоя, 2 пулинга, 2 полносвязных.

  • Результат: точность ~90%.

9. Расширенные темы

9.1. Другие виды свёрток

  • Dilated Convolutions: разрежённые свёртки для увеличения поля зрения.

9.2. Рекомендации для изучения

  • Курс CS231n: CS231n.

  • Книга «Deep Learning» Яна Гудфеллоу.

10. Заключение

Свёрточные нейронные сети — это мощный инструмент, который произвёл революцию в компьютерном зрении. Они эффективно извлекают признаки из изображений, но требуют больших данных и вычислений. Vision Transformers бросают вызов CNN, но их сочетание открывает новые возможности.

Мы рассмотрели основы, архитектуры, обучение и написали код. Для наглядности рекомендую:

  • Свёртка

© Habrahabr.ru