Свёрточный слой

Коротко

Definition

Свёрточный слой — это слой нейронной сети, который применяет обучаемые фильтры к локальным участкам входного тензора, чтобы находить паттерны вроде границ, текстур, форм или локальных зависимостей.

Свёрточный слой особенно полезен для данных, где важна локальная структура:

  • изображения;
  • сигналы;
  • временные ряды;
  • текстовые последовательности;
  • объёмные данные;
  • некоторые научные и инженерные данные.

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

Зачем нужен

Свёрточный слой нужен, чтобы эффективно находить локальные паттерны.

Например, в изображениях ранние свёрточные слои могут реагировать на:

  • границы;
  • углы;
  • простые текстуры;
  • цветовые переходы.

Более глубокие слои могут собирать эти простые признаки в более сложные:

  • части объектов;
  • формы;
  • повторяющиеся структуры;
  • целые объекты.

Главное преимущество свёртки — она использует два предположения:

  1. Локальность: близкие элементы часто связаны сильнее, чем далёкие.
  2. Разделение весов: один и тот же паттерн может встретиться в разных местах.

Поэтому свёрточные сети обычно требуют меньше параметров, чем полносвязные сети на изображениях.

Как работает

Свёртка — это преобразование тензора с помощью ядра, или фильтра.

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

Механизм свёртки:

  1. Ядро скользит по входному тензору.
  2. На каждом положении берётся локальный участок входа.
  3. Значения участка поэлементно умножаются на значения ядра.
  4. Произведения складываются в одно число.
  5. Полученное число записывается в карту активации.

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

Пример вычисления одного элемента карты активации:

К линейной комбинации также может добавляться смещение:

Размерности свёртки

В зависимости от входного тензора и направления скольжения ядра свёртка может иметь разную размерность.

Conv1D

Одномерная свёртка скользит вдоль одной оси.

Она часто используется для:

  • временных рядов;
  • аудио;
  • сигналов;
  • текстов;
  • последовательностей признаков.

Conv2D

Двумерная свёртка скользит вдоль двух пространственных осей.

Она часто используется для:

  • изображений;
  • карт признаков;
  • микроскопии;
  • медицинских снимков;
  • спутниковых изображений.

Для RGB-изображений фильтр обычно имеет глубину, соответствующую числу входных каналов.

Conv3D

Трёхмерная свёртка скользит вдоль трёх пространственных осей.

Она может использоваться для:

  • видео;
  • 3D-медицинских снимков;
  • объёмных данных;
  • физических полей;
  • научных симуляций.

Depthwise convolution

В обычной свёртке фильтр смешивает информацию по пространственным осям и по каналам.

В depthwise convolution каждый канал обрабатывается отдельно своим двумерным фильтром. После этого карты активации собираются обратно в выходной тензор.

Идея:

  • обычная Conv2D смешивает каналы сразу;
  • depthwise convolution сначала обрабатывает каждый канал отдельно;
  • затем часто используется pointwise convolution 1×1, чтобы смешать каналы.

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

Размер выхода

Ширина или высота выходной карты активации вычисляется по формуле:

где:

  • — ширина или высота входного тензора;
  • — размер ядра;
  • — padding;
  • — stride;
  • — размер выходной карты активации.

Эта же логика применяется отдельно к высоте и ширине.

Например, если:

  • ;
  • ;
  • ;
  • ;

то:

То есть при kernel_size = 3, padding = 1, stride = 1 размер изображения сохраняется.

Обучаемые параметры

У свёрточного слоя обучаются:

  • веса фильтров;
  • смещения, если bias=True.

Для двумерной свёртки число параметров можно записать так:

где:

  • — ширина ядра;
  • — высота ядра;
  • — число входных каналов;
  • — число выходных каналов, то есть число фильтров;
  • +1 соответствует bias для каждого фильтра.

Если bias=False, формула становится:

Например, для Conv2D с ядром 3×3, C_in = 3, C_out = 16 и bias:

Гиперпараметры

Основные гиперпараметры свёрточного слоя:

  • размер ядра;
  • число фильтров;
  • stride;
  • padding;
  • dilation;
  • groups;
  • использовать ли bias;
  • функция активации после свёртки.

