Исследование свёрточных нейронных сетей на примере MobileNet

Свёрточные нейронные сети

Свёрточными называют нейронные сети, в которых присутствуют слои, осуществляющие двумерную свёртку. Двумерная свёртка — это операция над двумя матрицами. Схематично она представлена на Рисунке 1.

Рисунок 1. Двумерная свёртка.

Результатом двумерной свёртки над матрицей размера W x H и матрицей, называемой ядром свёртки размера K x K, является матрица размера W-1 x H-1.

Также часто используются понятия “padding” и “stride”. Если padding > 0, то исходная матрица “обрамляется” рамкой ширины padding. Если stride > 1, то двумерная свёртка осуществляется с шагом, равным stride. Схематично эти параметры показаны на Рисунке 2.

Рисунок 2. Padding и stride.

Другая операция, часто встречающаяся во свёрточных нейронных сетях — это пулинг (pooling). По сути, это просто нахождение максимума в пределах плавающего окна размера 2x2 либо 3x3. Pooling представлен на Рисунке 3.

Рисунок 3. Max pooling.

Двумерная свёртка в свёрточных нейронных сетях обычно проводится над матрицами изображений или feature map с несколькими каналами. В таком случае полученные из разных каналов результаты просто складываются, как показано на Рисунке 4.

Рисунок 4. Двумерная свёртка с несколькими каналами.

Для свёртки с количеством входных каналов Cin понадобится трёхмерное ядро ширины и высоты K с количеством элементов Cin*K2.

Ещё одна операция — нормализация батча (batch normalization), показана на Рисунке 5. Batch normalization используется для борьбы с внутренними ковариациями.

Рисунок 5. Batch normalization.

Batch normalization работает по-разному во время обучени и во время инференса. Известно, что нейронные сети учат в основном методом пакетного градиентного спуска — по батчам. Во время обучения нейронной сети в качестве мат. ожидания и квадратного корня дисперсии берутся соответственно выборочное среднее и среднеквадратическое отклонение текущего батча, и по ним значения внутри батча нормализуются.

Вместе с этим на этом выборочном среднем и среднеквадратическом отклонении учатся внутренние веса самого слоя batch normalization. Инференс же чаще всего происходит не по батчам, а по одному объекту. Поэтому во время инференса в качестве мат. ожидания и корня дисперсии берутся те самые обученные веса. Эту особенность стоит учитывать — например, когда модель, содержащая слои batch normalization, показывает разные результаты на обучающей и тестовой выборках, даже когда обучающая и тестовая выборки равны.

В нейронных сетях обычно между операциями применяют нелинейные функции активации. Это делается, чтобы придать нейронной сети нелинейность, ведь в противном случае даже с большим количеством различных слоёв она выродится в простую линейную модель. Пример такой функции — ReLU — показан на Рисунке 6.

Рисунок 6. Функция активации ReLU.

Таким образом, свёрточная нейронная сеть представляет собой чередующуюся последовательность операций двумерной свёртки, нормализаций батча и пулинга, между которыми могут быть применены функции активации. Пример такой нейронной сети представлен на Рисунке 7. Это state-of-the-art свёрточная нейронная сеть, разработанная для решения задачи классификации рукописных цифр на датасете DIGITS. На схеме отчётливо видно чередование свёрточных и pooling-слоёв, после которых следуют несколько полносвязных, которые в конце концов формируют на выходе вероятности принадлежности картинки каждому классу, соответствующему определённой цифре.

Рисунок 7. Свёрточная нейронная сеть.

Каждый свёрочный слой такой сети представляет собой несколько двумерных свёрток, которые формируют выходные каналы. Каждый такой слой, формирующий из Cin входных каналов Cout выходных, имеет Cin*Cout*K элементов ядер — весов.

Как уже было сказано, нейронные сети учат методом пакетного градиентного спуска. При этом используют метод обратного распространения ошибки — вначале считаются значения функции потерь на каждом выходе, после чего они "распространяются" назад по нейронной сети в направлении, обратном прохождению сигнала — от выхода до входа, корректируя веса в каждом слое в соответствии со значениями антиградиента.

Inception и Xception

В какой-то момент возникла проблема выбора архитектуры свёрточных нейронных сетей. Какой размер ядра свёртки выбрать? Когда использовать пулинг? В 2015 году инженеры из Google предложили в одном слое использовать сразу несколько операций. Такую архитектуру они назвали Inception.

Рисунок 8. Inception.

Однако такой подход оказался очень требовательным к ресурсам, поэтому впоследствии они предложили вначале проводить свёртку 1x1 с нужным количеством выходных каналов, а потом по каждому каналу проводить свёртку 3x3, как показано на Рисунке 9. Такую свёртку (по каждому каналу в отдельности) они назвали deapthwise-свёрткой (deapthwise-convolution). Соответствующую архитектуру они назвали Xception.

Рисунок 9. Xception.

Если обычный свёрточный слой содержит CinCoutK весов, то слой Xception содержит уже CinCout+CoutK весов, что значительно меньше при большом числе входных и выходных каналов.

MobileNet

Эта идея была взята за основу в архитектуре MobileNet, предложенной инженерами Google во главе с Э. Говадром в 2017 году. Слой (блок) MobileNet представлен на Рисунке 10.

Рисунок 10. Блок MobileNet.

В архитектуре MobileNet такие блоки объединены в последовательность, как показано на Рисунке 11.

Рисунок 11. Архитектура MobileNet.

MobileNetV2

Далее была предложена архитектура MobileNetV2. В ней структура блока была улучшена, как показано на Рисунке 12.

Рисунок 12. Слева: блок MobileNetV1. Справа: блок MobileNetV2.

MobileNetV3

Основным нововведением MobileNetV3 стал механизм SE (squeeze and excite), внедрённый в архитектуру блока, как показано на Рисунке 13.

Рисунок 13. Сверху: блок MobileNetV2. Снизу: блок MobileNetV3.

Также теперь в некоторых слоях вместо ReLU используется функция активации h-swish, показанная на Рисунке 14.

Рисунок 14. h-swish.

Все перечисленные нововведения позволили значительно ускорить работу нейронной сети. Сравнительные результаты представлены на Рисунке 15.

Рисунок 15. Сравнение скорости и качества работы MobileNetV2 и MobileNetV3.

Другие задачи

Изначально архитектура MobileNet предназначалась для решения задачи классификации. Однако разработчики научились использовать блоки MobileNet, встраивая их вместо обычных свёрток в других архитектурах.

Так, для ускорения вычислений они предлагают проделывать это в архитектуре SSD (Рисунок 16) для решения задачи детекции и в архитектуре DeepLab (Рисунок 17) — для решения задачи семантической сегментации.

Рисунок 16. Архитектура SSD.

Рисунок 17. Архитектура DeepLab.