본문 바로가기
데이터 과학 관련 스터디/cs231n

cs231n 5강 Convolutional Neural Networks

by inhovation97 2020. 11. 7.

드디어 이 강의의 타이틀인 CNN의 구조를 살펴봅니다.

우선 먼저 CNN의 역사를 보겠습니다.

  • CNN의 역사
  • CNN 아키텍쳐

우리는 저번 시간에 활성화 함수를 이용한 퍼셉트론에 은닉층을 추가하여 비선형 모델인 Neural Network을 배웠습니다. 오늘은 그 중에서도 바로 Convolutional Neural Network을 배웁니다.

 

 

CNN의 전체적인 구조입니다.

먼저 CNN의 역사를 살펴봅시다.

 

 

먼저 1957년으로 거슬러갑니다.

57년에는 단일 퍼셉트론인 마크1이 개발되었습니다. score 함수만을 이용한 모델이었습니다.

1 or 0 만을 내뱉는 함수를 이용했기 때문에 Back propagation은 불가능했습니다.

 

1960년대에는 multi layer를 이용한 모델이 개발되었습니다. NN의 시초이지만, 이때도 아직은 Back propagation은 불가능했다고 합니다.

 

 

Back propagation은 1986년에 와서야 도입되었다고 합니다.

그때서야 chainrule을 이용하여 오차 역전파를 도입했지만, 아직 커다란 뉴럴 네트웍을 만드는데에는 무리였고, 다시 한 번 침체기를 맞이했습니다.

 

 

주목을 다시 받은 것은 2006년이었습니다.

드디어 Deep learning이 가능했던 것은 pre-training과 fine tuning이었습니다.

Back propagation을 위해서는 초기 w값을 위한 initialization이 중요했는데, 그 문제를 지금은 이용하지 않는 pre-training을 통해서 해결했습니다. 각각의 layer에 반복적으로 pre-training을 하여 initailized weigts을 부과한 것이지요. 그 뒤에 fine tuning과 Back prop으로 모델을 구성했던 것이었습니다.

 

이렇게 initaillization을 한 뒤, fine tuning을 해주는 첫 NN이 개발되었고,

 

 

우리가 정말로 강력한 뉴럴 네트웍을 이용하게 된 것은 바로 2012년 바로 알렉스 넷 덕분입니다.

이게 바로 CNN의 시초이며, 에러를 굉장히 많이 줄인 Image classification입니다.

이때부터 딥러닝이 급부상하기 시작했습니다.

 

이렇게 CNN의 역사를 보았고, 뉴럴 네트웍의 역사를 다시 봅니다. (생물학적인 접근)

 

 

지난 강의에서 언급했던 적이 있습니다.

Hubel & Wiesel이 고양이의 뇌로 뉴런이 shape, edge를 보며 어떻게 반응하는 지를 연구하고, 고양이 뇌에 전극을 주어 보는 바와 같이 시각적으로 다르게 반응한다는 것을 알아내었죠.

이런 식으로 여러가지 shape으로 시각적으로 다르게 반응하는 뉴런을 측정하는 연구를 한 것이죠.

 

 

인간의 뇌도 시각을 담당하는 부분을 나누며 뉴런들이 계층적임을 연구하고, 점점 더 세밀한 영역으로 가는 아이디어로 위의 네트워크 아키텍처를 낼 수 있던 것입니다.

 

 

사실 1998 LeCun의 이 모델은 거의 CNN과 구조가 비슷합니다. 스케일의 차이죠. LeCun이 만들었던 것은 아이디어는 지금의 CNN이지만 문서 인식등에 능했고 GPU가 발전한 지금은 엄청난 데이터의 이미지 인식까지 가능한 CNN으로 발전한 것입니다. 이미 CNN의 아이디어는 1998에 나온 셈이지요.

 

 

이미지 디텍션, 캡셔닝, 자율주행, 천체 분류 등등 굉장히 다양한 곳에 쓰이는 CNN의 구조를 5강에서야 살펴볼 수 있습니다.

 

우리가 지난 강의에 배운 Fully Connected Layer입니다.

32x32x3의 이미지 픽셀들을 3072차원의 백터 형태로 input하여 각각의 가중치를 부여한 뒤, 활성화 함수를 통해서 각 클래스마다의 스코어를 반환합니다. 

 

