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

Во-первых, немного мотивации по этой теме…

Мотивация

Необходимо понимать разницу между сверткой и кросс-корреляцией, чтобы понимать обратное распространение в CNN, что необходимо для понимания деконвнетов (метод визуализации CNN), что необходимо для понимания разницы между деконвнетами и Карты значимости (больше визуализации), которые необходимы для понимания управляемого обратного распространения ошибки (больше визуализации), что необходимо для понимания Grad-CAM (больше визуализации), что необходимо для понимания сетей управляемого вывода внимания ( метод, созданный на основе Grad-CAM, который включает новый способ тренировки карт внимания). Таким образом, хотя свертка против взаимной корреляции может поначалу показаться не по теме, эта статья на самом деле все еще является частью серии о тепловых картах CNN.

Для обзора CNN см. Введение в сверточные нейронные сети.

Теперь, когда вы очень мотивированы, давайте приступим!

Общая информация

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

Отслеживание индексов

Чтобы примеры и уравнения свертки и взаимной корреляции были понятны, нам необходимо отслеживать индексы изображений, индексы ядра и индексы вывода.

Во-первых, вот рисунок, который обычно используется для объяснения свертки, на котором ядро ​​(желтое) скользит по изображению (зеленое) для получения результата (розовое):

(Источник изображения: эта анимация появляется во многих местах, в том числе здесь и здесь.)

Когда мы индексируем изображение, какой пиксель мы называем [0,0]? Мы могли выбрать верхний левый угол, или центр, или любой другой произвольный пиксель. Аналогично, что мы называем [0,0] в ядре или на выходе?

Для изображения, ядра и вывода мы будем называть центральный элемент [0,0]. Это решение важно для правильной работы формул.

Свертка

Настройка свертки: запись и уравнение

В сети есть МНОГО уравнений для свертки, все с разными обозначениями и индексами. Например:

В оставшейся части этого сообщения мы будем использовать следующую нотацию, в которой изображение обозначается как x, ядро ​​- как h, а вывод - как y:

Это обозначение, которое использовал Сон Хо Ан в своем полезном посте о двумерной свертке.

Звездочка * используется для обозначения операции свертки. Таким образом, x [m, n] * h [m, n] означает, что мы сворачиваем изображение x с ядром h , чтобы найти значение, которое входит в вывод y в позиции [m, n]. Суммы превышают i и j, которые индексируются в пикселях изображения.

Вот рисунок ядра (фильтра), на котором мы видим, что центр ядра находится на [0,0], как мы решили ранее. m (красный) индексирует по столбцам по горизонтали, а n (зеленый) индексирует по вертикали по строкам ядра:

Индексы элементов ядра показаны слева красным и зеленым цветом. Фактические числовые значения ядра представлены как переменные a, b, c, d, e, f, g, h и i, показанные справа. (Эти числовые значения в ядре - это то, что CNN изучает в процессе обучения.)

Наконец, вот изображение x размером 7 на 7, проиндексированное от -3 до 3:

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

Для этого фрагмента изображения я выписал индексы каждого пикселя. Это не значения пикселей - это просто координаты [i, j] каждого пикселя. Вы можете представить это изображение с произвольными значениями пикселей, потому что в нашем примере нам не потребуются значения пикселей изображения.

Пример свертки (математика)

Напомним уравнение для свертки:

Изначально это предполагает, что для получения значения по индексу [m, n] в выходных данных y нам нужно просмотреть все пиксели изображения. В конце концов, i и j индексируются в изображении, и суммы идут по значениям i и j от минус бесконечности до положительной бесконечности.

Однако на самом деле нам не нужны все пиксели, потому что для определенных выходных индексов m и n выбор определенных индексов i и j приведет к доступу к несуществующим элементам ядра. Итак, мы собираемся закончить рассмотрение только тех пикселей изображения, для которых ядровая часть уравнения h [m-i, n-j] все еще действительна. Чтобы проиллюстрировать этот эффект, в приведенном ниже примере я включил индексы пикселей i = 3 и j = 3; вы можете видеть, что для выбранного выходного элемента y [m = 1, n = 1] выбор i = 3 или j = 3 приводит к попытке доступа к несуществующему элементу ядра ( например, элемент ядра (1,2); обратитесь к изображению ядра ранее, и вы увидите, что его индексы меняются только от -1 до +1). Таким образом, мы не указываем явно, какие индексы изображений i и j необходимы для каждой части выходной карты; это подразумевается в формуле, основанной на том, какой выбор i и j приведет к приемлемому доступу ядра.

(Обратите внимание, что вместо суммирования от «минус бесконечности к положительной бесконечности», что немного странно, поскольку ни одно изображение не имеет бесконечного размера, мы могли бы вместо этого написать «-k to + k», но это имеет недостаток, подразумевающий фиксированный размер входного изображения kxk .)

