Подробный обзор базовых, транспонированных, расширенных, разделяемых, глубинных и точечных сверток и их приложений.

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

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

Свертки

Давайте сделаем краткий обзор основной формы свертки. Согласно описанию в PapersWithCode,

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

Такие операции выгодны для обработки изображений, потому что:

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

Форму вывода и сложность сверток можно настроить с помощью следующих параметров:

  • Размер ядра: используется размер ядра, обычно размер ядра (3 × 3).
  • Отступы: как заполнить края изображений, чтобы сохранить размер изображения после свертки. Например, в приведенной выше демонстрации используется отступ в 1 пиксель. Описывает количество пикселей и правило заполнения этих пикселей.
  • Шаги: размер шага ядра при сканировании изображения. Обычно устанавливается равным 1 для сохранения формы данных или 2 для понижения дискретизации. В приведенной выше демонстрации используется шаг 2.

Каждый выходной канал прогнозируется путем объединения результатов каждого канала, свернутого через разное ядро. Таким образом, ядра C_in формы K × K необходимы для вычисления одного выходного канала. Где K обозначает размер ядра, а C_in, каждый C_out обозначает количество входных и выходных каналов.

# Параметры: K × K × C_in × C_out

Вычисление: В × Ш × C_in × C_out × K × K (в случае шага = 1)

Примеры использования. Такие сверточные слои используются буквально для каждой подзадачи компьютерного зрения. К ним относятся контролируемые задачи, такие как классификация изображений и видео, обнаружение объектов, сегментация и задачи синтеза, такие как создание изображения, сверхвысокое разрешение изображения, передача изображения в изображение. Существуют также приложения вне поля зрения, такие как одномерные свертки для последовательного моделирования и приложения, связанные с 3D.

Точечная свертка (свертка 1x1)

Точечная свертка - это другое слово для сверточного слоя с ядрами 1 × 1. Они также обозначаются как свертка по каналу или слой проекции. Зачем кому-то это нужно? Есть два основных варианта использования:

  1. Для изменения размерности (или количества каналов) входа.
  • Некоторые сети, такие как Inception, объединяют функции, вычисленные из разных ядер, что приводит к слишком большому количеству каналов, поэтому для управления количеством каналов применяется точечная свертка.
  • Сложные для вычислений модули, такие как модуль самовнимания, такие как сжатие и возбуждение, более осуществимы, когда функции сжимаются с помощью точечной свертки.
  • Иногда нам нужно сопоставить количество каналов при объединении двух внутренних произведений с поэлементной суммой или произведением.

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

2. Он создает зависимости по каналам с незначительными затратами. Это особенно используется в сочетании с глубокой сверткой, в которой отсутствуют такие зависимости.

# Параметры: C_in × C_out

Расчет: В × Ш × С_выход × С_выход

Транспонированная свертка (деконволюция / обратная свертка)

Деконволюция явно вычисляет математическую инверсию сверточного слоя. Хотя он широко используется в классическом видении или обработке сигналов, он не важен для глубокого обучения, поскольку параметры операции можно узнать с помощью градиентного спуска.

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

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

Важно: хотя их часто путают, транспонированная свертка не является деконволюцией / обратной сверткой.

# Параметры: K × K × C_in × C_out)

Сценарии использования. Транспонирование свертки используется в сетевых архитектурах, где требуется повышающая дискретизация. Некоторыми примерами являются использование в сетях стиля кодер-декодер, используемых для семантической сегментации, автокодировщиков или сетей синтеза и генерации изображений. Одной из проблем транспонированной свертки является артефакт в виде шахматной доски, который может быть проблематичным для генерации / синтеза изображения. Эта тема выходит за рамки этого поста и заслуживает отдельного обсуждения. Для получения дополнительной информации обратитесь к этой статье от Google brain.

Источники:

Дилатированная извилина (атрозная извилина)

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

Увеличение размера ядра - это один из способов увеличения воспринимающего поля, но вычисление также увеличивается очень быстро. Пониженная дискретизация изображения также имеет эффект увеличения воспринимающего поля, потому что свертка 3 × 3, например, карта характеристик 8 × 8 покрывает большую часть изображения. Трех сверток 3 × 3 достаточно, чтобы рассмотреть все изображение для вывода в пространстве признаков 8 × 8.

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

Расширенная свертка - это тип свертки, при котором пиксели ядра разнесены (заполнены 0). Интервал также считается гиперпараметром, который часто имеет разные значения от 2, как в демонстрации выше, до больших пространств, таких как 24 в моделях DeepLab. Он увеличивает размер ядра без тривиального увеличения объема вычислений. Эта конструкция обеспечивает чрезвычайно эффективные вычисления из большего воспринимающего поля без потери информации или необходимости увеличения количества слоев.

Сценарии использования: показывает наиболее значимое использование в семантической сегментации, но также учитывается в облегченных / мобильных архитектурах CNN для других задач.

Предложено в: Многомасштабное агрегирование контекста с помощью расширенных сверток

Пространственная разделимая свертка (Separable convolution)

Некоторые матрицы 3 × 3 могут быть представлены как матричное умножение двух векторов. Поскольку ядро ​​3 × 3 также является общей матрицей, его можно разделить на одно ядро ​​3 × 1 и одно ядро ​​1 × 3, но выполнить ту же операцию.

В частности, пространственно разделимая свертка заменяет исходную свертку на две стадии, как показано на рисунке выше. Таким образом, количество параметров и количество операций для каждого ядра сокращается с 9 (3x3) до 6. Однако известно, что не все ядра 3x3 можно разделить, и, таким образом, пространственно разделимая свертка может ограничить возможности. модели.

# Параметры: (K + K) × C_in × C_out

Вычисление: В × Ш × C_вх × C_выход × (K + K)

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

Источник:

Глубинная свертка

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

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

# Параметры: K × K × C_in

Вычисление: В × Ш × С_дюйм × К × К

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

Разделимая по глубине свертка

Глубинная свертка с последующей точечной сверткой. Поскольку глубинная свертка не имеет связей между каналами, мы соединяем их точечной сверткой. Авторы Xception считают полезным помещать нелинейности после глубинной свертки. Полный процесс показан на рисунке ниже.

Пространственная разделяемая свертка разделяет оси x и y в классической свертке. В этом контексте разделимая по глубине свертка может рассматриваться как разделение измерения канала.

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

# Параметры: (K × K + C_out) × C_in

Вычисление: В × Ш × C_in × (K × K + C_out)

Примеры использования: Xception, MobileNet V1 / V2, EfficientNet V1 (MnasNet) / V2 и многое другое…

Вы можете найти сложную историю разделимых по глубине сверток в разделе 2: Xception: Deep Learning with Depthwise Separable Convolutions

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

Расскажите, пожалуйста, о предложениях или вопросах в комментариях. Я постараюсь ответить вам максимум в течение 2 дней.

Великолепные изображения (анимации) предоставлены vdumoulin по лицензии MIT (бесплатно по описанию лицензии!).