Backprop через слои максимального пула?

62

Это небольшой концептуальный вопрос, который мучил меня некоторое время: как мы можем распространяться обратно через слой максимального пула в нейронной сети?

Я наткнулся на слои с максимальным объединением, проходя этот урок для библиотеки nn в Torch 7. Библиотека абстрагирует вычисление градиента и прямые проходы для каждого слоя глубокой сети. Я не понимаю, как вычисляется градиент для слоя с максимальным пулом.

Я знаю, что если у вас есть вход входящий в нейрон i слоя l , то δ i l (определяется как δ i l = Ezililδil ) определяется как: δil=θδil=Ezil

δil=θ(zil)jδjl+1wi,jl,l+1

Таким образом, слой с максимальным пулом получит следующего слоя, как обычно; но поскольку функция активации для нейронов с максимальным пулом принимает вектор значений (по которым она достигает максимума) в качестве входных данных, δ i l больше не является одним числом, а вектором ( θδjl+1δilдолжно быть заменено наθ( { z j l } )). Кроме того,θ, будучи функцией max, не дифференцируема по отношению к своим входам.θ(zjl)θ({zjl})θ

Так .... как это должно сработать?

shinvu
источник

Ответы:

58

Нет градиента по отношению к не максимальным значениям, так как их небольшое изменение не влияет на вывод. Кроме того, макс локально линейен с наклоном 1 относительно входа, который фактически достигает макс. Таким образом, градиент от следующего слоя передается обратно только к тому нейрону, который достиг максимума. Все остальные нейроны получают нулевой градиент.

Таким образом , в вашем примере, бы вектор из всех нулей, за исключением того, что я * е место получит значения { δ л + 1 J } , где я * = г г м а х я ( г л я )δili{δjl+1}i=argmaxi(zil)

Abora
источник
7
Ах да, нет никакого смысла в обратном распространении через не максимальные нейроны - это было решающее понимание. Так что, если я теперь понимаю это правильно, обратное распространение через слой max-pooling просто выбирает max. нейрон из предыдущего слоя (на котором был сделан максимальный пул) и продолжает обратное распространение только через это.
Shinvu
Но вам не нужно умножать с производной функции активации?
Джейсон
1
@Jason: функция max локально линейна для активации, которая получила максимум, поэтому ее производная постоянна 1. Для активаций, которые не прошли через нее, она равна 0. Это концептуально очень похоже на дифференцирование ReLU (x ) = max (0, x) функция активации.
Криги
Какой шаг меньше ширины ядра для максимального пула?
Ватсал
1
Отличный ответ! Как насчет граничного случая, когда несколько записей имеют одинаковое максимальное значение (например, 2 значения имеют 0 от ReLU, а два других являются отрицательными)?
DankMasterDan
6

Макс пулинг

Итак, предположим, у вас есть слой P, который идет поверх слоя PR. Тогда прямой проход будет примерно таким:

Pi=f(jWijPRj)

Pi

grad(PRj)=igrad(Pi)fWij

езнак равнояdезнак равно0е'знак равно1е'знак равно0

граммрad(прмaИкс NеUроN)знак равноΣяграммрad(пя)Wя мaИкс NеUроN

граммрad(проTчасерs)знак равно0.

patapouf_ai
источник
2

Ответ @ Shinvu хорошо написан, я хотел бы указать на видео, которое объясняет градиент операции Max (), и это в вычислительном графе, который быстро понять.!

при реализации операции maxpool (вычислительный узел в вычислительном графе - ваша архитектура NN) нам нужна функция, создающая матрицу «маски», которая отслеживает, где находится максимум матрицы. True (1) указывает положение максимума в X, остальные записи - False (0). Мы отслеживаем положение максимума, потому что это входное значение, которое в конечном итоге повлияло на выход, и, следовательно, на стоимость. Backprop вычисляет градиенты по отношению к стоимости, поэтому все, что влияет на конечную стоимость, должно иметь ненулевой градиент. Таким образом, backprop будет «распространять» градиент обратно к этому конкретному входному значению, которое повлияло на стоимость.

ана
источник