*사실 CNN이라고 전혀 다른 구조가 아니라, Convolutional Layer를 FC 레이어(Fully Connected Layer) 앞에 추가하는 구조입니다.

 

그럼 이제 FC레이어와는 많이 다른 Convolutional Layer를 살펴 봅시다.

Convolutional Layer는 슬라이드에 보이는 필터를 통해 데이터의 공간 정보를 살립니다.(Preserve spatial structure) 드디어 이미지에 있어서 매우 중요한 공간 정보를 활용할 수 있는 것입니다.

필터는 이미지와 channel 차원을 맞춰줍니다.

 

 

이 필터를 w라고 하고, 필터로 이미지를 훑으면서 픽셀값과 계산을 해주고 바이어스인 b까지 더하여 값을 도출합니다. 아직은 감이 없지만, 전혀 어렵지 않으니 천천히 따라오시면 됩니다.

 

 

필터를 쓰면 해당 필터로 이미지에 대한 정보들을 수집합니다.

필터를 많이 쓸수록 이미지에 대한 정보는 많아집니다.

필터의 개수도 하이퍼 파라미터라는 의미입니다!

 

이렇게 필터 6개를 이용해서 이미지에 대한 정보를 수집했습니다.

28x28x6으로 데이터의 크기가 바뀌었죠.

 

 

Convolutional Layer를 여기서 한번 더 거칩니다.

활성화 함수인 렐루를 통해 24x24x10로 데이터의 크기가 다시 바뀌었습니다.

이미지에 대한 특징을 계속해서 Convolutional Layer를 통해 뽑아 낸 것입니다.

너무 많이 하면 아마 과적합에 걸릴지도 모릅니다.

 

 

Convolutional Layer가 이미지의 특징을 얼마나 어떻게 뽑아냈는지 모르죠.

그 수준을 알 수 있는 슬라이드입니다.

Low - mid - high 수준으로 시각화를 진행했습니다.

low 수준에서 high로 갈수록 정보가 더욱 다양해집니다. (사실 저는 이것만 보고는 직관적으로 와닿지 않습니다ㅋㅋ)

 

 

위에서 말했던 인간의 시각을 담당하는 뉴런이 세부적으로 진입한다는 아이디어와 일맥상통합니다.

 

이 슬라이드를 보니 조금은 이해가갑니다.

Convolutional layer에서 각각의 필터들이 뽑아낸 정보들은 이미지에 대한 정보를 지니고, 그것에 대해서 설명해줍니다.

파란색 화살표를 보면 주황색의 필터가 이미지의 주황색 부분에 대한 정보를 가지고 있습니다.

정말로 이제 공간에 대한 정보를 활용하는 것이 이 슬라이드가 설명해줍니다!

 

 

우린 지금 FC layer 이전에 필터를 이용한 Conv layer에 대해서만 살펴보았고, 해당 슬라이드를 보니 POOL이라는 것도 보입니다.

POOL은 데이터를 downsample 시켜준다고 간단히 설명합니다.

Conv레이어와 POOL을 적당히 이용하여 이미지 정보를 얻어낸다는 전체적인 감을 잡았네요.

자 이제 전체 구조를 봤으니 내부 계산이 어떻게 이루어지는지 봅시다.

 

자 아까 필터는 이미지 데이터를 훑는다고 했고, 훑은 뒤에는 32x32의 이미지의 크기가 약간 작아졌습니다.

그 원리를 설명하는 슬라이드입니다.

필터가 자리를 옮길때마다 값이 1개씩 반환되기 떄문에, 크기가 작아졌던 것입니다.

이 슬라이드에서는 7x7이 5x5로 바뀐 것입니다.

 

 

 

이번에는 간격을 2개로 두었을 때입니다.

이를 stride라고 하는데, stride도 하이퍼 파라미터가 됩니다!

 

당연히 stride가 3이면 어떻게 될지가 궁금해지죠??

다 훑을 수 없으면 그냥 불가합니다.

 

 

stride를 통해 우리는 이제 필터로 나올 이미지 데이터의 크기를 일반화된 공식으로 알 수 있습니다.

수식이 매우 쉽습니다. 어려운 부분이 없어요.

 

 

이미지는 ConV층을 쌓으면서 점점 작아집니다.