Kernel size

Размер ядра определяет, какой локальный участок входа видит фильтр.

Например:

  • 3×3 — маленькое локальное окно;
  • 5×5 — большее окно;
  • 1×1 — смешивание каналов без пространственного окна.

Stride

Stride — шаг, с которым фильтр перемещается по входу.

Чем больше stride, тем меньше размер выходной карты активации.

Padding

Padding — добавление рамки вокруг входного тензора.

Padding позволяет:

  • сохранить размер выхода;
  • контролировать влияние краёв;
  • избежать слишком быстрого уменьшения пространственного размера.

Dilation

Dilation увеличивает расстояние между элементами ядра.

Это позволяет фильтру видеть более широкий контекст без увеличения числа параметров.

Пулинг

Pooling — это операция уменьшения размера карты активации.

Пулинг не является свёрткой в строгом смысле, но часто используется рядом со свёрточными слоями в CNN.

Зачем нужен pooling:

  • уменьшить пространственный размер;
  • снизить вычислительную стоимость;
  • сделать признаки менее чувствительными к небольшим сдвигам;
  • агрегировать локальную информацию.

Основные виды pooling:

  • max pooling;
  • average pooling;
  • sum pooling;
  • global average pooling.

Max pooling берёт максимальное значение в локальном окне. Average pooling берёт среднее значение.

Как обучается

Свёрточный слой обучается через обратное распространение ошибки.

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

Рассмотрим простой пример.

Пусть есть вход размером 3×3:

И фильтр размером 2×2:

Если stride равен 1 и padding не используется, выход будет размером 2×2.

Элементы выхода:

Вес участвует в вычислении всех четырёх выходов. Поэтому по цепному правилу градиент loss по получает вклад от всех четырёх позиций:

Так как:

получаем:

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

Упрощённо:

  • forward: вход сворачивается с весами , получается выход ;
  • backward для весов: вход сопоставляется с градиентом ошибки , получается градиент весов ;
  • backward для входа: градиент ошибки сопоставляется с фильтром , получается градиент по входу .

Технически во многих библиотеках используется кросс-корреляция, а не математическая свёртка с переворотом ядра. Но в deep learning это обычно всё равно называют convolution.

Где используется

Свёрточные слои используются:

  • в CNN;
  • в классификации изображений;
  • в object detection;
  • в segmentation;
  • в обработке медицинских снимков;
  • в анализе микроскопии;
  • в обработке сигналов;
  • в некоторых моделях для последовательностей;
  • в генеративных моделях изображений.

Свёртки особенно полезны, когда важны локальные паттерны и их положение может немного меняться.

Связанные архитектуры

Свёрточный слой — базовый блок CNN.

В типичной CNN рядом со свёртками могут использоваться:

Свёрточные идеи также используются в:

Типичные ошибки понимания

Путать свёртку и полносвязный слой

Полносвязный слой соединяет каждый входной признак с каждым выходным. Свёрточный слой смотрит на локальные участки и переиспользует один и тот же фильтр в разных местах.

Думать, что фильтр задаётся вручную

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

Забывать про каналы

Для RGB-изображения вход имеет несколько каналов. Фильтр учитывает не только высоту и ширину, но и глубину входа.

Путать число фильтров и размер фильтра

Размер фильтра определяет локальное окно, например 3×3.

Число фильтров определяет количество выходных каналов.

Считать pooling частью свёртки

Pooling часто используется рядом со свёрткой, но это отдельная операция. У max pooling обычно нет обучаемых параметров.

Игнорировать padding и stride

Padding и stride сильно влияют на размер выхода. Ошибка в этих параметрах может привести к несовместимым формам тензоров.

Минимальный пример

Пусть есть grayscale-изображение 3×3 и фильтр 2×2.

Вход:

Фильтр:

Первый элемент выхода:

Следующие элементы получаются тем же фильтром, сдвинутым вправо и вниз.

Именно поэтому свёртка может найти один и тот же паттерн в разных частях изображения.

Связанные понятия

Что знать перед этим

Связанные заметки