Я подготовил для вас подробную статью о свёрточных нейронных сетях (Convolutional Neural Networks, CNN) — мощном инструменте машинного обучения, который изменил подход к обработке изображений. Моя цель — объяснить, как работают CNN, начиная с базовых понятий для новичков и заканчивая практическими примерами и сравнением с современными технологиями вроде Vision Transformers. Мы разберём их устройство, процесс обучения, популярные архитектуры и даже напишем код на Python. Давайте начнём!
1. Введение
Свёрточные нейронные сети (CNN) — это специализированный класс искусственных нейронных сетей, разработанный для задач, где важна пространственная структура данных, например, обработка изображений или видео. Впервые их идея была предложена Яном Лекуном в 1988 году, а широкую известность они получили после победы AlexNet в конкурсе ImageNet в 2012 году. CNN вдохновлены биологией: в зрительной коре мозга есть нейроны, реагирующие на локальные области, и эта концепция легла в основу их архитектуры.
Сегодня CNN применяются повсеместно: от распознавания лиц в смартфонах до анализа медицинских снимков и управления беспилотными автомобилями. В этой статье я расскажу, как они устроены, как обучаются и почему остаются актуальными даже с появлением новых подходов, таких как Transformers.
2. Основы нейронных сетей
Прежде чем погружаться в CNN, разберёмся с основами нейронных сетей. Этот раздел для тех, кто только начинает изучать машинное обучение — он поможет понять фундаментальные концепции.
2.1. Что такое нейронные сети?
Нейронные сети — это вычислительные модели, которые имитируют работу человеческого мозга. Они состоят из множества искусственных нейронов, соединённых между собой. Каждый нейрон принимает входные данные, обрабатывает их и передаёт результат дальше. Вместе они решают задачи, такие как классификация, регрессия или генерация данных.
Аналогия простая: представьте нейронную сеть как команду людей, где каждый выполняет свою маленькую задачу, а в итоге получается сложное решение.
Например, сеть может научиться отличать кошек от собак на фотографиях или распознавать рукописные цифры.
2.2. Искусственный нейрон
Искусственный нейрон — это базовый элемент сети. Он принимает несколько входных сигналов, каждый из которых умножается на вес — число, показывающее важность сигнала. Затем все взвешенные входы суммируются, добавляется смещение (bias), и результат пропускается через функцию активации.
-
— входные данные (например, значения пикселей изображения).
-
— веса (параметры, которые сеть подстраивает).
-
— смещение (корректирующее значение).
-
— функция активации, например, ReLU (
), добавляющая нелинейность.
Пример: если сеть распознаёт кошку, один нейрон может “голосовать” за наличие ушей, другой — за шерсть, а веса определяют, что важнее.
2.3. Слои в нейронной сети
Нейроны группируются в слои:
-
Входной слой: принимает исходные данные (например, 784 нейрона для изображения 28×28 пикселей).
-
Скрытые слои: обрабатывают данные, извлекая признаки.
-
Выходной слой: выдаёт результат (например, 10 нейронов для классификации цифр от 0 до 9).
Чем больше скрытых слоёв, тем сложнее задачи может решать сеть — это называется “глубокое обучение”.
2.4. Процесс обучения
Обучение — это настройка весов, чтобы сеть предсказывала правильные ответы. Процесс включает:
-
Прямой проход: данные проходят через слои, и сеть делает предсказание.
-
Вычисление ошибки: сравнение предсказания с реальным значением (например, с помощью функции потерь).
-
Обратное распространение ошибки: корректировка весов с использованием градиентного спуска.
Аналогия: вы настраиваете радиоприёмник, крутя ручку (веса), пока не поймаете чёткий сигнал.
3. Свёрточные нейронные сети (CNN)
Теперь перейдём к CNN — специальной разновидности нейронных сетей, оптимизированной для изображений.
3.1. Почему обычные сети не подходят?
Полносвязные нейронные сети, где каждый нейрон соединён со всеми нейронами предыдущего слоя, плохо работают с изображениями. Для картинки 100×100 пикселей (10 000 входов) и скрытого слоя с 100 нейронами потребуется 1 миллион весов. Это не только медленно, но и не учитывает, что соседние пиксели связаны между собой (например, образуют края или текстуры). CNN решают эту проблему с помощью локальных операций.
3.2. Операция свёртки
Свёртка — это процесс, где небольшое ядро (фильтр) скользит по изображению и вычисляет новые значения, выделяя локальные признаки.
Математика свёртки
Для изображения и ядра
размером
:
Пример:
-
Изображение 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):
.
Результат — карта признаков, где яркие области показывают вертикальные края.
Параметры
-
Размер ядра: обычно 3×3 или 5×5.
-
Шаг (stride): расстояние сдвига ядра (1 или 2).
-
Дополнение (padding): добавление нулей по краям (same padding — сохраняет размер, valid — уменьшает).
3.3. Компоненты CNN
CNN состоит из нескольких типов слоёв:
Свёрточный слой (Convolutional Layer)
-
Применяет несколько фильтров для извлечения признаков.
-
Выход — набор карт признаков.
Слой активации
-
Обычно ReLU (
).
-
Добавляет нелинейность, улучшая способность сети учить сложные зависимости.
Слой субдискретизации (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)
-
Проблема: глубокие сети теряют точность из-за затухания градиента.
-
Решение: остаточные связи (
).
-
Глубина: до 152 слоёв.
5. Обучение CNN
Обучение CNN похоже на обучение обычных сетей, но с учётом свёрточных операций.
5.1. Обратное распространение ошибки
-
Прямой проход: вычисление выхода.
-
Функция потерь (например, кросс-энтропия):
Где
— истинный класс,
— предсказание.
-
Обратный проход: обновление весов.
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, но их сочетание открывает новые возможности.
Мы рассмотрели основы, архитектуры, обучение и написали код. Для наглядности рекомендую:
Автор: whynothacked