Машинное обучение

Классификация изображений

In 2012, a computer first beat handcrafted features at image recognition. In 2015, a computer surpassed human accuracy. By 2020, the same task that required a PhD team costs 0.001 per image via API. This revolution happened through three ideas: deeper networks, smarter scaling, and creative data augmentation.

  • **Медицинская диагностика** - CNN-модели на базе EfficientNet анализируют рентгеновские снимки, МРТ и гистологические изображения, достигая точности опытных радиологов при скрининге рака лёгких, диабетической ретинопатии и меланомы. В 2020 году FDA одобрило первые AI-системы для автономной диагностики
  • **Автономное вождение** - Tesla, Waymo и другие компании используют CNN для классификации дорожных знаков, пешеходов и транспортных средств в реальном времени. ResNet-подобные backbone обрабатывают кадры с 8 камер одновременно, принимая решения за миллисекунды
  • **Контроль качества на производстве** - CNN с transfer learning обнаруживает дефекты на конвейере (трещины, царапины, отклонения формы) с точностью 99.5%+, заменяя визуальную инспекцию человеком и работая 24/7 без усталости

Предварительные знания

  • BERT, GPT, and Large Language Models

От ImageNet до остаточных сетей

Современная эпоха компьютерного зрения началась с данных. В 2009 году Фэй-Фэй Ли с соавторами выпустила ImageNet, размеченный набор из миллионов изображений в тысяче категорий, и превратила его в ежегодное соревнование. Три года победители использовали рукотворные признаки. Затем в 2012 году AlexNet Алекса Крижевского, глубокая свёрточная сеть, обученная на GPU, почти вдвое снизила ошибку и закрыла спор о том, работает ли глубокое обучение. VGG в 2014 году показала, что наращивание малых фильтров в очень глубокие сети продолжает улучшать точность, но обучение такой глубины становилось нестабильным. В 2015 году Кайминг Хэ с командой из Microsoft представил ResNet с остаточными связями, короткими путями, по которым градиенты проходят напрямую, что сделало обучаемыми сети из сотни и более слоёв и превзошло уровень человека на бенчмарке ImageNet.

Эволюция архитектур CNN

ImageNet Large Scale Visual Recognition Challenge (ILSVRC) - ежегодное соревнование по классификации 1.2 миллиона изображений в 1000 категорий. С 2010 по 2017 это соревнование стало **главным двигателем прогресса** в computer vision. Каждый год победитель предлагал архитектурную инновацию, которая затем становилась стандартом индустрии. В 2012 году произошёл перелом: CNN-архитектура **AlexNet** впервые разгромила все ручные методы, снизив top-5 error с 26% до 16%. Это был момент, когда deep learning перестал быть академической игрушкой и стал промышленным инструментом.

**AlexNet (2012)** - первая глубокая CNN, обученная на GPU. Алекс Крижевски использовал два GTX 580 (по 3 ГБ памяти каждый), разделив сеть между двумя видеокартами. Ключевые инновации: функция активации **ReLU** вместо sigmoid (в 6 раз быстрее обучение), **Dropout** для регуляризации (случайное выключение 50% нейронов), и **data augmentation** (отражения, сдвиги, изменение цвета). 8 слоёв, 60 миллионов параметров, и результат, который разгромил все классические методы computer vision.

**VGG (2014)** доказал простую, но важную идею: **глубина важнее сложности**. Вместо больших фильтров (11x11 у AlexNet) VGG использовал только фильтры 3x3, но поставил их друг за другом: два 3x3 слоя имеют receptive field 5x5, три - 7x7. При этом параметров меньше, а нелинейностей (ReLU) больше. VGG-16 и VGG-19 стали стандартными feature extractors, используемыми до сих пор. **GoogLeNet/Inception (2014)** пошёл другим путём: вместо одного размера фильтра каждый Inception модуль параллельно применяет 1x1, 3x3, 5x5 свёртки и max pooling, а затем конкатенирует результаты. Это позволяет сети самой выбирать масштаб анализа. 1x1 свёртки перед 3x3 и 5x5 сжимают каналы, уменьшая вычисления. Результат: 22 слоя, но всего **7 миллионов параметров** - в 20 раз меньше VGG.

