CS231n - lecture 5: convolution neural networks

Nunucoder·2021년 9월 19일
0


지난 몇차례 동안 Neural Networks와 선형 함수들을 살펴보았습니다.
선형 레이어를 쌓고 그 사이에 비선형 레이어를 추가하여
Neural Network를 만들었습니다.또한 NN은 "Mode 문제" 를 해결할 수 있습니다.
가령 다양한 종류의 자동차를 올바르게 분류하기 위해 "중간 단계의 템플릿"을 학습시키는 것이죠. 빨간색 차 노란색 차 등을 말이죠.그리고 이 템플릿들을 결합해서 최종 클래스 스코어를 계산합니다

CNN history


CNN의 역사도 알아볼 것입니다.
우선 1957년으로 돌아가보면, Frank Rosenblatt가
Mark I Perceptron machine 을 개발했습니다.이 기계는 "perceptron"을 구현한 최초의 기계입니다.
"Perceptron"은 우리가 배운 Wx + b 와 유사한 함수를 사용합니다.
하지만 여기에서는 출력 값이 1 또는 0입니다.여기에서도 가중치 W를 Update 하는 Update Rule이 존재합니다.이 Update Rule은 Backprop과 유사합니다.
하지만 당시에는 backprop이라는 개념이 없어서, 단지 W를 이리저리 조절하면서 맞추는 식이었죠

그리고 1960년에는 Widrow와 Hoff가 Adaline and Madaline을 개발했습니다.

이는 최초의 Multilayer Perceptron Network 이었습니다 이 시점에서야 비로소 Neural network와 비슷한 모양을 하기 시작하긴 했지만아직 Backprop같은 학습 알고리즘은 없었습니다.

최초의 Backporp은 1986에 Rumelhart가 제안하였습니다. 보시다시피 우리에게 익숙한
Chain rule과 Update rule을 볼 수 있습니다. 이때 최초로 network를 학습시키는 것에 관한
개념이 정립되기 시작했습니다.

하지만 그 이후로 NN을 더 크게 만들지는 못했습니다.
그리고 한동안은 새로운 이론이 나오지 못했고 널리 쓰이지도 못 했습니다.
그래서 2000년대가 되서야 다시 활기를 찾기 시작했습니다.Geoff Hinton 과 Ruslan Salakhutdinov의 2006년 논문에서 DNN의 학습가능성을 선보였고 그것이 실제로 아주 효과적이라는 것을 보여주었습니다. 하지막 그 때 까지도 아직 모던한 NN는 아니었습니다.
backprop이 가능하려면 아주 세심하게 초기화를 해야 했습니다. 그래서 여기에서는 전처리 과정이 필요했고 초기화를 위해 RBM을 이용해서 각 히든레이어 가중치를 학습시켜야 했습니다. 이렇게 초기화된 히든 레이어를 이용해서 전체 신경망을 backprop하거나 fine tune하는 것이었습니다.

실제로 NN의 광풍이 불기 시작한 때는 2012년 이었습니다.
NN이 음성 인식에서 아주 좋은 성능을 보였습니다. 이는 Hintin lab에서 나온 것인데 acoustic modeling과 speech recognition에 관한 것이었습니다. 또한 2012년에는 Hinton lab의 Alex Krizhevsky에서 영상 인식에 관한 landmark paper가 하나 나옵니다. 이 논문에서는 ImageNet Classification에서 최초로 NN을 사용했고, 결과는 정말 놀라웠습니다. AlexNet은 ImageNet benchmark의 Error를 극적으로 감소시켰습니다.
그 이후로 ConNets은 아주 널리 쓰이고 있습니다.

다시 돌아가서 구체적으로 "CNN이 어떻게 유명해졌는지"
에 대해 한 번 알아보도록 하겠습니다.
다시 1950년대로 돌아가보면 Hubel과 Wiesel이 일차시각피질의 뉴런에 관한 연구를 수행했습니다. 고양이에게 실험을 했습니다. 첫 수업에서도 이야기하긴 했지만, 고양이의 뇌에 전극을 꽂았습니다. 그리고 고양이에게 다양한 자극을 주며 실험을 했습니다.
이 실험에서 뉴런이 oriented edges와 shapes같은 것에
반응한다는 것을 알아냈습니다.

그중 하나는 바로 피질 내부에 지형적인 매핑(topographical mapping)이 있다는 것입니다.
피질 내 서로 인접해 있는 세포들은 visual field내에 어떤 지역성을 띄고 있습니다.
오른쪽 그림은 보면 해당하는 spatial mapping을 볼 수 있습니다. 그리고 중심에서 더 벗어난 파란색 지역도 볼 수 있습니다.또한 이 실험에서 뉴런들이 계층구조를 지닌다는 것도 반견했습니다.