또 심지어 맨 끝 사이드의 픽셀들은 포함되는 횟수가 가운데 있는 픽셀들보다 적습니다.

이러한 단점들을 보완하기 위한 것이 바로 Padding 기법입니다.

보통은 0을 써서 zero padding을 이용해 사이드에 0픽셀들을 둘러싸줍니다.

 

슬라이드에서 1제로 패딩 해주면 size가 어떻게 반환되는지를 묻고 있습니다.

답은 간단합니다.

그대로 7x7로 반환됩니다.

사이즈가 줄어드는 단점을 보완했네요.

필터가 3개면 제로패드 1개

필터가 5개면 제로패드 2개

필터가 7개면 제로패드 3개

 

통상적으로 이용한다고 합니다.

 

32x32x3의 이미지에 5x5필터 10개를 1 스트라이드로 패드 2개를 쓰면 반환되는 값을 묻습니다.

 

 

32x32x10으로 반환됨을 알 수 있습니다.

padding기법으로 이미지가 매우 작아지는 단점을 커버했습니다.

 

 

그렇다면 해당 레이어에서의 파라미터는 몇개가 되는지를 묻습니다.

파라미터는 w와 b의 수식내적인 요소를 묻는 것입니다.

 

 

5x5x3의 필터로 나온 w값들이 10 세트나 있고, 레이블마다 각각의 바이어스 b값을 지니므로 10을 더해서

총 760개의 파라미터가 있습니다.

 

Summary입니다.

어려운 부부은 없었습니다.

빨간 글씨는 인풋 데이터가 2의 제곱으로 갈 때, 통상적으로 적용하는 필터의 개수와 스트라이드, 패딩을 말해준 것입니다.

 

 

아까 말했듯이 필터가 한번 지나갈때 1개의 값으로 반환하여 크기가 축소 됐었습니다.

그것이 뉴런의 local connect라고 설명합니다.

 

 

필터가 지나가는 자리가 몇번씩 겹치니까 1개의 픽셀을 이렇게 5번 가져갑니다.

모두 다른 필터들로 말이죠.

그래서 저는 쓸모있는 정보가 더욱 더 많아지는 거라고 이해했습니다.

 

 

이제 Pooling Layer를 봅시다.

Pooling은 패딩과 달리 이미지 크기를 줄여줍니다.

하지만 큰 특징값은 유지하면서 말이죠.

그래서 MaxPooling을 많이 씁니다.

 

이렇게 각 영역에서 가장 큰 수만 가져갑니다.

메우 크기가 큰 이미지의 데이터에서 굉장히 효율적으로 보이는 기법입니다.

똑같이 필터를 stride 간격으로 움직이면서 큰 값만 가져가는 것입니다.

 

이미지에서 모든 픽셀들을 골고루 쓰고 양이 작아지지않게 Padding을 쓰고, 값이 큰 값을 가져가서 크기를 줄여주는 Pooling으로 효율을 높여주는 것입니다.

 

 

 

 통상적으로 풀링은 pooing filter개수가 2개 3개여도 stride는 똑같이 2개의 층을 적용한다고 합니다.

 

 

ConV layer에서 패드기법을 이용하고 Pooling layer를 거친 후에야 데이터를 flatten하여 array배열로 펴준 뒤 FC층에 넣어주는 것이지요.

 

드디어 CNN의 구조를 살펴 보았습니다.

제가 일전에 포스팅했던 CNN 글을 참고하시면 이해가 더 편합니다.

 

*강의자료

**CNN을 포스팅했던 글

cs231n.stanford.edu/2017/syllabus.html

inhovation97.tistory.com/15?category=833811

 

CNN( Convolutional Neural Network)이 대체 뭐야?

모두의 딥러닝이라는 서적을 통해 딥러닝을 처음 접하면서 CNN(합성곱 신경망)이라는 모델을 공부했습니다. 통계 전공이지만 처음 알게되는 사실들이 많아 책보다는 좀 더 딥하게 공부하고 싶어

inhovation97.tistory.com

 

Syllabus | CS 231N

Lecture 8 Thursday April 27 Deep Learning Software Caffe, Torch, Theano, TensorFlow, Keras, PyTorch, etc [slides] [video]

cs231n.stanford.edu

 

댓글