Это 15-й день моего участия в августовском испытании обновлений. Ознакомьтесь с подробностями мероприятия: Испытание августовского обновления
Обратное распространение слоя пула
Мы знаем, что операция объединения изменит размер карты объектов.объединение, предполагаяКарта объектов слоя имеет 16 градиентов, затем первыйСлой должен потребовать 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_
Эта переменная записывает позицию максимального значения, потому что она используется при обратном распространении. Процесс прямого распространения и обратного распространения показан на следующем рисунке.