다양한 종류의 시각자극을 관찰하면서 시각 신호가 가장 먼저 도달하는 곳이 바로 Retinal ganglion 이라는 것을 발견합니다. Retinal ganglion cell은 원형으로 생긴 지역입니다.
가장 상위에는 Simple cells이 있는데, 이 세포들은 다양한 edges의 방향과 빛의 방향에 반응했습니다.그리고 더 나아가, 그런 Simple Cells 이 Complex cells과 연결되어 있다는 것을 발견했습니다. Complex cells는 빛의 방향 뿐만 아니라 움직임에서 반응했습니다.
복잡도가 증가함게 따라, 가령 hypercomplex cells은 끝 점(end point) 과 같은것에 반응하게 되는 것입니다.

이런 결과로부터 "corner" 나 "blob"에 대한 아이디어를 얻기 시작한 것입니다.
1980의 neocognitron은 Hubel과 Wiesel이 발견한 simple/complex cells의 아이디어를 사용한 최초의 NN입니다. Fukishima는 simple/complex cells을 교차시켰습니다.
Simple cells은 학습가능한 parameters를 가지고 있고 Complex cells은 pooling과 같은 것으로 구현했는데 작은 변화에 Simple cells보다 좀 더 강인합니다.

지금까지는 1980년대 까지의 업적이었습니다 1998년 Yann LeCun이 최초로 NN을 학습시키기 위해 Backprob과 gradient-based learning을 적용했고 실제로 그 방법은 문서인식에 아주 잘 동작했습니다. 그리고 우편번호의 숫자를 인식하는데도 아주 잘 동작했습니다.그리고 실제 우편 서비스에서 우편번호 인식에 널리 쓰였습니다. 하지만 아직 이 Network를 더 크게만들 수는 없었습니다. 그리고 숫자 라는 데이터는 단순했습니다.

2012년 Alex Krizhevsky가 CNN의 현대화 바람을 이르켰습니다. 이 Network는 AlexNet이라고도 불립니다. Yann LeCun의 CNN과 크게 달라보이진 않습니다.
다만 더 크고 깊어진 것입니다. 가장 중요한 점은 지금은 ImageNet dataset과 같이 대규모의 데이터를 활용할 수 있다는 것입니다. 또한 GPU의 힘도 있었습니다.

다시 오늘날로 돌아와보면
ConvNets은 모든 곳에 쓰입니다. AlexNet의 ImageNet 데이터 분류 결과를 살펴보자면
이미지 검색에 정말 좋은 성능을 보이고 있습니다. 가령 꽃을 검색하는 것을 보면 학습된 특징이 유사한 것을 매칭시키는데 아주 강력하다는 것을 볼 수 있습니다. Detection에서도 ConvNet을 사용합니다. 영상 내에 객체가 어디에 있는지를 아주 잘 찾아냅니다.
버스나 보트 등을 찾아내고 네모박스를 정확하게 그립니다. 그리고 그보다 더 어려운 일들도 할 수 있는데 segmentation은 단지 네모박스만 치는 것이 아니라 나무나 사람 등을 구별하는데
픽셀 하나 하나에 모두 레이블링하는 것입니다.

이런 알고리즘은 자율주행 자동차에 사용할 수 있습니다. 대부분의 작업은 GPU가 수행할 수 있으며, 병렬처리를 통해 ConvNet을 아주 효과적으로 훈련하고 실행시킬 수 있습니다.
자율 주행에 들어가는 임베디드 시스템에서도 동작할 뿐만 아니라 최신의 GPU에서도 가능합니다. 이는 모두 Convnet 을 활용할 수 있는 다양한 애플리케이션의 예라고 할 수 있습니다.

얼굴인식의 예를 보면 얼굴 이미지를 입력으로 받아서 이 사람이 누구인지에 대한 확률을 추정할 수 있습니다. ConvNets을 비디오에도 활용할 수 있는데, 단일 이미지의 정보 뿐만 아니라 시간적 정보도 같이 활용하는 방법입니다. 또한 pose recognition도 가능합니다. 어깨나 팔꿈치와 같은 다양한 관절들을 인식해 낼 수 있습니다. 여기 우리 조교 Lane의 이미지가 있습니다. 다양하고 비 정형적인 사람의 포즈를 아무 잘 잡아냅니다.
오늘날 ConvNets을 이용한 pose recognotion은 아주 잘 동작합니다.

Convnet을 가지고 게임도 할 수 있습니다. 더 깊은 강화학습을 통해서 Atari 게임을 하거나
바둑을 두는 모습을 보신 적이 있을 것입니다. ConvNets은 이 모든 일들에서
아주 중요한 역할을 합니다. 또다른 예로는 의학 영상을 가지고 해석을 하거나
진단을 하는데도 이용할 수 있습니다. 또한 은하를 분류하거나 표지판을 인식하는데도 쓰입니다