Между 2012 и 2015 годами стало понятно: **более глубокие сети дают лучшие результаты**. AlexNet (8 слоёв) уступил VGG (19 слоёв), который уступил GoogLeNet (22 слоя). Казалось, рецепт прост - добавляй слои. Но при попытке построить сеть на 50+ слоёв возникла проблема: точность не просто перестала расти - она **упала**. Сеть на 56 слоёв работала хуже, чем на 20. Это не overfitting (ошибка на train тоже росла). Это была **degradation problem**, которую решит следующая архитектура - ResNet.

GoogLeNet/Inception достиг лучшей точности, чем VGG, при этом имея в 20 раз меньше параметров. За счёт чего?

ResNet: skip connections

К 2015 году было понятно, что глубина сети критична для точности. Но при попытке обучить сеть глубже 20 слоёв возникала **degradation problem**: и train, и test error росли по сравнению с более мелкой сетью. Это парадокс: сеть на 56 слоёв **содержит** все решения сети на 20 слоёв (просто 36 дополнительных слоёв могли бы выучить тождественное отображение f(x) = x). Но на практике оптимизатор не мог найти это решение - gradient flow затухал через десятки слоёв, и глубокая сеть застревала в плохом минимуме.

Решение Каймина Хе (He et al., 2015): вместо того, чтобы заставлять слой учить отображение H(x), пусть он учит **остаток (residual)** F(x) = H(x) - x. Тогда выход блока: **H(x) = F(x) + x**. Это реализуется через **skip connection** (shortcut) - входной сигнал x просто складывается с выходом свёрточных слоёв. Если оптимальное отображение близко к тождественному, сети проще выучить F(x) = 0 (все веса к нулю), чем H(x) = x (точное копирование через несколько слоёв).

**Почему skip connections решают degradation problem:** 1. **Gradient highway** - градиент может течь напрямую через skip connection, минуя свёрточные слои. Даже в сети на 152 слоя градиент доходит до первых слоёв без затухания. 2. **Простое обучение тождественности** - если слой не нужен, сети проще обнулить веса (F(x) = 0, значит H(x) = x), чем выучить точное копирование через свёртки. 3. **Ensemble effect** - ResNet можно рассматривать как ансамбль сетей разной глубины. Каждый residual block может быть пропущен через skip connection, создавая 2^n возможных путей через n блоков. 4. **Bottleneck block** - для глубоких ResNet (50+) используют 1x1-3x3-1x1 конфигурацию: 1x1 сжимает каналы, 3x3 делает свёртку, 1x1 расширяет обратно. Это в 3 раза дешевле, чем два 3x3.

Почему ResNet-56 работает лучше, чем обычная CNN на 56 слоёв без skip connections, хотя обе сети имеют одинаковую ёмкость?

EfficientNet: compound scaling

После ResNet возник вопрос: как **масштабировать** CNN для максимальной точности? Есть три измерения масштабирования: **ширина** (число каналов в каждом слое), **глубина** (число слоёв), и **разрешение** (размер входного изображения). Традиционно инженеры увеличивали что-то одно: ResNet шёл вглубь (50, 101, 152 слоя), WideResNet расширял каналы, а для медицинских задач просто подавали картинки в высоком разрешении. Но масштабирование одного измерения быстро насыщается - добавление слоёв после 100 даёт минимальный прирост при удвоении вычислений.

Минцзин Тань и Куок Ле (Google Brain, 2019) предложили **compound scaling** - одновременное масштабирование всех трёх измерений с фиксированным соотношением. Интуиция: если увеличить разрешение входа, сети нужно больше слоёв (глубина), чтобы обработать большее receptive field, и больше каналов (ширина), чтобы захватить более тонкие паттерны на детальном изображении. Масштабирование одного измерения без других - как улучшить камеру, но смотреть на фото через мутное стекло.

**Compound scaling coefficient:** EfficientNet использует единый коэффициент phi для масштабирования: - depth: d = alpha^phi - width: w = beta^phi - resolution: r = gamma^phi Где alpha, beta, gamma подбираются через NAS (Neural Architecture Search) так, чтобы alpha * beta^2 * gamma^2 ~ 2 (удвоение FLOPS при phi += 1). Для EfficientNet: alpha = 1.2, beta = 1.1, gamma = 1.15 **Масштабирование от B0 до B7:** - B0: phi=0, 224x224, 5.3M параметров, 77.1% top-1 - B3: phi=3, 300x300, 12M параметров, 81.6% top-1 - B7: phi=7, 600x600, 66M параметров, 84.3% top-1 Каждый шаг phi удваивает FLOPS и добавляет ~1% точности.

