본문 바로가기

컴퓨터공학

[CS231n 5강 정리] CNN(Convolutional Neural Network)

반응형

4강에서 놓친부분들이 몇개 있어 정리하고 가려 합니다.

 

지난시간에 다중 레이어를 배웠고, linear layer과 non-linear layer들을 조합하여 신경망을 만들었습니다. 이는 Mode 문제를 해결함으로써 빨간색차, 노란색차와 같은 다양한 종류의 사물을 보다 러프하게 분류할 수 있도록 해줍니다.


NN의 역사

오늘은 CNN을 배웁니다! 그 전에 간략히 주요사건들 정리하고 가볼께요

신경망

1957년 Frank Rosenblatt가 Mark I Perceptron machine을 개발

- 최초의 퍼셉트론 기계

 

1960년 Widrow와 Hoff가 Adaline and Madaline 개발

- 최초의 Multilayer Perceptron Network

 

1986년 Rumelhart

- 역전파 제안, 신경망 학습 시작

 

2006년 Geoff Hinton과 Ruslan Salakhutdinow

- DNN 학습가능성

 

2012년 Hintin lab

- 음성인식 NN 성능 좋음

- ImageNet Classification에서 최초로 NN 사용, 결과 좋았다 -> Alexnet

 

CNN

1950년 Hubel과 Wiesel의 뉴런 연구

- topographical mapping

- 뉴런의 계층구조

- Simple cells -> Complex cells -> hypercomplex cells

- 빛의 방향 -> 움직임 -> 끝 점

 

1980년 neocognitron

- simple/complex cell 사용한 최초의 NN

 

1998년 Yann LeCun

- NN 학습을 위한 역전파와 gradient-based learning

 

2012년 Alex Krizhevsky

- CNN의 유행


CNN으로 뭘 할 수 있을까?

- 이미지 분류

- Detection

- Segmentation

- 자율주행

- 얼굴인식 사람추정

- 자세 인식

- 의학 진단

- image captioning

- 화풍 변경


CNN의 원리

Filter

지금까지 우리가 다뤘던 Fully Connected Layer는 벡터를 펴서 내적 연산을 하는 방식이었습니다. Convolutional Layer의 경우 기존의 structure을 보존하며 계산을 하게 되는데요, 이 하늘색 필터가 이미지 내를 슬라이딩 하면서 공간적인 내적을 하게 됩니다. 모든 depth에 대해 내적이 진행되어야 하기 때문에, 필터의 depth는 input의 depth와 항상 같습니다.

 

더보기

Q. Convolution을 수행하려면 커널이 180도 회전되어야 하는것이 아닌가?

- 신호처리 분야에서는 실제로 필터 뒤집은 다음에 연산을 한다.

- CNN의 convolution은 의미적인 요소만 가져온 것이므로 걱정 ㄴ

 

그래서 필터가 어떻게 슬라이딩을 하면서 output을 뽑아내는지 알아봅시다. 아주 간단해요. 겹쳐놓고 내적하고, 슬라이딩해서 옆에서 계속 내적해서 output activation map의 해당 위치에 전달하는 방식입니다.

 

Activation map의 차원도 중요한데, 아래 사진을 보면 입력은 32x32, 출력은 28x28임을 알 수 있다.

보통 convolution layer은 여러개의 필터를 사용합니다. 그러면 필터마다 다른 특징을 추출할 수 있게 되죠. 한 레이어에서 아래와 같이 자신이 원하는 만큼 필터를 사용할 수 있습니다.

이제 이게 반복되는데, 사이사이에 activation, pooling등이 들어갑니다. 뒤에서 조금 더 설명할께요. layer는 여러개의 필터를 가지고 있고, 각 필터마다 각각의 출력 map을 만듭니다. 여러 레이어들을 거치면서 각 필터들이 계층적으로 학습이 가능해지는 것입니다.

아래 그림과 같이 여러개의 conv layer을 거치면서 단순한 구조에서 더 복잡한 구조로 찾아감을 볼 수 있습니다. 각 그리드는 하나의 뉴런(필터)입니다.

 

 

CNN의 전체적인 과정을 한 번 살펴봅시다.아래 그림과 같이 input 이미지는 여러 레이어들을 거치게 되고, 마지막에는 FC layer을 통해 스코어를 계산할 수 있습니다.

 

 