최근의 Kaggle Chanllange에서는 고래를 분류하는 것도 있었습니다 또한 항공지도를 가지고 어디가 길이고 어디가 건물인지를 인식하기도 합니다.


Classification이나 Detection에서 좀 더 나아가는 방법도
있습니다. Image Captioning같은 방법이죠 이미지가 주어지면 이미지에 대한 설명을 문장으로 만들어 내는 것입니다. 또한 Neural Network를 이용해 간지나는 예술작품도 만들어 낼 수 있습니다. 왼쪽에 Deep Dream 알고리즘의 결과를 볼 수 있는데 다양한 어떤 객체가 보입니다. 또한 Style Transfer라는 방법은 원본 이미지를 가지고 특정 화풍으로 다시 그려주는 알고리즘도 있습니다.
가령 맨 오른쪽은 반 고흐의 별의 빛나는 밤의 화풍으로 바뀐 것입니다.

CNN working model

지난 강의에서 Fully Connected Layer에 대한 아이디어를 소개해 드렸습니다 그리고 완전히 연결된 레이어의 경우 FC Layer에서 하는 일은 어떤 벡터를 가지고 연산을 하는 것이었습니다. 우선 입력으로 32 x 32 x 3 의 이미지가 있었습니다.
그리고 이 이미지를 길게 펴서 3072차원의 벡터로 만들었습니다. 그리고 가중치 W가 있어서 벡터와 곱했습니다. (Wx) 이 예시에서는 W가 10x3072 행렬입니다. 그리고 activation 을 얻습니다. 이 Layer의 출력입니다.
10개의 행으로 되어있는데 3072 차원의 입력와 내적을 한 결과라고 할 수 있습니다. 그러면 어떤 숫자 하나를 얻게 되는데 이는 그 Neuron의 한 값이라고 할 수 있습니다. 이 예시의 경우 10개의 출력이 있게 됩니다.

Convolution Layer와 기존의 FC레이어의 차이점

  • Convolution Layer는 기존의 구조를 보존
  • 기존의 FC Layer가 입력 이미지를 길게 쭉 폈다면 이제는 기존의 이미지 구조를 그대로 유지하고이 작은 필터가 우리가 가진 가중치가 되는 것이고 이 예시에서는 5x5x3 필터가, 이 필터를 가지고 이미지를 슬라이딩하면서 공간적으로 내적을 수행

이제 이것을 어떻게 수행하는지 자세하게 알아보겠습니다.

우선 필터는 입력의 깊이(Depth)만큼 확장됩니다 여기에서 하나의 필터는 아주 작은 부분만 취할 수 있습니다.
전체 32x32 이미지의 5x5 만 취하는 것입니다. 하지만 깊이를 보면 전체 깊이를 전부 취합니다.
여기에서는 5 x 5 x 3 가 되는 것입니다. 이제 이 필터를 가지고 전체 이미지에 내적을 시킬 적입니다.
이 필터를 이미지의 어떤 공간에 겹쳐놓고 내적을 수행합니다. 그리고 필터의 각 w와, 이에 해당하는 이미지의 픽셀을 곱해줍니다. 여기에 필터가 5 x 5 x 3 라는건 그만큼 곱셈연산을 한다는 것입니다.
물론 bias term도 하나 들어가겠지만요 여기에서는 기본적으로 W^tx + b를 수행하는 것입니다.

어떻게 슬라이딩을 하는지에 대해 알아보겠습니다
Convolution은 이미지의 좌상단부터 시작하게 됩니다.
그리고 필터의 중앙을 값들을 모으게 됩니다. 필터의 모든 요소를 가지고 내적을 수행하게 되면
하나의 값을 얻게됩니다.그리고 슬라이딩하게 됩니다. Conv연산을 수행하는 값들을 다시 Output activation map의 해당하는 위치에 저장하게 됩니다. 여기 보면 입력 이미지와 출력 activation map의 차원이 다르다는 것을 알 수 있습니다. 입력은 32 x 32 이고 출력은 28 x 28 이죠 그래서 우리는 나중에 수학에 대해 설명 할 것입니다. 이 방법이 차원 적으로 어떻게 작동하는지 정확히 알 수 있습니다.기본적으로는 어떻게 슬라이딩을 할 것인지를
선택할 수 있습니다.

