Глубокое обучение: понимание теории для лучшей практики

Прямое и обратное распространение для 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), но во многих статьях эти моменты уже обсуждались, и поэтому я рекомендую вам прочитать их, прежде чем вы начнете реализовывать свои собственные сверточные слои.

Источники

[1] Дюмулин В., Висин Ф. (2016). Руководство по сверточной арифметике для глубокого обучения (цит. Из архива: 1603.07285)

[2] Примечания к классу корреляции и свертки для CMSC 426, осень 2005 г., Дэвид Джейкобс

[3] Учебник UFLDL по сверточным нейронным сетям

[4] Обратное распространение в сверточных нейронных сетях, Джефкин, 5 сентября 2016 г.

Желаю удачи в реализации этих алгоритмов!

Ваше здоровье,

Тристан