Новый уровень развития ImageNet

Сети сжатия и возбуждения (SENets) представляют собой строительный блок для CNN, который улучшает взаимозависимости каналов практически без затрат на вычисления. Они использовались на конкурсе ImageNet в этом году и помогли улучшить результат прошлого года на 25%. Помимо этого огромного повышения производительности, их можно легко добавить к существующим архитектурам. Основная идея такова:

Давайте добавим параметры к каждому каналу сверточного блока, чтобы сеть могла адаптивно регулировать вес каждой карты функций.

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

"Почему"

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

Все это работает путем объединения пространственной и канальной информации изображения. Различные фильтры сначала находят пространственные характеристики в каждом входном канале, а затем добавляют информацию по всем доступным выходным каналам. Более подробно я рассмотрел эту операцию в другой статье.

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

Однако авторы пошли еще дальше. Во-первых, они получают общее представление о каждом канале, сводя карты функций к одному числовому значению. В результате получается вектор размером n, где n равно количеству сверточных каналов. Затем он проходит через двухуровневую нейронную сеть, которая выводит вектор того же размера. Эти значения n теперь можно использовать в качестве весов на исходных картах функций, масштабируя каждый канал в зависимости от его важности.

"Как"

В последнем абзаце вы, возможно, немного потеряли уверенность в том, что это действительно так просто, как я обещал. Итак, давайте сразу перейдем к реализации SE-блока.

def se_block(in_block, ch, ratio=16):
    x = GlobalAveragePooling2D()(in_block)
    x = Dense(ch//ratio, activation='relu')(x)
    x = Dense(ch, activation='sigmoid')(x)
    return multiply()([in_block, x])
  1. Функция получает входной сверточный блок и текущее количество каналов, которые у него есть.
  2. Мы сжимаем каждый канал до одного числового значения, используя средний пул.
  3. Полностью связанный слой, за которым следует функция ReLU, добавляет необходимую нелинейность. Сложность выходного канала также снижается в определенном соотношении.
  4. Второй полностью связанный слой, за которым следует сигмовидная активация, дает каждому каналу функцию плавного стробирования.
  5. Наконец, мы взвешиваем каждую карту функций сверточного блока на основе результата нашей боковой сети.

Эти пять шагов почти не добавляют дополнительных вычислительных затрат (менее 1%) и могут быть добавлены к любой модели.

Авторы показывают, что добавляя SE-блоки в ResNet-50, можно ожидать почти такой же точности, как у ResNet-101. Это впечатляет для модели, требующей лишь половины вычислительных затрат. В документе далее исследуются другие архитектуры, такие как Inception, Inception-ResNet и ResNeXt. Последнее приводит их к модифицированной версии, которая показывает топ-5 ошибок 3,79% на ImageNet.

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

Это первая статья из серии резюме, которую я собираюсь написать. Я хочу заставить себя читать и понимать новые статьи, чтобы не отставать от последних тенденций в области искусственного интеллекта. Если вы хотите внести свой вклад или найти ошибки в моих статьях, свяжитесь со мной.