В своё время MobileNet произвел революцию, став примером быстрой и эффективной нейросети. MobileNet V2/V3 закрепили этот успех.
Чтобы удобно запускаться на мобильных устройствах сетка должна влезать в память и её инференс должен занимать какое-то разумное время.
То есть, нужно чтобы в сети было меньше параметров и матричных умножений. При этом хочется получить максимальное качество.
В 2017 году исследователи из Google сделали первый значимый шаг в эту сторону — выпустили MobileNetV1. В сетке активно использовались depthwise separable convolution, про которые мы рассказывали в этом посте. На Рисунке 1 видно строение блока сети. Стоит заметить, что между depthwise conv и 1x1 conv есть нелинейность — этот участок значительно переделают уже в следующей версии.
Рисунок 1. Стандартный блок обычной сети (слева) и MobileNet (справа)
Интересно, что авторы обращали внимание не только на количество параметров, но и на реализацию сверточного слоя. Свертки в программе представляются одним матричным умножением. Но чтобы превратить свертку в матричное умножение надо перегруппировать фичемапу и ядро так, чтобы при перемножении сымитировать перемещение ядра по входному тензору. Подробнее про то как это делают, можно почитать тут. Эта имитация требует от нас дублирования некоторых значений тензора, что увеличивает потребление памяти и добавляет оверхед по количество операций.
Но сверточные слои с ядром 1х1 отличны тем, что позволяют посчитать свертку как матричное умножение без перегруппировки данных.
А благодаря тому, что 75% параметров MobileNet отводятся под свертки 1x1, сеть работает очень быстро и без лишнего оверхеда по памяти.
Кроме того, уже в первой статье есть идеи подбора размера сети под задачу. Авторы вводят два параметра, отвечающих за размер слоёв. Оба лежат в диапазоне [0, 1], где единице соответствует стандартный MobileNetV1.
Первый из них, Width Multiplier, должен равномерно сузить сеть, уменьшив число каналов на каждом слое. Мы уменьшаем количество сверток 1x1 в Width Multiplier раз, из-за чего количество входных и выходных каналов уменьшается во столько же. Второй, Resolution Multiplier, по сути отвечает просто за входной размер изображения, его уменьшение равноценно ресайзу до размера 224 * Resolution Multiplier.
Рисунок 2. Сравнение разных версий MobileNetV1 с другими моделями. Версия описана в формате “Width Multiplier MobileNet-Resolution”.
Как видно из Рисунка 2, MobileNet обходил многие ещё используемые на тот момент архитектуры в точности, при этом имея пугающе мало операций умножения и параметров сети. Тот же InceptionV3, при не таком большом для продакшена отрыве в метриках, имеет в семь раз больше параметров и почти в девять раз больше операций!
Меньше чем через год авторы первой статьи решили закрепить успех и добавили поверх имеющейся архитектуры ещё пару фичей. Они даже вынесли фичи в название — “MobileNetV2: Inverted Residuals and Linear Bottlenecks”.
Основная идея лежит в том, что нелинейность уничтожает информацию в канале. Например, получив ноль после применения ReLU, мы уже не можем сказать, какое отрицательное число было до функции активации. Тогда можно попробовать:
Это и было сделано!