Назад
183

EfficientNet

183

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 фактор).

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

\( \left(\alpha \cdot \beta^2 \cdot \gamma^2\right)^\varphi = 2^\varphi \)

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

Подставляем φ = 1 и получаем соотношение:

\( \alpha \cdot \beta^2 \cdot \gamma^2 \approx 2 \)

Затем при помощи Grid Search авторы подобрали оптимальные α, β, γ. Они получили следующие значения: α=1.2, β=1.1, γ=1.15. Получается, масштабируя B0 в B1, оптимально будет увеличить размер входного изображения на 15%, глубину сети — на 20%, а ширину —на 10%.

Но подбирать коэффициенты для каждого этапа масштабирования вычислительно сложно. Поэтому авторы зафиксировали подобранные α, β, γ и получили архитектуры B2-B7 за счет увеличения φ в исходном соотношении:

\( \left(\alpha \cdot \beta^2 \cdot \gamma^2\right)^\varphi \)

Таким образом, B0 и B1 были действительно “подобраны”, и поэтому они в каком-то смысле “оптимальны”. Но их старшие версии B2-B7 просто унаследовали коэффициенты масштабирования, следовательно, “оптимальными” их можно назвать уже с натяжкой. 

Стоит также отметить следующее: подбор параметров и оптимизация архитектуры были сделаны для датасета ImageNet. Следовательно, если ваши данные значительно от него отличаются — семейство EfficientNet уже не будет самым оптимальным. Имейте это в виду 🙂 

Так или иначе, EffNet-ы — отличный выбор. Они хорошо себя показывают после transfer learning. Авторы доказали это с помощью установления SOTA accuracy на 5 датасетах из 8.

И напоследок покажем вам таблицу-сравнение архитектур B0-B7 с близкими по accuracy архитектурами уже на самом ImageNet датасете. Обратите внимание на последние 2 столбца: они подчеркивают огромную разницу по количеству операций между версией EffNet и ее ближайшими соседями по точности.

И напоследок покажем вам таблицу-сравнение архитектур B0-B7 с близкими по accuracy архитектурами уже на самом ImageNet датасете. Обратите внимание на последние 2 столбца: они подчеркивают огромную разницу по количеству операций между версией EffNet и ее ближайшими соседями по точности.

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!