Google недавно опубликовал очень интересную статью и исходный код для недавно разработанной CNN (сверточной нейронной сети) под названием EfficientNet, которая установила новые рекорды как по точности, так и по вычислительной эффективности.

Это не было незначительным улучшением, а скорее улучшением точности до 6%, при этом эффективность порядка 5–10 раз выше, чем у большинства современных CNN. Их основные выводы должны послужить надежным руководством для тех, кто хочет создать лучшую архитектуру CNN в будущем, и поэтому в этой статье мы рассмотрим основные принципы, которые они обнаружили.

Вот результаты EfficientNet, масштабированные до различных уровней блоков (B1, B2 и т. Д.), В сравнении с результатами большинства других популярных CNN.

Как видно на изображении, EfficientNet превосходит современные достижения как по точности, так и по вычислительной эффективности. Как они это сделали?

Урок 1. Они узнали, что CNN необходимо масштабировать во многих измерениях. Масштабирование CNN только в одном направлении (например, только по глубине) приведет к быстрому ухудшению выигрыша по сравнению с необходимым вычислительным увеличением.

Большинство CNN обычно масштабируются путем добавления большего количества слоев или более глубоких слоев. например ResNet18, ResNet34, ResNet152 и т. Д. Числа представляют собой общее количество блоков (слоев), и в целом, чем больше слоев, тем больше «мощности» у CNN.

Эта способность увеличивать глубину во многом была взята из статьи Кайминга Хэ, в которой были представлены ResNet и соединение с пропуском (или идентификацией). Благодаря пропуску соединения стало возможным обучение более глубоких многоуровневых сетей, и с тех пор ResNet стал доминирующей архитектурой для компьютерного зрения.

Однако, как показано в этой статье, простое погружение в глубину быстро насыщает выигрыш ... ResNet 1000 не намного точнее, чем, например, ResNet152, поскольку после 100–150 слоев приросты быстро падают.

Расширение ширины - еще один часто используемый метод масштабирования, который позволяет улавливать более мелкие детали и его легче обучить. Однако и польза от этого быстро иссякает.

Вот график, показывающий, как вы увеличиваете глубину, ширину и разрешение изображения по сравнению с увеличением точности и FLOPS (вычислениями):

Урок 2. Для эффективного масштабирования все измерения глубины, ширины и разрешения необходимо масштабировать вместе, и существует оптимальный баланс для каждого измерения относительно других.

Авторы обнаружили, что существует синергия в масштабировании нескольких измерений вместе, и после обширного поиска по сетке вывели теоретически оптимальную формулу «составного масштабирования» с использованием следующих коэффициентов:

Глубина = 1,20

Ширина = 1,10

Разрешение = 1,15

Другими словами, для увеличения масштаба CNN, глубина слоев должна увеличиться на 20%, ширина на 10% и разрешение изображения на 15%, чтобы обеспечить максимальную эффективность при расширении реализации и повышении точности CNN.

Эта составная формула масштабирования используется для масштабирования EfficientNet с B0-B7 (увеличение уровней).

Затем в документе сравнивается их точность EfficientNet с точностью большинства других CNN на ImageNet, с поразительными результатами при сравнении количества требуемых параметров / вычислений с почти любой другой архитектурой CNN (уменьшение в 5 раз при сохранении или превышении большей части точности).

Возможно, что более важно, затем авторы тестируют EfficientNet с использованием трансферного обучения (с использованием предварительно обученных весов из ImageNet) на нескольких наборах данных. Это нормальный процесс того, как большинство CNN внедряются для реальных рабочих продуктов, и результаты довольно впечатляющие:

В качестве дополнительного доказательства эффективности комбинирования масштабирования в нескольких измерениях, вот сравнение тепловой карты из документа, показывающее, как архитектура EfficientNet эффективно оттачивает элементы изображения по сравнению с масштабированием в одномерных архитектурах:

Наконец, авторы показывают, что использование EfficientNet может быть в 5 раз быстрее для вывода (использования в реальном времени) на мобильных телефонах.

Огромное сокращение параметров и вычислений, необходимых для EfficientNet, может открыть новые возможности для использования CNN на мобильных платформах и представляет собой большой скачок вперед для мобильного ИИ!

В целом, это прорыв в архитектуре CNN, который показывает, что разработчикам CNN необходимо мыслить в нескольких измерениях при масштабировании архитектур.

Вот прямая ссылка на статью: https://arxiv.org/abs/1905.11946

Также доступен исходный код:

1 - официальный TensorFlow: «https://github.com/mingxingtan/efficientnet Ана

2 - PyTorch имеет несколько реализаций, и я лично работаю над одной, чтобы, надеюсь, внедрить FastAI:

A - https://github.com/zsef123/EfficientNets-PyTorch

Б - https://github.com/lukemelas/EfficientNet-PyTorch

C - https://github.com/rwightman/pytorch-image-models

(в этом EfficientNet смешан с рядом других моделей, поэтому код труднее отслеживать, но в остальном выглядит действительно хорошо).

D - Выполняется (мой): https://github.com/lessw2020/EfficientNet-PyTorch