Базовая архитектура EfficientNet-B0 была найдена через **NAS (Neural Architecture Search)** - автоматический поиск оптимальной архитектуры. NAS перебирает тысячи конфигураций (какие блоки, сколько слоёв, какой kernel size), обучает каждую и выбирает лучшую по соотношению точность/вычисления. EfficientNet-B0 строится на **MBConv** блоках (Mobile inverted Bottleneck Convolution) с squeeze-and-excitation: expand каналы через 1x1, depthwise свёртка 3x3 или 5x5, SE-attention по каналам, project обратно через 1x1. Это тот же inverted residual block, что в MobileNet V2, но с оптимальными пропорциями.

После EfficientNet (2019) появились архитектуры, которые переосмыслили подход к image classification. **ConvNeXt (2022)** - чистая CNN, вдохновлённая дизайном Vision Transformer: patchify stem (4x4 свёртка с stride 4), LayerNorm вместо BatchNorm, GELU вместо ReLU, depthwise 7x7 свёртки. ConvNeXt достигает точности Vision Transformer без механизма attention. **Vision Transformer (ViT, 2020)** полностью отказался от свёрток: изображение разрезается на патчи 16x16, каждый патч проецируется в embedding, и далее - стандартный Transformer. ViT превосходит CNN на больших датасетах (300M+ изображений), но на ImageNet (1.2M) CNN конкурентоспособны.

EfficientNet-B0 достигает более высокой точности, чем ResNet-50, при 5 раз меньшем числе параметров. Какой главный принцип стоит за этим?

Data Augmentation

Архитектура сети - лишь половина успеха в image classification. Вторая половина - **данные**. ImageNet содержит 1.2 миллиона изображений, но для обучения ResNet-152 с 60 миллионами параметров этого мало - модель склонна к overfitting. **Data augmentation** решает эту проблему, создавая вариации обучающих изображений через случайные трансформации. Но это не просто "увеличение датасета" - каждая трансформация обучает модель конкретной **инвариантности**: горизонтальное отражение учит, что кошка, смотрящая влево - та же кошка, что смотрит вправо; случайный crop учит, что часть объекта достаточна для распознавания.

Продвинутые методы аугментации выходят за рамки геометрических трансформаций. **CutMix** вырезает прямоугольник из одного изображения и вставляет в другое, смешивая метки пропорционально площади: если 30% пикселей от кошки вставлено в картинку собаки, лейбл становится 0.3*кошка + 0.7*собака. **MixUp** смешивает два изображения (и их метки) с случайным весом alpha: x_new = alpha * x1 + (1-alpha) * x2. Оба метода обучают модель не быть "слишком уверенной" - это форма **label smoothing** через данные.

**Автоматические стратегии аугментации:** **AutoAugment (Google, 2018)** - reinforcement learning ищет оптимальную последовательность трансформаций для конкретного датасета. Для ImageNet нашёл неинтуитивные комбинации: Posterize + Rotate, Equalize + Shear. **RandAugment (2020)** - упрощённая альтернатива: случайно выбирать N трансформаций из списка и применять с одинаковой силой M. Всего 2 гиперпараметра вместо 30+ у AutoAugment, при сравнимой или лучшей точности. **TrivialAugment (2021)** - ещё проще: одна случайная трансформация со случайной силой. Ноль гиперпараметров, работает не хуже RandAugment. Тренд: от сложных learned стратегий к простым random - регуляризация через случайность оказалась достаточной.

Data augmentation - не просто трюк для увеличения данных. Это **регуляризация**, стоящая в одном ряду с Dropout и weight decay. Dropout случайно отключает нейроны, заставляя сеть не полагаться на отдельные признаки. Data augmentation случайно трансформирует входные данные, заставляя сеть не полагаться на конкретные пиксели, позицию или освещение. Эксперименты показывают: ResNet-50 с сильной аугментацией (RandAugment + CutMix + MixUp) достигает 80.4% top-1 на ImageNet - почти догоняя EfficientNet-B3, который имеет в 2 раза больше параметров. Правильная аугментация может быть ценнее, чем более крупная архитектура.

