Search
Duplicate

머신러닝 및 딥러닝 1/ Lecture 4. Convolutional Neural Networks

위와 같이 모든 노드들이 그 다음 모든 노드와 연결된 것을 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 크기는 32×32×1032 \times 32 \times 10이 되고
가로가 5인 것을 가로가 32인 이미지에 패딩이 2가 추가되었으므로 (좌우로 총 4) 36이 되고 stride가 1이므로 filter는 가로로 총 32번 움직이게 된다. (325+2×2)÷1+1=32(32 - 5 + 2 \times 2) \div 1 + 1 = 32
이것은 ㅇ세로에 대해서도 동일하므로 32가 되고,
채널이 필터의 개수가 10개 이므로 최종적으로 32×32×1032 \times 32 \times 10가 됨
파라미터의 개수는 (5×5×3+1)×10=720(5 \times 5 \times 3 + 1) \times 10 = 720이 된다.
파라미터의 개수는 필터의 크기에 의해 결정되므로 5×5×35 \times 5 \times 3이 되는데 여기에 bias로 1을 추가해 주고, 그러한 필터를 총 10개를 사용하므로 10을 곱해줘서 최종적으로 (5×5×3+1)×10=720(5 \times 5 \times 3 + 1) \times 10 = 720가 된다.
만일 이것을 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 구조는 위와 같다.