Глубокое обучение: понимание теории для лучшей практики
Прямое и обратное распространение для 2D сверточных слоев
Обобщение на многоканальные входы и несколько фильтров
Мотивация
В многочисленных статьях на TowardsDataScience обсуждается обратное распространение для сверточных нейронных сетей.
Они хорошо объясняют простые случаи (например, вход только с одним каналом, только с одним сверточным фильтром одновременно), но мне как-то трудно обобщить реализацию обратного прохода на произвольно выбранные слои.
Чтобы преодолеть эту трудность, я решил вернуться к теоретическому аспекту обратного распространения ошибки. После нахождения этих уравнений реализация стала намного проще.
Эта статья призвана дать вам ключевые уравнения прямого и обратного распространения для многоканальных входных сигналов и сверточных слоев с несколькими фильтрами, а также способы их получения.
Если вас интересуют только результаты, смело делайте выводы!
Несколько определений
Сверточный слой выполняет ... свертки! Затем нам нужно определить полезные математические операторы:
С одной стороны, свертка между изображением произвольного размера и C-каналами с ядром K размера (k1, k2) определяется следующим образом:
С другой стороны, взаимная корреляция между изображением произвольного размера и C-каналами с ядром K размера (k1, k2) определяется следующим образом:
Внимательный взгляд замечает, что свертка изображения с ядром эквивалентна взаимной корреляции изображения с этим ядром, но перевернутой на 180 °:
Следовательно, мы можем напрямую рассматривать перевернутое ядро как ядро, которое мы хотим для свертки, и позволить нашему слою вычислять только взаимную корреляцию .
В этом посте мы будем рассматривать элементы X как трехмерные или четырехмерные массивы:
В случае, когда X имеет 3 измерения, f не появляется в обозначении. Вот и все! Теперь мы можем обсудить сам сверточный слой.
Сверточный слой
Слой преобразует выходные данные предыдущего уровня A_prev с высотой n_H_prev, шириной n_W_prev и C каналов в переменную Z высоты n_H, ширины n_W и F каналов.
Параметры этого слоя:
- Ядра F (или фильтры), определяемые их весами w_ {i, j, c} ^ f и смещениями b ^ f
- Размеры ядра (k1, k2), описанные выше
- Функция активации
- Strides (s1, s2), который определяет шаг, на котором ядро применяется к входному изображению.
- Paddings p1, p2, которые определяют количество нулей, которое мы добавляем на границах A_prev.
Прямое распространение
Сверточный слой пересылает заполненный ввод; поэтому мы рассматриваем A_prev_pad для свертки.
Тогда уравнения прямого распространения:
Обратное распространение
Обратное распространение преследует три цели:
- Распространение ошибки со слоя на предыдущий
- Вычислить производную ошибки по весам
- Вычислить производную ошибки по смещениям
Обозначение
Для удобства обозначений определим:
Математика!
На практике мы выполняем обратный проход слоя, всегда зная da_ {i, j, f} или dz_ {i, j, f}, и предполагаем, что знаем da_ {i, j, f } для этого случая.
Выражение dz_ {i, j, f} затем дается формулой. [2]:
Где g ’- производная от g.
Используя цепное правило, мы можем вычислить dw_ {i, j, c} ^ f:
Вспоминая, что dz_ {m, n, k} связан только с k-м фильтром (заданным уравнением [1]), веса f-го ядра связаны только с f-м каналом dz;
Затем мы можем получить dz_ {m, n, f} / dw_ {i, j, c} ^ f, используя уравнение. [1]:
Выражение уравнения. [5] тогда:
Можно заметить, что это взаимная корреляция A_prev_pad с ядром dZ
Такая же процедура применяется для смещения:
И поэтому:
Последнее, что нужно выполнить, - это обратное распространение ошибки: найти связь между dA_prev и dZ.
Помня, что у нас есть связь между dZ и дополненной версией dA_prev (приведенной в уравнении [1]), мы рассмотрим вычисление da_prev_pad.
Используя цепное правило (снова!), Мы имеем:
Мы распознаем dz_ {m, n, f} как первый член суммы, это хорошо. Давайте сосредоточимся на втором термине:
Что не равно нулю тогда и только тогда, когда m ’+ m = i, n’ + n = j и c ’= c.
Следовательно:
И так,
Мы замечаем, что уравнение. [9] описывает свертку, в которой фильтры слоя считаются изображением, а dZ - ядром.
Наконец, мы получаем da_prev_ {i, j, c}, выбирая da_prev_pad_ {i + p1, j + p2, c}, p1 и p2 - значения заполнения вокруг первого и второго измерений для этого слоя.
Вывод
В этой статье вы увидели, как вычислить прямое и обратное распространение для сверточного слоя с произвольным количеством фильтров и входных каналов.
Прямой проход задается двумя уравнениями:
Чтобы вычислить обратное распространение сверточного слоя, вам нужно всего лишь реализовать эти четыре уравнения:
В этой статье можно было бы осветить и другие детали (например, как вычислить значения для n_H и n_W), но во многих статьях эти моменты уже обсуждались, и поэтому я рекомендую вам прочитать их, прежде чем вы начнете реализовывать свои собственные сверточные слои.
Источники
[2] Примечания к классу корреляции и свертки для CMSC 426, осень 2005 г., Дэвид Джейкобс
[3] Учебник UFLDL по сверточным нейронным сетям
[4] Обратное распространение в сверточных нейронных сетях, Джефкин, 5 сентября 2016 г.
Желаю удачи в реализации этих алгоритмов!
Ваше здоровье,
Тристан