MobileNet v1-v3
DeepSchoolАвтор: Александр Лекомцев
Редактура: Александр Наздрюхин, Тимур Фатыхов
В своё время MobileNet произвел революцию, став примером быстрой и эффективной нейросети. MobileNet V2/V3 закрепили этот успех.
Какую проблему решает?
Чтобы удобно запускаться на мобильных устройствах сетка должна влезать в память и её инференс должен занимать какое-то разумное время.
То есть, нужно чтобы в сети было меньше параметров и матричных умножений. При этом хочется получить максимальное качество.
MobileNetV1
В 2017 году исследователи из Google сделали первый значимый шаг в эту сторону — выпустили MobileNetV1. В сетке активно использовались depthwise separable convolution, про которые мы рассказывали в этом посте. На Рисунке 1 видно строение блока сети. Стоит заметить, что между depthwise conv и 1x1 conv есть нелинейность — этот участок значительно переделают уже в следующей версии.

Интересно, что авторы обращали внимание не только на количество параметров, но и на реализацию сверточного слоя. Свертки в программе представляются одним матричным умножением. Но чтобы превратить свертку в матричное умножение надо перегруппировать фичемапу и ядро так, чтобы при перемножении сымитировать перемещение ядра по входному тензору. Подробнее про то как это делают, можно почитать тут. Эта имитация требует от нас дублирования некоторых значений тензора, что увеличивает потребление памяти и добавляет оверхед по количество операций.
Но сверточные слои с ядром 1х1 отличны тем, что позволяют посчитать свертку как матричное умножение без перегруппировки данных.
А благодаря тому, что 75% параметров MobileNet отводятся под свертки 1x1, сеть работает очень быстро и без лишнего оверхеда по памяти.
Кроме того, уже в первой статье есть идеи подбора размера сети под задачу. Авторы вводят два параметра, отвечающих за размер слоёв. Оба лежат в диапазоне [0, 1], где единице соответствует стандартный MobileNetV1.
Первый из них, Width Multiplier, должен равномерно сузить сеть, уменьшив число каналов на каждом слое. Мы уменьшаем количество сверток 1x1 в Width Multiplier раз, из-за чего количество входных и выходных каналов уменьшается во столько же. Второй, Resolution Multiplier, по сути отвечает просто за входной размер изображения, его уменьшение равноценно ресайзу до размера 224 * Resolution Multiplier.

Как видно из Рисунка 2, MobileNet обходил многие ещё используемые на тот момент архитектуры в точности, при этом имея пугающе мало операций умножения и параметров сети. Тот же InceptionV3, при не таком большом для продакшена отрыве в метриках, имеет в семь раз больше параметров и почти в девять раз больше операций!
MobileNetV2
Меньше чем через год авторы первой статьи решили закрепить успех и добавили поверх имеющейся архитектуры ещё пару фичей. Они даже вынесли фичи в название — “MobileNetV2: Inverted Residuals and Linear Bottlenecks”.
Основная идея лежит в том, что нелинейность уничтожает информацию в канале. Например, получив ноль после применения ReLU, мы уже не можем сказать, какое отрицательное число было до функции активации. Тогда можно попробовать:
- Увеличить размер внутреннего представления, чтобы при “очистке” информации в одном канале, она сохранялась в другом
- Использовать линейные слои, чтобы “собрать” полезную информацию из тензора после ReLU. Ведь теперь в нем много нулей, которые могут не нести полезную информацию.
Это и было сделано!

На Рисунке 3 как раз видна реализация идей:
- В отличие от обычного блока мы применяем нелинейность только к тензорам с большим числом каналов, для остальных останавливаемся на линейном преобразовании.
- Кроме того, перед применением активации мы используем свёртки 1x1 без нелинейности для увеличения числа каналов.

Когда мы уменьшаем размер внутреннего представления сети в MobileNetV1 с помощью Width Multiplier, мы надеемся, что вся ценная для сети информация может уместиться в пространстве низкой размерности. Так же и в новой версии — соединяя через residual connection именно “тонкие” тензоры, мы надеемся, что вся ценная информация будет сохраняться в них. И как же круто это сочетается с идеей, что нелинейность эту информацию может вычеркнуть — ведь как раз к этим блокам она не применяется!

Кроме успехов в классификации на ImageNet, авторы показали результаты в детекции и семантической сегментации. Как видно на Рисунке 5, их версия SSDLite не только обогнала YOLOv2 по mAP, но и осталась в несколько раз меньше и быстрее. Это сделало удобным перенос на мобильные устройства не только задачи классификации, но и более сложные.
MobileNet V3
Если в предыдущих версиях оптимальная архитектура искалась вручную, то в третьей версии главной фишкой стало нахождение архитектуры методами MnasNet и NetAdapt.

Оба метода разработаны специально для поиска архитектур сетей под мобильные устройства. Они учитывают время работы на них для выбора оптимальных по соотношению качество/скорость вариантов.

Кроме того, в сеть добавлены Squeeze-and-Excitation блоки, взвешивающие каналы сети. По-сути, это attention для отдельных каналов входящего тензора. На Рисунке 7 видно как это работает:
- Сначала сжимаем изначальный тензор HxWxC до 1x1xC используя average pooling, то есть усредняя каждый канал отдельно
- Линейным слоем с сигмоидой на конце отображаем эти C средних значений в C весов, по одному на каждый канал
- Последним шагом умножаем каждый канал на соответствующее ему число и складываем с изначальным тензором.

На Рисунке 8 показано, куда этот блок вставили. Заметим, что взвешиваем мы именно “толстые” тензоры, на которых применяется нелинейность. Это тоже результат поиска архитектур.