슬라이딩여부와 관계없이 입력 값을 두 개씩 뽑아서 연산을 수행할 수도 있을 것입니다.
출력 행렬의 크기는 슬라이드를 어떻게 하느냐에 따라 다르게됩니다. 하지만 기본적으로는 하나씩 연산을 수행합니다. 하나의 필터를 가지고 전체 이미지에 Convolution 연산을 수행합니다. 그러면 activation map이라는 출력값을 얻게 되는 것입니다. 보통 Convolution Layer에서는 여러개의 필터를 사용합니다.
왜냐하면 필터마다 다른 특징을 추출하고 싶기 때문입니다. 따라서 우리는 보통 여러개의 필터를 사용합니다. 가령 여기에 두 번째 필터가 있습니다. 초록색의 5 x 5 x 3 필터입니다. 이 녹색 필터를 연산하고 나면, 앞서 계산했던 activate map과 같은 크기의 새로운 map이 만들어집니다.


우리는 한 Layer에서 원하는 만큼 여러개의 필터를
사용할 수 있습니다.

가령 5 x 5 필터가 6개가 있다면
총 6개의 activation map을 얻게 될 것입니다.출력 map의 크기는 28 x 28이 되겠죠


이 CNN을 어떻게 활용할 지를 조금 말씀드려보면
이런식으로 Cov Layer들의 연속된 형태가 될 것입니다 그리고 각각을 쌓아 올리게 되면 보시는 것과 같이
간단한 Linear Layer로 된 Neural Network가 됩니다. 이제는 그 사이 사이에 activation function을 넣을 것입니다.
가령 ReLU 같은 것들을 사용할 수 있겠죠. 그렇게 되면 Conv-ReLU 가 반복되겠죠
그리고 가끔은 pooling layer도 들어갑니다. 그리고 각 Layer의 출력은 다음 Layer의 입력이 됩니다.

그리고 말씀드렸듯 각 Layer는 여러개의 필터를 가지고 있습니다. 그리고 각 필터마다 각각의 출력 map을 만듭니다. 그러므로 여러개의 Layer들을 쌓고나서 보면 결국 각 필터들이 계층적으로 학습을 하는것을 보게됩니다.
앞쪽에 있는 필터들은 low-level feature를 학습하게 됩니다. Edge와 같은것들이 보입니다.
Mid-level을 보면 좀더 복잡한 특징을 가지게 됩니다. 코너나 blobs 등과 같이 보입니다.
그리고 high-level features를 보면 좀 더 객체와 닮은 것들이출력으로 나오는 것을 볼 수 있습니다.
나중 수업에서 객 특징을 어떻게 시각화하는지, 그리고 특징들이 어떻게 학습되는지를 살펴보겠습니다.
여기에서 이해하고 넘어가야 하는 것은 특징이 어떻게 생겼고,Layer의 계층에 따라 단순/복잡한 특징을이 존재한다는 것을 아는 것입니다.

지금까지는 Conv Layer를 계층적으로 쌓아서 단순한 특징을을 뽑고 그것을 또 조합해서 더 복잡한 특징으로 활용했습니다. 그리고 이는 Hubel과 Wiesel의 이론과도 잘 맞습니다. 네트워크에 앞쪽에서는 단순한 것들일 처리하고
뒤로 갈수록 점점 더 복잡해 지는 식이죠 우리는 그것을 강제로 학습시킨 것이 아니라 계층적 구조를 설계하고
역전파로 학습시킨 것 뿐이지만 필터는 이렇게 학습되는 것입니다.

Activation map의 예제를 한 번 보겠습니다.
각 필터가 만든 출력값이죠 위에 5 x 5 필터들을 시각화 한 것을 볼 수 있습니다.
실제 ConvNet을 학습시킨 결과입니다. 5 x 5 필터가 어떻게 생겼는지를 보여 줍니다. 그리고
이미지와 필터간 Conv의 activation 결과를 볼 수 있습니다. 이 경우 입력 이미지는 자동차의 한 부분인것 같습니다. 우선 여기 빨간색 네모박스를 친 필터를 한 번 봅시다. 이 필터는 edge를 찾고 있는 것입니다.
그리고 이 필터를 슬라이딩 시키면 이 필터와 비슷한 값들은 값이 더 커지게 됩니다. 따라서 각 actavation은 이미지가 필터를 통과한 결과가 되며 이미지 중 어느 위치에서 이 필터가 크게 반응하지는지를 보여줍니다.
우리가 이걸 Convolution이러고 칭하는 이유는 바로 위에 언급한 것이 바로 두 신호 사이에 cov를 하는것과 유사하기 때문입니다. 여기 Conv 식이 있습니다. 예전에 신호처리에서 Conv를 본 적이 있는 학생이라면 이 식이 correlation 같아 보일 것입니다. 우리는 사실 Conv의 뒤집힌 버전을 쓰고 있는 것입니다.
하지만 손으로 직접 계산해보면 conv에 정확한 정의와 크게 다르지 않을 것입니다.
하지만 기본적으로는 필터를 가지고 이미지에 슬라이딩하면서 모든 위치에서 내적을 수행하게 되는 것입니다.

