Автор: Тимур Фатыхов

**EfficientNet —** семейство сверточных нейросетей для классификации изображений. “Efficient” — потому что авторы выбили лучший accuracy на ImageNet среди архитектур схожего размера.

Рис. 1: сравнение эффективности на датасете ImageNet. Слева: accuracy от кол-ва параметров. Справа: accuracy от FLOPs (количество операций с плавающей точкой за один прогон сети)

Рис. 1: сравнение эффективности на датасете ImageNet. Слева: accuracy от кол-ва параметров. Справа: accuracy от FLOPs (количество операций с плавающей точкой за один прогон сети)

Основная идея статьи следующая: сначала авторы подобрали небольшую оптимальную архитектуру EfficientNetB0, а затем путем ее итеративного масштабирования получили B1-B7. Давайте сперва разберемся, из чего же состоит B0 и как ее подбирали.

EfficientNetB0

EfficientNetB0 — сверточная сеть из 7 групп блоков MBConv.

Рис. 2: архитектура EfficientNetB0

Рис. 2: архитектура EfficientNetB0

Количество и порядок расположения этих блоков подобраны с помощью Multi-objective neural architecture search (reinforcement learning подход с подбором архитектуры сети другой нейронной сетью). Суть заключается в поиске архитектуры с наибольшей accuracy при фиксированном числе параметров и количестве вычислений. Благодаря этому EfficientNet и назвали “эффективной” — при своем размере она показывает наибольший accuracy. Возьмем, например, сеть DenseNet201. Она сравнима с EfficientNetB0 по accuracy. Но в ней будет в 3 раза больше параметров и в 5 раз больше вычислений.

Почему EffNetB0 состоит именно из MBConv блоков? Для перебора всевозможных вариантов слоев и их последовательностей нужна вечность. Авторы учли этот факт и решили ограничить область поиска. Взяв заведомо эффективный блок MBConv, они варьировали его гиперпараметры и подбирали оптимальную архитектуру. MBConv, известный также как Inverted Residual, впервые был представлен в MobileNetV2. Мы подробно рассказывали про этот блок в разборе семейства MobileNet — если вы еще не читали, то рекомендуем! Там мы представили основную идею инвертирования Bottleneck-а, DWS-слои и SE-блоки.

Как B0 масштабировали в B1-B7

Для улучшения качества сети можно увеличить ее глубину (количество слоев), ширину (количество фильтров) и разрешение протекающих тензоров (их высоту и ширину). До EfficientNet были работы с масштабированием двух параметров, но авторы статьи отмечают взаимосвязь именно трех параметров между собой, которые необходимо масштабировать вместе. Однако какая пропорция будет оптимальной? Увеличить все в 2 раза? Или глубину в 2, а ширину в 1,5? “Неочевидно, надо подбирать” — подумали авторы и разработали формализацию этого процесса.

Рис.3: a) базовая сеть, b) более широкая сеть, c) более глубокая сеть, d) сеть с изображением более высокого разрешения, e) сеть с комбинацией глубины, ширины и разрешения

Рис.3: a) базовая сеть, b) более широкая сеть, c) более глубокая сеть, d) сеть с изображением более высокого разрешения, e) сеть с комбинацией глубины, ширины и разрешения

Создатели EfficientNet решили: “Мы подобрали оптимальную архитектуру B0 и теперь хотим сделать ее больше и точнее. Давайте увеличим лимит количества операций в 2 раза и подберем коэффициенты увеличения глубины, ширины и размера входного тензора сети B0, которые дадут наибольший accuracy. Назовем эту архитектуру B1. Снова увеличим лимит по количеству операций в 2 раза и подберем оптимальные коэффициенты масштабирования архитектуры для получения B2 и так далее.”

Для описания процесса авторы вводят следующие обозначения:

α — константа, характеризующая глубину сети; β — константа, характеризующая ширину; γ — константа, характеризующая размер входного изображения; φ — коэффициент масштабирования (compaund scaling фактор).

При такой постановке будет справедливо следующее соотношение:

Степень 2 над константами β и γ отражает квадратичную зависимость вычислительной сложности сети от ширины и разрешения. Для EfficientNetB1 коэффициент масштабирования φ равен 1 (поэтому у нее такой индекс: B1).