차원에 대해서도 살펴보자. 필터를 몇칸씩 움직일지를 stride로 정할 수 있습니다. 보통 input 사이즈와 슬라이딩 시 딱 맞아떨어지는 stride만을 이용합니다. 다음과 같이 출력의 크기를 구할 수 있습니다.

 

입력의 차원:N

필터 사이즈: F

 

stride를 설정해 줌으로써 pooling과 같이 다운샘플링할 수 있고, 더 좋은 성능을 가져다주기도 합니다. 이는 activation map의 사이즈를 줄이는 것이고, 나중에 FC layer의 파라미터의 수가 줄어들게 되겠죠.


zero-padding

하나 더 봐야 할 것은 zero-padding! 코너의 값들이 적게 연산되는 것을 막아주고, 레이어들을 거치면서 입력의 사이즈가 줄어드는 것을 막아줍니다. 깊은 네트워크에서는 Activation map이 엄청나게 작아지게 되고, 이는 정보를 잃는 것이죠. 항상 원본 이미지를 표현하기에 충분한 차원을 사용해야 합니다.

 

예제를 한번 풀어보자.

출력은 7x7x필터의 개수입니다. 각 필터가 입력의 모든 depth에 대해 내적을 수행한다(다시한번 필터의 depth는 input의 depth와 같다)

더보기

Q. 0 padding을 추가하면 모서리에 필요없는 특징을 추가하는 것은 아닌지?

- zero-padding은 꽤 좋은 하나의 방법일 뿐이다. mirror, extend 등이 있음. 약간의 artifact가 생길 수 있으나 꽤 잘 작동함.


더보기

tip

잠깐 짚고가는 일반적인 필터 사용법

- 3x3 필터 stride=1

- 5x5 필터 stride=2

- 7x7 필터 stride=3

- 필터의 개수는 2의 제곱수로 한다. 32,64,128,512

Torch 소개

- 다양한 레이어가 정의되어 있고, forward/backward pass가 구현되어있다.

필터가 즉 가중치

 

 

지금까지 배운 것으로 예제한번 더 풀어봅시다.

-> 필터당 5x5x3+1(bias)개의 파라미터 존재, 총 760개의 파라미터가 존재한다.

이제 뉴런과 연관지어 보자.

 

5x5 필터가 있다면 한 뉴런의 Receptive field가 5x5라고 한다. Receptive field란 한 뉴런이 한 번에 수용할 수 있는 영역을 의미한다.

 

또한, 만약 총 5개의 필터를 아래와 같이 거쳤다면, 한 점에서 depth 방향으로 바라보면, 이 5개는 정확하게 같은 지역에서 추출된 서로 다른 특징이다. 즉, 공간적 의미를 그대로 가져갈 수 있다.

 


Pooling, ReLU

다 배웠다! 이제 CNN에 들어가는 다른 Layer들도 살펴보자.

Pooling Layer

- Representation들을 더 작고 관리하게 쉽게 해줌

- DownSample

- 공간적인 invariance

- Depth는 그대로 둠

- 차원 계산은 (width-Filter)/Stride+1

- 보통 padding 안함( 코너 값 계산 못하는 경우 없다.)

- 2x2, 3x3, stride=2 많이 씀

pooling

 

Max Pooling

- 필터 크기와 stride 정하면 됨

- 필터 안에 가장 큰 값 고름

- 겹치지 않게 풀링 함

더보기

max Pooling

Q. Max Pooling이 Average Pooling보다 더 좋은 이유?

- 얼마나 이 뉴런이 활성화되었는지가 궁금함. 그 값이 얼마나 큰지가 중요.

Q. Pooling 이나 Conv Layer의 Stride나 똑같은거 아님?

- 맞음. 요즘은 stride 더 많이 씀

ReLU Layer

- 실제 방식과 가장 유사한 비선형함수

- 활성화할지 비활성화 할지 결정

- 젤 많이 씀

 

웹 데모: 필터, Activation map 관찰 가능

ConvNetJS CIFAR-10 demo (stanford.edu)

 

ConvNetJS CIFAR-10 demo

 

cs.stanford.edu

 

6강으로 돌아오겠습니다! 안뇽

반응형