이전에도 언급했듯이 CNN이 어떻게 수행되는지를 살펴보면 입력 이미지는 여러 레이어를 통과하게 됩니다. 가령 첫 번째 Conv Layer 후에는 non-linear layer를 통과합니다. ReLU를 가장 많이 사용합니다.
Conv, ReLU, Conv, ReLU를 하고나면 pooling layer를 거치게 됩니다. pooling 은 activation maps의 사이즈를
줄이는 역할을 합니다.

그리고 CNN의 끝단에는 FC-Layer가 있습니다.
FC-Layer는 지난시간까지 배운 레이어입니다.마지막 Conv 출력 모두와 연결되어 있으며 최종 스코어를 계산하기 위해 사용합니다.

"Spatial dimension"에 대해 알아보겠습니다.
자 여기 32 x 32 x 3 이미지가 있습니다. 그리고 이 이미지를 5 x 5 x 3 필터를 가지고 연산을 수행합니다.

이제 어떻게 이 둘을 가지고 28 x 28 activation map이 생기는지를 알아보겠습니다.

간단한 예시로 7 x 7 입력에 3 x 3 필터가 있다고 해봅시다 이제 이 필터를 이미지의 왼상당부터 씌웁니다.
그리고 이제 해당 값들의 내적을 수행할 것입니다. 이 값들은 activation map의 좌 상단에 위치하게 되겠죠

그리고 다음 단계로 필터를 오른쪽으로 한칸 움직입니다.

그러면 값 하나를 또 얻을 수 있을 것입니다. 이렇게 계속 반복하게 되면 결국 5 x 5의 출력을 얻게 됩니다.
이 슬라이드 필터는 좌우 방향으로는 5번만 수행가능하고 상하 방향으로도 5번만 수행가능합니다.

지금까지는 슬라이딩을 한칸씩만 진행했었죠. 이때 움직이는 칸을 바로 "stride" 라고 합니다. 지금까지는 stide = 1을 사용했습니다. 그럼 stride = 2 일때는 어떨까요? 다시 왼쪽 위부터 시작해서 움직입니다. 다만 여기에서는
1칸은 건너뛰고 그 다음칸으로 이동해서 계산을 합니다. 이렇게 tride가 2 이면 3칸이면 못움직이고
결국 출력은 3 x 3 이 됩니다.

그렇다면 stride = 3 이면 출력의 사이즈는 몇일까요?

stride가 3인 경우에는 이미지를 슬라이딩해도 필터가 모든 이미지를 커버할 수 없습니다.
이 예시에서 stride 가 3이면 이미지에 잘 맞아떨어지지 않습니다. 실제로 이렇게 되면 잘 동작하지 않습니다. 이렇게 하면 안됩니다. 이로 인해 불균형한 결과를 볼 수도 있기 때문입니다.

그래서 상황에 따라 출력의 사이즈가 어떻게 될 것인지를
계산할 수 있는 아주 유용한 수식이 있습니다.

입력의 차원이 N이고 필터 사이즈가 F이고 스트라이드가 몇이다 라고 주어지게 되면
출력의 크기는 (N - F) / stride + 1 이 됩니다. 이를 이용해서 어떤 필터 크기를 사용해야 하는지를 알 수 있습니다. 그리고 어떤 stride를 사용했을때 이미지에 꼭 맞는지, 몇 개의 출력값을 낼 수 있는지도 알 수 있습니다.
지금까지 유용한 수식을 한 번 알아봤습니다.
앞서 보신바와 같이 N = 7 이고 F = 3 일 때, 그리고 stride가 1이면
이걸 그대로 수식에 적용해보면 5 x 5 출력이 나올 것이라는 것을 알 수 있습니다.
stride가 3인 경우를 보면, 잘 동작하지 않겠죠. (2.33)

그리고 가장 흔히 쓰는 기법은 zero-pad 입니다.
출력의 사이즈 의도대로 만들어 주기 위해서죠 이는 이전 질문이었던 "코너는 어떻게 처리하나요"
와도 연결되는 문제입니다. 이를 위해 할 일은, 이미지의 가장자리에 0을 채워 넣는 것입니다.
이렇게 되면 좌 상단의 자리에서도 필터 연산을 수행할 수 있게 됩니다.
7 x 7 입력에 3 x 3 필터 연산을 수행할 때 zero-padding을 하면 출력이 어떻게 될까요?

수식을 한 번 잘 생각해 보세요
N에 7을, F에 3을 대입하고 stride를 1으로 하면 그래서 우리가 실제로 얻는 것, 실제로 이것은 우리에게주는 것입니다. (7 - 3) /1 + 1 = 5 입니다. 이건 zero-padding이 없고 우리는 이 수식을 살짝 고쳐야합니다.

이 수식은 zero-padding을 하지 않은 수식이죠