Без лишних слов, вот отработанный пример свертки для создания выходной записи y [m = 1, n = 1]:

Что здесь происходит?

Прежде всего, мы пытаемся найти значение в одном месте выходной карты y, заданном индексами m = 1, n = 1; мы хотим найти y [1,1]. Для простоты я не показал каждую возможную комбинацию значений пикселей i и j (от -3 до +3), потому что это было бы действительно загромождено, и все те, которые я не показывал, являются «недействительными» (т. Е. им нужны индексы ядра, которых не существует.)

По центру изображения проходит синяя линия. Слева от синей линии у нас есть значения m, n, i и j, систематически подключенные прямо к уравнению свертки. Справа от синей линии мы «решили» выражение слева, чтобы получить окончательные индексы h [#, #], которые мы умножаем на этот конкретный пиксель x [#, #].

Пример свертки (рисунок)

Приведенные выше уравнения могут показаться сплошной чепухой, но если мы сгруппируем их в одну картину, мы внезапно сможем понять, почему они крутые. На рисунке ниже я показываю правый нижний угол изображения x с явно записанными соответствующими пиксельными индексами. Затем я сопоставил ядро ​​h с изображением в соответствующем месте и использовал результат уравнения свертки для заполнения индексов ядра h [ #, #] так, чтобы правый h [#, #] совпадал с правым x [#, #]. Наконец, я сослался на исходное изображение ядра (ранее в этом посте), чтобы выяснить, какие числовые значения ядра (a, b, c и т. Д.) Соответствуют каким индексам ядра… и VOILA !!! Мы показали, что свертка «переворачивает ядро»:

Итак, если вы когда-нибудь читали что-нибудь о том, как «настоящая свертка использует перевернутое ядро», теперь вы понимаете, почему, в математике.

Кросс-корреляция по сравнению со сверткой

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

Как видите, ключевое различие - знак плюс и минус в выражении h [mi, nj] или h [m + i, n + j]. . Это одно различие заканчивается тем, что (а) перевернуто ли ядро ​​и (б) какие пиксели обрабатываются для каждого элемента выходной карты.

На рисунке выше мы видим следующее:

  • Чтобы получить выходное значение при y [m = 1, n = 1] для взаимной корреляции, нам нужно посмотреть на пиксели, заключенные в рамку зеленый (потому что это единственные пиксели, для которых имеют смысл индексы ядра.)
  • Однако, чтобы получить выходное значение при y [m = 1, n = 1] для свертки, нам нужно посмотреть на другой набор пикселей, заключенный в рамку красный (потому что теперь это единственные пиксели, для которых имеют смысл индексы ядра.)
  • Оказывается, если мы хотим создать один проработанный пример с использованием одного и того же фрагмента входного изображения, этот же фрагмент входного изображения соответствует разным частям выходной карты для свертки и взаимной корреляции. Это потому, что свертка начинается в правом нижнем углу и идет снизу вверх / вправо-влево, а взаимная корреляция начинается в верхнем левом углу и идет сверху вниз / влево-вправо. Таким образом, часть изображения, на которой мы сфокусированы - часть, выделенная красным - соответствует выходу свертки y [1,1], но выходу взаимной корреляции y [-1, -1].

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

Кросс-корреляция

Пример взаимной корреляции (математика)

Наконец, с этим фоном, вот наш рабочий пример для «красного пятна» изображения, на котором мы сосредоточены. При взаимной корреляции этот патч используется для поиска выходных данных при y [m = -1, n = -1]:

Пример взаимной корреляции (рисунок)

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

Резюме

Свертка и взаимная корреляция включают в себя перемещение ядра по изображению для создания вывода.

  • В свертке ядро ​​переворачивается
  • При взаимной корреляции ядро ​​не переворачивается
  • Большинство анимаций и объяснений свертки на самом деле представляют взаимную корреляцию, а большинство реализаций «сверточных нейронных сетей» фактически используют взаимную корреляцию. В контексте машинного обучения это не влияет на производительность модели, потому что веса CNN просто перевернуты.

Чтобы формулы хорошо отображались в примере, вам необходимо:

  • (1) Правильно выберите индексы. Каждый центральный элемент изображения, ядра и вывода - [0,0]
  • (2) Имейте в виду, что фиксированный фрагмент изображения соответствует различным индексам выходной карты в свертке и взаимной корреляции. Это происходит потому, что при свертке ядро ​​проходит изображение снизу вверх / вправо-влево, а при взаимной корреляции ядро ​​проходит изображение сверху вниз / влево-вправо.

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

использованная литература

О избранном изображении

Источник изображения: Пегги Бэкон в воздухе сальто назад. Помните… настоящая свертка переворачивает ядро.

Первоначально опубликовано на http://glassboxmedicine.com 26 июля 2019 г.