Convolution 과정에서 Padding은 반드시 필요하다. 왜 그러한지 살펴보도록 하자.
예를 들어 6x6 크기의 이미지가 있고, 이것을 3x3 Filter로 Convolution 하고 난 아웃풋 이미지의 사이즈는 4X4 가 될 것이다. 3x3 Filter가 6x6의 이미지 내에서 차지할 수 있는 포지션이 총 4x4라는 얘기이다.
(일반적으로 nxn 사이즈 이미지, f x f 사이즈의 Filter로 Convolusion 한 이미지의 사이즈는 n-f+1 x n-f+1로 계산이 가능하다. )
문제는 이렇게 몇 차례만 Convolution 하게 되면 초반부터 아웃풋 이미지가 너무 작아져 버린다는 것이다. 즉 정보가 너무 축소되버린다는 얘기이고, 이것은 뉴럴 네트워크의 성능에 악영향을 끼치게 되는 상황이다.
그래서 Padding을 이용한다. 예를 들어 6x6 이미지에 1만큼의 Padding을 준다고 하면, 이는 즉 6x6 이미지의 외곽을 빙 둘러서 1 픽셀씩 더 크게 만든다는 얘기이다. 그리고 일반적으로 추가된 1 Pixel에는 0의 값을 주며, 이를 zero Padding이라고 한다.
이렇게 1만큼의 Padding을 주고 난 후 이미지 사이즈는 8x8이 된다. 그리고 이를 3x3의 Filter로 다시 Convolution 하고 나면 이미지 사이즈는? 그대로 6x6의 사이즈를 유지할 수 있게 된다. 즉 정보의 크기를 그대로 유지할 수 있는 것이다. (참고로 Padding이 있는 경우 Convolution 한 이미지 사이즈는 n+2p-f +1로 계산할 수 있다).
그리고 원래 Padding 전 모서리 부분 픽셀(녹색 빗금)과 중간 부분의 픽셀(빨간색 빗금)을 비교해보자. Padding 전에는 녹색 Edge 픽셀의 정보는 딱 1번 밖에 이용되지 못한다. 3x3의 필터가 우측으로 1번만 옮겨도 Edge 픽셀은 더 이상 활용될 수가 없는 것이다. 반면에 중간의 빨간색 픽셀은 3X3 필터가 여러 차례 지나가는 곳이고, 다시 말해 Convolution 과정에서 여러 차례 정보를 충분히 이용할 수 있는 픽셀이다. 만약 이 모서리 부분 녹색 픽셀에 중요한 정보가 담겨있었다면? Convolution 과정에서 이 정보는 확연하게 소실되어 버리므로 제대로 된 CNN을 구성하기가 어려워진다.
이럴 때 Padding을 이용하게 되면 녹색 모서리 픽셀 부분에 3x3 필터가 여러 차례 지나가게 만들 수 있고, 결과적으로 Edge나 모서리 부분의 픽셀 정보도 충분히 활용할 수가 있는 것이다.
Convolution에는 크게 두 가지 종류가 있다고 보면 된다. 하나는 Padding 없이 바로 필터를 적용하는 Valid Convolution, 그리고 다른 하나는 Padding을 적용해서 아웃풋 이미지의 사이즈를 동일하게 유지시켜 주는 Same Convolution이다.
Same Convolution을 만들어 주는 Padding 값을 구하는 것은 간단하다. 예를 들어 nxn의 이미지에 p 만큼의 padding을 주고 f x f 필터로 Convolution 하는 경우, 아웃풋 이미지 사이즈는 n+2p-f+1 x n+2p-f+1 이 된다. 인풋과 아웃풋이 Same이 되려면 n+2p-f + 1 = n 이 되면 되고, 결국 p = (f-1)/2 가 되는 것이다. 필터 행렬의 크기에 따라 Same Convolution 을 만들어 주는 Padding 값이 달라지고, 이는 위와 같이 간단한 수식으로 구할 수 있다.
마지막으로 Convolution에 쓰이는 필터의 경우 대부분 1x1, 3x3, 5x5와 같은 홀수 사이즈의 필터가 쓰이는데, 그 이유는 일반적으로 Convolution에서 중앙 픽셀의 정보를 가지는 것이 위치를 정의할 수 있는 요소가 되므로 그렇다.
자료 출처
https://www.coursera.org/learn/convolutional-neural-networks/lecture/o7CWi/padding