하지만 zero-padding을 하면 출력이 7이 됩니다. 그래서 결국 7 x 7 출력을 얻게 되는 것입니다.
원래 공식으로 돌아가보자면 N은 7이 아니라 9가 되겠죠 N = 9 가 되고 필터 사이즈인 3을 빼면 6이 됩니다. 이를 stride 1나누면 다시 6이고 여기에 1을 더하면 7이 됩니다.
padding을 하려면 수식을 이런식으로 적용하면 되겠습니다.

q. 질문을 바로 왜 zero-padding을 하냐는 것입니다.

ans. zero-padding을 하는 이유는 레이어를 거치면서도
입력의 사이즈를 유지하기 위해서입니다. 가령 7 x 7 필터를 연산한다고 하면 출력의 사이즈는
입력보다 작아집니다. 하지만 우리는 지금 그 사이즈를 유지하고 싶은 것입니다.

지금까지 Padding을 하게되면 출력 사이즈를 유지시켜주고 필터의
중앙이 닿지 않는 곳도 연산할 수 있다는 것을 배웠습니다. 어떤 stride와 filter를 쓸건지를 일반적으로 정하는 방법이 있습니다. 보통 filter는 3x3, 5x5, 7x7 을 씁니다. 보통 3x3 filter에는 stride를 1로 줍니다.
그리고 5x5 filter에는 보통 stride를 2로 주죠 7x7 일때는 3을 줍니다.
다시 한 번 말하지만 zero-padding을 하는 목적은 입력 사이즈와 출력 사이즈를 같도록 하기 위해서 입니다
이전에 말했듯이 레이어가 여러겹 쌓인다고 생각해 보면

그리고 그때 zero-padding을 하지 않는다면
출력 사이즈는 아주 빠르게 줄어들게됩니다. 우리가 원하는 결과는 아니죠
만일 엄청 깊은 네트워크가 있다고 생각해보면 Activation Map은 점점 줄어들어 엄청 작아지게 될 것입니다.
그렇게 되면 일부 정보를 잃게 되는 것이고 원본 이미지를 표현하기에 너무 작은 값을 사용하게 될 것입니다.
그리고 그렇게 줄어드는 이유는 매번 각 코너에 있는 값들을 계산하지 못하기 때문입니다.

아래 요약 부분에 식 있음.

여기에 입력 이미지 32 x 32 x 3 이 있습니다.
그리고 10개의 5 x 5 필터도 있습니다.

Q. 여기 stride를 1로하고 padding을 2로 했을 때 출력사이즈는 몇이 될까요?

ANS . 입력 사이즈는 32이죠 padding으로 이 값을 2씩 증가시킵니다.
각 차원에 값을 2 증가시킵니다. 그렇게 각 양쪽에 2씩 추가시키면 32 + 4 가 되겠죠
그리고 필터사이즈 5를 뺴줍니다 그리고 다시 1을 더하면 32를 얻게 됩니다.
그러면 각 필터는 32 x 32가 됩니다. 전체 필터의 갯수는 10개이니 10개의 activation map이 나오겠죠
그럼 전체 출력의 크기는 32 x 32 x 10 이 됩니다.

Q. 이 레이어의 파라미터는 총 몇 개일까요? 우리에게 10개의 5 x 5 필터가 있다는 것이 힌트입니다.

A .명심해야 할 점은 필터가 입력의 Depth만큼도 통과한다는 것입니다. 이 슬라이드에는 그 내용이 명확히 쓰여있지는 않습니다. 하지만 묵시적으로 여기에 Depth도 존재합니다. 필터가 입력의 전체 depth를 통과하게 되겠죠.

이 각각의 5 x 5 x 3 가중치에는 하나의 bias term이 들어있습니다 그러니 필터당 76개의 파라미터가 있는 것이고 이런 필터가 총 10개 있으니 전체 760개의 파라미터가 있는 것입니다.

여기에 Conv layer를 한 번 요약정리해 보았습니다. 나중에 주의깊게 읽어보시기 바랍니다 어떤 n차원의 입력이 있습니다.그리고 어떤 필터를 쓸지 선택해야 합니다.
몇개의 필터를 쓸건지, 필터 크기는 몇인지, stride는 몇으로 할지 zero-padding은 몇 으로 할지를 다 정해줘야합니다.그리고 앞서 말한 수식을 이용해서 출력의 사이즈가 어떻게 될 것인지를 계산해 봅니다.
그리고 전체 파라미터가 몇개가 될 것인지도확인해 봐야 합니다.

여기에는 일반적으로 사용하는 값들이 있습니다. 필터 사이즈는 3x3, 5x5 를 씁니다.
Stride는 보통 1이나 2가 가장 흔합니다. 그리고 padding은 그 설정에 따라 조금씩 다르겠죠
그리고 보통 필터의 갯수는 2의 제곱수로 합니다. 32, 64, 128, 512 와 같이 말이죠