Data augmentation - просто трюк для увеличения размера датасета, нужный только при малом количестве данных

Data augmentation - форма регуляризации, которая обучает модель инвариантностям (симметрия, масштаб, цвет). Она улучшает генерализацию даже на больших датасетах, стоя в одном ряду с Dropout и weight decay

ResNet-50 с RandAugment + CutMix + MixUp достигает 80.4% на ImageNet - почти столько же, сколько EfficientNet-B3 с вдвое большим числом параметров. Если бы аугментация просто увеличивала данные, она не помогла бы на ImageNet с 1.2M изображений. На практике аугментация работает даже на датасетах в десятки миллионов примеров, потому что она кодирует знания о мире (объект не меняется при отражении), а не просто создаёт копии.

Итоги

  • **Эволюция архитектур:** от AlexNet (8 слоёв, 2012) до ResNet (152 слоя, 2015) top-5 error на ImageNet упал с 16.4% до 3.6% - каждое поколение привносило ключевую инновацию: ReLU, маленькие фильтры, Inception модули, skip connections
  • **Skip connections:** residual learning F(x) + x решил degradation problem - градиент течёт через shortcut напрямую к ранним слоям, а сети проще выучить нулевой остаток, чем тождественное отображение через свёртки
  • **Compound scaling:** EfficientNet масштабирует ширину, глубину и разрешение одновременно с единым коэффициентом phi, достигая точности ResNet-50 при 5 раз меньшем числе параметров - balanced scaling эффективнее односторонего
  • **Data augmentation как регуляризация:** не просто увеличение данных, а обучение инвариантностям - те самые три идеи из начала урока (глубина, масштабирование, аугментация), которые за 8 лет превратили задачу для PhD-команд в API за 0.001 за картинку

Связанные темы

Классификация изображений - фундамент computer vision, связывающий свёрточные сети с задачами детекции, сегментации и transfer learning:

  • Свёрточные нейронные сети (CNN) — Базовый строительный блок всех архитектур image classification - свёрточные слои, pooling, feature maps. AlexNet, VGG, ResNet и EfficientNet строятся из одних и тех же примитивов, комбинируя их по-разному
  • Transfer Learning — Предобученные на ImageNet архитектуры (ResNet, EfficientNet) используются как feature extractors для новых задач. Fine-tuning последних слоёв позволяет достичь высокой точности на малых датасетах за минуты вместо часов обучения с нуля
  • Object Detection — Архитектуры classification (ResNet, EfficientNet) используются как backbone в детекторах объектов (Faster R-CNN, YOLO, EfficientDet). Backbone извлекает признаки, detection head находит и классифицирует объекты на изображении
  • Сегментация изображений — Encoder в архитектурах сегментации (U-Net, DeepLab) - это classification backbone. Модель классификации учится извлекать семантические признаки, которые сегментация использует для попиксельной разметки

Вопросы для размышления

  • ResNet решил degradation problem через skip connections, позволив строить сети на 100+ слоёв. Но почему проблема существовала в первую очередь - ведь глубокая сеть теоретически содержит все решения мелкой? Что это говорит нам о ландшафте функции потерь?
  • EfficientNet-B0 достигает лучшей точности, чем ResNet-50, при 5 раз меньшем числе параметров. Значит ли это, что архитектура важнее количества параметров? Когда больше параметров всё же необходимы?
  • Data augmentation обучает модель инвариантностям (flip, rotation, color). Но некоторые задачи требуют чувствительности к этим признакам - например, распознавание букв b и d (зеркальные). Как решить конфликт между инвариантностью и различением?

Связанные уроки

  • ml-29-cnn — Классификация строится на CNN-бэкбонах
  • ml-41-transfer-learning — Fine-tuning лучше обучения с нуля
  • ml-39-object-detection — Бэкбоны классификации питают детекторы
  • ml-05-evaluation — Accuracy и confusion matrix оценивают модели
  • stat-05-hypothesis — Порог решения как проверка гипотез
  • la-06-transformations
Классификация изображений

0

1

Войти

CutMix вырезает часть одного изображения и вставляет в другое, смешивая метки пропорционально площади. Какой основной эффект это даёт при обучении?