•
위와 같이 모든 노드들이 그 다음 모든 노드와 연결된 것을 Fully-connected Layer라고 한다.
•
연산은 위와 같이 된다.
•
Fully-connected Layer의 연산을 간단히 하기 위해 Vector로 늘어 놓고 연산을 했지만, 개념적으로는 모든 노드의 연산이 최종 output에 영향을 미친다고 이해할 수 있다.
•
만일 이미지에서 눈을 찾는다고 생각할 때, 이미지의 모든 픽셀에 대해 연산하는 것보다는 눈에 해당하는 적절한 Filter를 만들고 그게 이미지 내의 어디에 위치하는지를 찾는게 더 효율적이라고 생각할 수 있음.
◦
Filter를 만드는 것이 어려운 것이지만 일단 만들어졌다고 가정
•
Filter를 만들기 위한 컨셉은 지역적으로 찾는다는 것이다. 눈을 찾으려면 주위의 픽셀만 고려하면 되지, 멀리 떨어진 픽셀을 고려할 필요는 없다.
•
또한 Filter의 위치는 무관하게 찾을 수 있어야 한다. 눈이 이미지 상 어디에 있든 상관없이 찾을 수 있어야 한다.
•
이 2가지 컨셉 덕분에 Fully-connected Layer에 비해 계산량을 많이 줄일 수 있다.
•
32x32의 흑백 이미지가 있다고 가정하자. 적절한 filter를 구성하기 위해 3x3 크기의 filter를 만들고 해당 filter를 이용해서 이미지의 전체 영역에 걸쳐 연산을 수행한다.
•
filter 연산은 다음과 같이 이루어진다. 이미지 내에 filter의 크기에 해당하는 영역에 대해 연산을 수행하고 그 연산의 결과를 하나의 activation으로 구한다.
•
이러한 연산을 이미지 영역에서 1칸씩 움직이면서 반복하면 위와 같이 여러 개의 activation을 구할 수 있다.
•
만일 이미지가 3채널을 가진 컬러 이미지라면 filter도 3개를 만들어준다.
•
채널이 3개이므로 각 채널별로 연산을 하고 그것을 다시 합쳐서 최종적으로 activation을 구한다.
◦
bias를 추가하기 위해 크기에 +1을 추가한다.
•
최종적으로 Convolutional Layer에서 일어나는 연산은 위 그림과 같다.
◦
Filter를 움직여가며 전체 이미지에 대해 연산 결과를 구한다.
◦
계산은 내적으로 이루어지기 때문에 결과값이 높다면 찾고자 하는 패턴일 확률이 높다고 이해할 수 있다.
•
위와 같이 연산할 경우 filter가 1칸씩 이동하기 때문에 최종 activation map은 28x28x1 크기로 만들어진다.
•
Convolution Layer의 강력한 점은 Filter를 여러 개를 쓸 수 있다는 것이다. 만일 위와 같은 상황에서 Filter를 4개를 사용한다면 최종적으로 activation map은 28x28x4의 크기로 만들어진다.
•
Convolution Layer의 또 다른 강력한 점은 위와 같이 만들어진 activation map애 대해 또 Filter 연산을 수행할 수 있다는 점이다.
◦
만일 위와 같은 경우에 대해 5x5x4의 filter를 한 번 더 수행하면 —마찬가지로 1칸씩 이동하면— 두 번째 단계에서 만들어지는 activation map은 24x24x10의 크기가 된다.
•
Filter를 여러 층으로 두는 것은 feature를 Low-Middle-High 레벨로 추출하기 위함이다.
◦
가장 앞단의 Filter는 이미지로부터 가장 기본적인 feature를 추출하고
◦
그 다음 Filter는 그 기본 feature로부터 보다 높은 수준의 feature를 추출하고
◦
그 다음 Filter는 다시 그보다 높은 수준의 feature를 추출한다.
◦
이런 과정을 반복해서 최종적으로 의미를 형성한다.
•
이것은 마치 사람이 사물을 인식하는 것과도 유사하다.
•
이러한 이유로 Deep Neural Network는 대단히 깊은 Layer를 구성한다.
•
위 방법에는 몇가지 문제가 있다.
◦
첫째로 Filter에 Filter를 이어갈 수록 뒤의 Activation map의 크기는 점점 줄어들어서 Layer가 깊어지면 이미지가 남아나지 않을 수 있다.
◦
요즘 이미지들은 해상도가 대단히 높은데 이걸 언제 다 계산하고 있나?
•
7x7 이미지에 대해 3x3 크기의 filter로 한 칸씩 움직여서 activation map을 만드는 과정은 위와 같다. 최종적으로 5x5 크기의 map이 만들어진다.
•
만일 1칸씩 움직이지 않고 2칸씩 움직인다면 최종적으로 3x3 크기의 activation map이 만들어진다.
◦
이렇게 움직이는 크기를 stride라고 한다.
◦
이렇게 하는 것은 1칸씩 움직여도 activation 결과는 큰 차이가 없는 반면, 그 연산량은 많이 줄일 수 있기 때문이다.
•
만일 위 이미지를 3칸씩 움직인다면 움직일 수 없는 영역이 나타난다.
•
activation map의 output 크기는 위와 같이 계산할 수 있다.
•
위와 같이 filter와 이미지 크기를 정하면, stride가 정수로 떨어지지 않는 크기가 발생한다.
•
이런 문제를 해결하기 위해 이미지 테두리에 padding을 추가한다.
◦
padding에는 0 값을 넣기 때문에 zero padding이라고 한다.
◦
이렇게 패딩을 추가하면 앞선 예와 같이 정수로 떨어지지 않아서 문제가 되는 상황을 해결할 수 있다.
•
padding을 추가하면 output 크기를 구하는 계산식이 조금 바뀐다.
◦
padding은 이미지의 좌-우, 상-하에 동일하게 들어가므로 padding의 크기는 x2를 해준다.
•
이미지에 남는 영역이 없도록 filter의 크기를 고려하여 padding의 크기를 정한다.
•
padding을 이용하면 layer가 깊어짐에 따라 activation map의 크기가 점점 작아지는 문제도 해결할 수 있다.
•
32x32x3 이미지에 대하여 5x5 필터 10개를 사용하고, stride는 1, padding은 2를 주었을 때
◦
output 크기는 이 되고
▪
가로가 5인 것을 가로가 32인 이미지에 패딩이 2가 추가되었으므로 (좌우로 총 4) 36이 되고 stride가 1이므로 filter는 가로로 총 32번 움직이게 된다.
▪
이것은 ㅇ세로에 대해서도 동일하므로 32가 되고,
▪
채널이 필터의 개수가 10개 이므로 최종적으로 가 됨
◦
파라미터의 개수는 이 된다.
▪
파라미터의 개수는 필터의 크기에 의해 결정되므로 이 되는데 여기에 bias로 1을 추가해 주고, 그러한 필터를 총 10개를 사용하므로 10을 곱해줘서 최종적으로 가 된다.
•
만일 이것을 convolution layer를 쓰지 않고 fully-connected layer를 사용한다면 훨씬 큰 계산량이 필요 하다.
•
만일 Filter의 크기를 1x1으로 사용한다면 어떻게 될까? 이 경우 전체 이미지의 차원을 조정하는 효과가 발생한다.
◦
공간적인 정보는 건드리지 않고 차원만 수정하고 싶을 때 이것을 사용한다.
•
앞선 내용을 요약하면 위와 같다.
•
Convolution은 Fully-connected의 특수한 경우인데, 거꾸로 Fully-connected는 Convolution의 특수한 경우가 된다.
•
이미지 크기를 적당히 줄여도 feature를 추출하는데 문제가 없고, 이미지가 크면 연산이 오래 걸리기 때문에 이미지를 downsampling 할 수 있다.
◦
이 경우 noise가 줄어들기도 한다.
•
downsampling 하는 방법에는 몇가지 방법이 있다.
◦
Max pooling은 filter 크기 내에 가장 큰 값을 사용하고
◦
average pooling filter 크기의 평균값을 구한다.
•
2x2 크기의 filter를 2칸씩 stride하면서 그 영역 내에 있는 값들에 대해 최대값을 뽑거나 평균값을 뽑는다.
•
Filter 크기와 Stride에 따라 output의 크기는 위와 같이 변한다.
•
Pooling에 대해서는 위와 같이 공식을 적용할 수 있다.
•
Pooling은 이미지를 크기에 대한 것이기 때문에 학습은 0이다.
•
Deep Learning 혁명을 일으켰던 AlexNet의 Layer 구조는 위와 같다.