Для тех из нас, кто занимается математической строгостью в сообществе науки о данных / машинного обучения, может быть неприятно найти доказательство некоторых алгоритмов / формул, с которыми мы сталкиваемся. В частности, я помню, что один из них не имел успеха в Интернете, поэтому я подумал, что будет разумно объяснить его здесь. Этот пост будет посвящен обратному распространению в слоях свертки вашей нейронной сети и тому, как вычислять градиенты относительно весов, смещений и входных данных. Что касается обозначений в следующем доказательстве, я обычно использую «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 канале каждого восходящего градиента в пакете.