Итак, последние два дня мне было трудно понять операцию Transpose Convolution. Но я наконец понял это, и сегодня мы собираемся обучить простую CNN с двумя сверточными слоями, как показано ниже.

Забавная история о том, где я получил ответ.

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

Но на том ужине меня наконец осенило.

Глядя на мозоли на моей тарелке, я понимаю, что все это время я пытался понять процесс обратного распространения в CNN как деконволюцию. Это было моим изначальным мышлением.

Пусть Red Box будет 2 * 2 Выходное изображение
Пусть Green Box будет 3 * 3 ядра
Пусть Blue Box будет 4 * 4 Входное изображение

«Так как мы получаем выходное изображение 2 * 2 после выполнения свертки на изображении 4 * 4, то при выполнении обратного распространения нам нужно выполнить некоторую операцию с выходным изображением 2 * 2, чтобы получить изображение, которое имеет 4 * 4 Размер. "

Но мозоли (LOL) заставили меня понять, что наша цель не в том, чтобы восстановить исходное изображение. Скорее, мы пытаемся получить частоту ошибок по отношению к каждому весу в сети. А в случае многослойной CNN нам нужно распространить эту ошибку обратно. Итак, ха-ха, вот где я получил свое решение, и позвольте мне «попытаться» объяснить, что я имею в виду, на конкретном примере и коде.

Сетевая архитектура

Как видно выше, сетевая арка очень проста, всего два слоя свертки и один слой полностью связанного слоя. Обратите внимание: при выполнении свертки нам необходимо транспонировать (повернуть) ядро ​​на 180 градусов, поэтому обратите внимание на зеленые прямоугольники на фотографии выше.

Также обратите внимание, что я не рисовал слой активации для простоты. Но в интерактивном коде я использовал tanh () или archtan ().

Если вы не уверены насчет поворота матрицы, прочтите эту статью.

Прямая подача Операция

** ОБНОВЛЕНИЕ ** Я сделал ошибку в столбце, два столбца, указанные зелеными стрелками, должны быть переключены. Спасибо, Абрахам Кан, за указание.

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

Обратное распространение по отношению к зеленой массе

Желтый прямоугольник означает скорость обучения, а также все обратное распространение является стандартным процессом. И я также записал уравнение обновления градиента. Наконец, обратите внимание на символ «k» в красном квадрате, я буду использовать этот символ снова и снова для обозначения (Out - Y).

Обратное распространение по отношению к красной массе

Красный ящик → (Out - Y)
Желтый ящик → Скорость обучения
Черный ящик → Поворот ядра на 180 градусов (или транспонирование) перед операцией свертки - Помните, что в операции свертки мы вращаем ядро.

Все очень просто и понятно, кроме Purple Boxes, что это делает?

Пурпурная рамка → Поворот матрицы для соответствия вычислению производной уважения для каждого веса.

Возникает вопрос, почему? Почему мы это делаем?

Помните, я говорил вам, ребята, обращать внимание на ввод каждого слоя? Что ж, давайте вернемся еще раз.

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

Оранжевая рамка → входные данные, умноженные на красную букву W (2,2)
Светло-зеленую ячейку → входные данные, умноженные на красную букву W (2,1 )
Синяя рамка → входные данные, умноженные на красную букву W (1,2)
Розовая ячейка → входные данные, умноженные на красную букву W (1,1)

Отлично, это было легко, но какое это имеет отношение к транспонированию ядра? Что ж, давайте сделаем это, поскольку (пожалуйста, посмотрите на уравнение в черном ящике) Out можно записать в одну строку, давайте возьмем производную относительно красных весов, как показано ниже.

** ОБНОВЛЕНИЕ ** 8 апреля - Спасибо Dae Woo и Abraham kang за указание на ошибку, была небольшая ошибка в координатах.

Цифры в темно-зеленых рамках → Извините, у меня нет зеленой ручки, но они обозначают зеленые веса.

Как видно, если взять производную по каждому красному весу, мы можем увидеть, что координаты ХХ различаются от одного ввода к другому. Нам нужно сопоставить эти координаты относительно каждого веса, поэтому мы поворачиваем (транспонируем) матрицу на 180 градусов.

Обратное распространение в соответствии с синим грузом, часть 1

Синяя рамка → вычисленная свертка между (K * зеленый вес) и (заполненный красным весом)
Оранжевая рамка → снова поворот матрицы для получения производной зависимости для каждого Вес.
Черный ящик → Та же история, ядро ​​вращается перед операцией свертки.

Теперь возникает вопрос, почему именно Padding (Purple Box)? Зачем нам нужно набивать красную гирю?

Хороший вопрос, я немного объясню, но пока, пожалуйста, просто прочтите его.

Обратное распространение в соответствии с синим грузом, часть 2

Синий ящик → Расчетная матрица в части 1.
Черный ящик → Транспонирование ядра перед операцией свертки.
Оранжевый, Светло-зеленый, Синий , Розовая рамка → Расчет для каждой производной по каждому синему весу.

Выше более подробно показано повернутое ядро ​​при выполнении операции свертки. Но теперь давайте еще раз взглянем на исходные данные.

Еще раз, поскольку Out можно записать в одну строку, давайте возьмем производную от Blue Weights, как показано ниже.

Номер в зеленой рамке → Еще раз, извините, у меня не было зеленой ручки
Оранжевая рамка → Рассчитанный градиент по весу синего цвета (2,2)
Pink Box → Расчетный градиент относительно синего веса (1,1)

Итак, мы снова повернули (или транспонировали) матрицу, чтобы она соответствовала градиенту для каждого веса.

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

Интерактивные функции активации кода

Зеленый ящик → Производная функций активации, поскольку они имеют одинаковую размерность, мы можем просто выполнить поэлементное умножение

Красный прямоугольник → поворот ядра в соответствии с градиентом

Синяя рамка → Заполните красную гирю (обозначенную W2) нулями.

Интерактивный код

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

Заключительные слова

Было очень приятно понять обратное распространение в CNN, я изо всех сил пытался понять эту концепцию в течение двух дней. И я бы не смог этого сделать, если бы меня не пригласили на выпускной ужин @Sarah__Asiri, спасибо, Сара!

Если будут обнаружены какие-либо ошибки, напишите мне по адресу [email protected].

Тем временем подпишитесь на меня в моем твиттере здесь и посетите мой веб-сайт или мой канал Youtube для получения дополнительной информации. Я также сделал сравнение Decoupled Neural Network здесь, если вам интересно.

Ссылка

  1. Д. (2015, 25 октября). Вращение матрицы и транспонирование матрицы. Получено 28 января 2018 г. с сайта http://techieme.in/matrix-rotation/.
  2. Что такое деконволюционные слои? (нет данных). Получено 28 января 2018 г. с сайта https://datascience.stackexchange.com/questions/6107/what-are-deconvolutional-layers.
  3. Http://courses.cs.tau.ac.il/Caffe_workshop/Bootcamp/pdf_lectures/Lecture%203%20CNN%20-%20backpropagation.pdf
  4. Дюмулин В., Висин Ф. (2016). Руководство по сверточной арифметике для глубокого обучения. Препринт arXiv arXiv: 1603.07285.
  5. Https://www.cc.gatech.edu/classes/AY2018/cs7643_fall/slides/L7_cnns_annotated.pdf

Эта история опубликована в The Startup, крупнейшем предпринимательском издании Medium, за которым следят более 295 232 человека.

Подпишитесь, чтобы получать наши главные новости здесь.