1 x 1 Convolution에 대해 말해봅시다. 1 x 1 Convolution도 의미가 있습니다. 똑같이 슬라이딩 하면서
값을 구하게 되겠죠 하지만 여기에서는 5x5 처럼 공간적인 정보를 이용하지 않습니다.
하지만 이 필터는 여전히 Depth만큼 연산을 수행합니다.

그러니 1 x 1 Conv는 입력의 전체 Depth에 대한 내적을 수행하는 것과 같습니다.
입력은 56x56x64 입니다. 그리고 여기에 32개의 1x1 Conv 수행하면 56x56x32의 출력값이 나오게 됩니다.

여기 TORCH로 구현된 Conv Layer 예제가 있습니다.

지난 시간에 Torch에 대해 알아봤었는데요 Torch에서는 다양한 레이어가 정의되어 있습니다.
그리고 그 레이어의 forward/backward pass가 구현되어 있습니다.
여기 spatial convolution이 바로 그 중 하나입니다. 여기에 arguments를 가지고 여러 디자인을 선택할 수 있습니다. 입/출력 사이즈를 정할수도 있고 커널 사이즈, Padding 와 같은 것들을 전부 정해줄 수 있습니다.

여기 보면 네트워크가 정의되어있는데 Caffe에서는 proto text라는 파일을 이용합니다. 여기에 디자인을 명시합니다.
여기 conv layer의 예시가 있는데 출력의 사이즈나 필터의 개수, 커널 사이즈 stride 등등을 여기에 명시하는 것입니다.

Conv Layer을 Brain Neuron의 관점에서 살펴보겠습니다.

뉴런에 대해서는 지난 시간에 조금 배웠었죠 Conv Layer를 보면, 전체 이미지의 특정 위치에 필터를 가지고
내적을 수행했습니다. 그러면 하나의 값을 얻게 됩니다.
이는 여기 오른쪽 그림의 내적과 같은 아이디어입니다. 입력이 들어오면 Ws와 곱하고, Ws는 필터 값이죠
그리고 하나의 값을 출력 합니다. 하지만 가장 큰 차이점은 우리의 뉴런은 Local connectivity 를 가지고 있다는 것입니다. Conv Layer처럼 슬라이딩을 하는게 아니라 특정 부분에만 연결되어 있습니다.
하나의 뉴런은 한 부분만 처리하고, 그런 뉴런들이 모여서 전체 이미지를 처리하는 것입니다.
이런 식으로 spatial structure를 유지한 채로 Layer의 출력인 activation map을 만드는 것입니다.

중요한 용어들을 한 번 정리해 보겠습니다.
가령 5 x 5 필터가 있다고 해봅시다. 한 뉴런의 ‘"Receptive field" 가 5 x 5 다 ’ 라고 할 수 있습니다.
"Receptive field" 란 한 뉴런이 한 번에 수용할 수 있는 영역을 의미합니다.

그런 다음 5 개의 필터로 5 개를 다시 기억하십시오.

그 필터가 슬라이딩하면서 계산을 하는데 중요한 것은 필터 값이 항상 같다는 것입니다 그럼 이제 출력 값에 대해 알아보면 출력 값은 여기 보이는 파란색 Volume 처럼 생길 것입니다. 크기는 28 x 28 x (필터의 갯수) 가 될텐데요. 필터가 총 5종류가 있는 경우라면 출력은 28 x 28 x 5 인 3D Grid가 됩니다. 그러면 이제 어떤 한 점을 찍어서 depth방향으로 바라보면(파란색 Map 안에 5개 점)이 5개의 점은 정확하게 같은 지역에서 추출된 서로다른 특징이라고 할 수 있습니다.
하지만 각 필터는 서로 다른 특징을 추출합니다. 그러므로 각 필터는 이미지에서 같은 지역을 돌더라도
서로 다른 특징을 뽑아낸다고 볼 수 있습니다.

복습겸 다시 FC Layer를 한 번 살펴보겠습니다.

FC-Layer 의 경우면 32 x 32 x 3 을 다 편 다음에 전체를 연결하여 계산할 것입니다.

Conv Layer가 전체가 아직 지역정보만 이용하다는 점과 비교해 보시면 될 것 같습니다.


지금부터는 CNN에 들어가는 다른 Layer를 살펴보겠습니다.

CNN에는 Conv Layer와 Pooling Layer가 있었죠. 그리고 다른 비선형 연산들도 있습니다.

CNN Pooling layer


Pooling Layer는 Representation들을 더 작고 관리하게 쉽게 해줍니다.

