Для тех из нас, кто занимается математической строгостью в сообществе науки о данных / машинного обучения, может быть неприятно найти доказательство некоторых алгоритмов / формул, с которыми мы сталкиваемся. В частности, я помню, что один из них не имел успеха в Интернете, поэтому я подумал, что будет разумно объяснить его здесь. Этот пост будет посвящен обратному распространению в слоях свертки вашей нейронной сети и тому, как вычислять градиенты относительно весов, смещений и входных данных. Что касается обозначений в следующем доказательстве, я обычно использую «h» в нижнем индексе для обозначения «высотной» [вертикальной] координаты пикселя, а «w» — для обозначения «ширинной» [латеральной] координаты (я буду использовать «b », а также «а»). Верхний левый пиксель изображения I будет обозначаться как I[0, 0]. Точно так же верхний левый пиксель ядра K будет обозначаться K[0, 0] (я знаю, что это противоречит, возможно, более популярному соглашению, где центральному пикселю присваивается координата [0, 0], хотя мое выравнивание по соглашению будет как массивы хранятся в памяти компьютера, так будет естественнее реализовать в коде). Как для I, так и для K потребуется больше координат для учета каналов и количества изображений в пакете. Давай начнем.

Введение.

Мы определяем взаимную корреляцию (обычно я буду называть ее просто корреляцией) как картину «скользящего ядра», с которой знакомо большинство из нас; однако неправильно называть это сверткой, поскольку для этого требуется перевернуть ядро ​​​​на 180 градусов перед скольжением.

Я предполагаю, что читатели знакомы с такими понятиями, как шаг и расширение, хотя поиск в Google фактически может помочь в этом случае тем, кто нуждается в освежении знаний. Я не сказал, для каких значений «y», «x» справедлива приведенная выше корреляция, хотя легко показать, что A будет иметь пространственную размерность

я кладу

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

Градиент потерь по ядрам K.

Давайте [пере]определим A, чтобы включить смещение E, константу, данную каждому ядру в пакете ядер, так что теперь A представляет выходные данные текущего уровня.

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

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

Чтобы получить вышеизложенное, мы просто берем производную пикселя A (то есть A[w, z, y, x]) по K[z_0, k_0, b_0, a_0], что дает нам коэффициент позади этот конкретный пиксель. Приведенное выше уравнение может занять несколько минут, чтобы прочитать его из-за всех индексов, но в конечном итоге вы должны осознать простоту только что вычисленной производной. Также обратите внимание, что суммирование по D каналам A удалено, так как мы имеем дело с градиентом относительно пикселя в канале z_0 K. Перестановка последнего выражения дает нам

но поймите, что это просто формула для взаимной корреляции, где ядро ​​​​является тензором, состоящим из каждого канала z_0 восходящего [пакетного] градиента, с «изображением» в качестве фактического изображения I,хотя теперь с шагом, заданным предыдущим расширением, и расширением, заданным предыдущим шагом.

Градиент потерь по отношению к изображениям I.

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

Лемма о перекрестной корреляции:

Идея проста; чтобы выразить взаимную корреляцию как аналогичную операцию с I в качестве ядра, мы сдвигаем I вместо K, но для достижения такой операции мы должны соответствующим образом дополнить K нулями, поскольку пространственные размеры I больше, чем у K. Пусть Теперь докажем теорему.

Манипуляции с верхними пределами раскрывают знакомый термин:

Мы можем изменить верхние пределы, учитывая, где ядро ​​равно нулю:

Аналогично меняем и нижние пределы:

Теперь переставляем,

Теперь у нас есть возможность найти градиент по отношению к изображениям. По цепному правилу:

где мы вспоминаем

Настроим A’ по лемме о переключателях:

На этом можно было бы остановиться, хотя было бы неплохо выразить результат через K как ядро.

Мы можем упростить размеры расширенного восходящего градиента:

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

Член градиента восходящего потока был «перевернут» в результате замены. Формально дадим следующее определение:

Мы получаем

Лемма о переключении теперь применима.

По лемме о переключателях:

Мы не инвертируем член восходящего градиента:

Теперь мы видим, что размерность ядра появляется в восходящем градиенте, но мы хотели бы, чтобы они отображались в термине ядра:

Отметив, где термин ядра равен нулю [и не равен нулю], мы можем изменить пределы и заменить его расширенным ядром в соответствии с определением:

Упрощение дает

Добавление нижнего предела к условиям для замены нижнего предела нулем дает:

Делаем наблюдение.

Мы получаем

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

Градиент потерь относительно смещения E.

поэтому градиент представляет собой просто сумму всех элементов в z^th канале каждого восходящего градиента в пакете.

КЭД.