Обратное распространение в CNN

алгоритм

Это 15-й день моего участия в августовском испытании обновлений. Ознакомьтесь с подробностями мероприятия: Испытание августовского обновления

Обратное распространение слоя пула

Мы знаем, что операция объединения изменит размер карты объектов.2×22\times 2объединение, предполагаяl+1l+1Карта объектов слоя имеет 16 градиентов, затем первыйllСлой должен потребовать 64 градиента.Метод очень прост.Вам нужно только передать градиент от 1 пикселя назад к 4 пикселям, но убедитесь, чтоСумма пройденных градиентов не меняется. Из-за этого принципа обратное распространение среднего пула и максимального пула не одно и то же.

1. avg pooling

Прямое распространение avg pooling заключается в суммировании и усреднении значений в патче (окне). Затем процесс обратного распространения состоит в том, чтобы разделить градиент элемента на n равных частей и назначить их предыдущему слою, что гарантирует гарантированный градиент до и после объединения.Сумма градиентов остается неизменной, что относительно легко понять, как показано на рисунке ниже.

avg pooling легко неправильно понять, что градиент напрямую копируется N раз, но это приведет к тому, что сумма потерь станет в N раз больше исходной, и в сети произойдёт взрыв градиента

2. max pooling

Максимальное объединение также должно удовлетворять принципу неизменности суммы градиентов.Прямое распространение максимального объединения заключается в передаче наибольшего значения в патче следующему слою, а значения других пикселей напрямую отбрасываются. Затем обратное распространение заключается в передаче этого градиента непосредственно пикселю в предыдущем слое, а другие пиксели не принимают градиент, равный 0. Разница между операциями max pooling и avg pooling заключается в том, что когда необходимо записать объединение, какой пиксель имеет наибольшее значение, то естьmax_id, вы можете увидеть pooling_layer.cpp исходного кода caffe, ниже приведен исходный код части max pooling каркаса caffe

// If max pooling, we will initialize the vector index part
if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX
    && top.size() == 1) {
	max_idx_.Reshape(bottom[0]->num, channels_, pooled_height_, pooled_width_);
}    

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