누가 이전에 왜 Representation을 작게 만드냐고 했엇죠 다시 한 번 말하지만, 작아지면 파라미터의 수가 줄게 됩니다. 그리고 일종의 공간적인 불변성(invaiance)을 얻을 수도 있습니다.
Pooling Layer가 하는 일은 아주 간단합니다. Downsample 하는 거죠
가령 224 x 224 x 64 인 입력이 있다면, 이를 112 x 112 x 64 로 "공간적"으로 줄여줍니다.
중요한 점은 "Depth"에는 아무 짓도 하지 않는다는 것입니다. 따라서 Depth에는 영향을 주지 않습니다.

Max Pooling이 일반적으로 쓰입니다. Pooling에도 필터 크기를 정할 수 있습니다.
얼마만큼의 영역을 한 번에 묶을지를 정하는 것입니다.

여기 2 x 2 필터가 있습니다. 그리고 여기에서 Stride는 2 입니다.
그리고 Conv Layer가 했던 것 처럼 슬라이딩하면서 연산을 수행합니다.
대신 내적을 하는 것이 아니라, 필터 안에 가장 큰 값 중에 하나를 고르는 것입니다.
여기 빨간색 영역을 보면 6이 제일 큽니다. 녹색을 보면 8이 제일 크죠 나머지도 마찬가지로 3과 4의 값이 되겠습니다.

다시 Pooling Layer로 돌아가 봅시다.
Pooling Layer에는 몇가지 Design Choice가 있습니다. 입력이 W(width), H(Height), D(Depth) 면
이를 통해 Filter Size를 정해줄 수 있습니다. 여기에 Stride까지 정해주면, 앞서 Conv Layer에서 사용했던
수식을 그대로 이용해서 Design Choice를 할 수 있습니다. 이렇게 (W - Filter Size) / Stride + 1
로 구하면 됩니다. 한가지 특징이 있다면 pooling layer에서는 보통 padding을 하지 않습니다. 왜냐면 우리는 downsampling하고 싶고, 또한 Conv 때처럼 코너의 값을 계산하지 못하는 경우도 없기 때문입니다.
그러므로 Pooling 할때는 padding을 고려하지 않아도 되고 그냥 downsample만 하면 됩니다.
가장 널리 쓰이는 필터사이즈는 2 x 2, 3 x 3 이고 보통 stride는 2로 합니다. 필터가 3 x 3 일때도 보통 stride는 2 x 2 로 합니다. 앞서 언급했듯, 2 x 2 가 좀더 자주 쓰입니다.


우리는 지금 Conv Layer를 배우고 있습니다. ReLU Layer는 지난 강의에 했던것과 같습니다.
그리고 downsampling을 하고싶을때는 Pooling을 섞어줍니다.그리고 여기 마지막에는 FC Layer가 있습니다.
우리가 이전에 살펴본 FC와 똑같습니다. 여기 마지막 Conv Layer의 출력은 3차원 volume으로 이루어집니다.
이 값들을 전부 펴서(stretch) 1차원 벡터로 만듭니다. 그리고 이를 가지고 FC Layer의 입력으로 사용합니다.
그렇게 되면 Conv Net의 모든 출력을 서로 연결하게 되는 것입니다.
이 마지막 Layer부터는 공간적 구조(spatial structure)를 신경쓰지 않게 됩니다.
전부 다 하나로 통합시키고는 최종적인 추론을 하게 됩니다. 그렇게 되면 Score가 출력으로 나오게 되는 것입니다.

summary

마지막으로 요약해보자면 오늘 우리는
CNN이 어떻게 동작하는지를 배웠습니다.

기본적으로는 Conv 와 Pool 를 쌓아 올리다가 마지막에 FC Layer로 끝나게 됩니다.
그리고 네트워크의 필터는 점점 더 작아지고, 아키텍쳐는 점점 깊어지는 경향을 배웠습니다. 나중에 예시를 더 다루겠습니다.그리고 Pooling 이나 FC Layer를 점점 더 없애는 추세이기도 합니다.
그냥 Conv Layer만 깊게 쌓는 것입니다. 나중에 더 이야기 할 시간이 있을 것입니다.
전형적인 CNN 아키텍쳐는 Conv와 ReLU를 몇 번(n번) 반복합니다. 그리고 그 중간에 pooling도 몇 번 들어갑니다.
그리고 FC Layer가 이어집니다. 한 번에서 두 번 그 이상일수도 있습니다.
그리고 Class score를 구하기 위해 softmax를 사용합니다. 그리고 일반적으로 n은 5 정도가 될 수 있습니다.

그렇게 되면 엄청 깊은 Conv, ReLU, Pool 시퀀스를 구성하게 될 것이고, 그다음 한두 번의 FC Layer가 이어지는 것입니다.그리고 다음 시간에는 더 최신의 다양한 아키텍쳐를 배우겠습니다.
ResNet이나 GoogLeNet 같은 것들이죠

profile
집에가고싶다

0개의 댓글