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

cs231n 9강 CNN Architectures 요약

by inhovation97 2020. 12. 5.

9강은 CNN 아키텍쳐를 이용했던 모델들을 구체적으로 파헤쳐봅니다.

  • LeNet
  • AlexNet
  • VGG
  • GoogLeNet
  • ResNet

 

특히 이미지넷에서 우승했던 모델들을 위주로 살펴봅니다.

먼저 일전에도 언급했던 LeNet부터 살펴봅시다.

 

LeNet은 처음으로 성공한 instantiation 중에 1개였습니다.

이미지를 넣으면 5x5필터를 적용한 ConV층이 있고, Pooling 레이어를 거쳐서 FC 레이어로 넘어갔죠.

이 간단한 구조로 숫자인식에 성공했습니다.

지난 강의에서도 했던 내용이죠?

 

다음으로는 2012년 놀라운 성과를 보인 AlexNet입니다.

AlexNet은 처음으로 large scale로 구성한 CNN이었습니다.

2012 컴피티션에 참가해서 이전의 모든 non deep learning 모델들을 큰 차이로 outperform하여 우승했습니다.

 

CNN의 시초인 LeNet이랑 구조가 굉장히 비슷합니다.

Layer가 많아졌고, 이런 ConV layer가 5개있고, FC layer가 2개 있습니다.(마지막 출력층을 제외하고)

강의에서는 ConV층에서 필터를 거치면서 데이터의 size가 바뀌는 것을 하는데, 이는 지난 강의에서 했으므로 이번 포스팅에서는 생략하겠습니다.

 

위 요약 슬라이드에 필터와 stride, pad의 size가 썼는지 나와있습니다.

 

그래도 구조를 약간 설명하자면,

ConV층에서 Pooling은 지난 강의에서 보통 max Pooling으로 receptive field에서 지정한 구간내의 max값을 취한다고 했었죠? 그러므로 맥스풀링에서는 파라미터가 없습니다.

그렇게 ConV layer를 거치면 이 feature map들을 flatten해주므로 4096개 뉴런이 있는 FC layer로 진입합니다.

 

FC층에서 FC6,7 layer에서는 가장 흔히 쓰는 Relu함수를 비선형 함수로 이용합니다.

그리고 출력층 FC8에서는 1000개의 class score를 뱉기 위한 softmax함수를 이용합니다.

 

2개의 Normalization층은 실험 결과, 크게 효과가 없다고 밝혀져서 현재는 잘 사용하지 않지만 AlexNet에서는 쓰였습니다.

 

AlexNet에서는 많은 data Augmentation이 쓰였다고 하는데, 관련 논문들을 보면 jittering, cropping, color normalization 등등 굉장히 많이 쓰였다고 합니다.

 

128 batch로 drop out도 쓰였으며, 지난 시간 배운 SGD Momentum을 0.9로 설정했고, learning rate는 1e-2를 쓰면서 문제가 생기면 1/10씩 줄여갔다고 합니다.

L2 weight decay를 썼다고 하는데, 이는 weigt에 규제항을 추가한 것 같고

마지막에는 성능 향상을 위해 앙상블을 했다고 합니다.

 

그리고 여기 보면, 2개로 찢어진게 보이시죠?

원래대로라면 11x11의 필터 96개를 적용해서 feature map이 55x55가 96개가 있어야 하는데 자세히 보면, 48로 2개로 나뉘어 집니다.

이는 AlexNet을 GTX580으로 학습했는데, 이게 3GB짜리여서 GPU 2개를 써서 half씩 할당했다고 합니다.

 

이렇게 좋은 성과를 얻어낸 AlexNet은 2015까지 많이 쓰이고, 또 여러 다른 task에서 전이 학습으로 많이 쓰였다고합니다.

 

2013에는 ZF Net이라는 챌린지가 있었고, AlexNet에서 크게 바뀐 점이 없이 그저 거의 하이퍼 파라미터들만 약간 바꿔서 error rate가 많이 개선 되었다고 합니다.

 

이렇게 필터값이나 stride 사이즈들을 바꿔서 이뤄낸 결과였다고 합니다.

 

2014에서는 2개의 아키텍쳐가 큰 차이로 성능을 향상시켰다고 합니다.

main idea는 모델을 더욱 deep하게 만든 것이었습니다.

먼저 두 모델 중에 VGG를 봅시다.

 

더 작은 필터를 쓰고 더 깊은 네트웍을 쓴게 main idea였습니다.

알렉스 넷에 비해 16, 19개의 layer로 더 깊어졌고, error rate가 굉장히 많이 줄었죠?

 

그럼 왜 필터는 오직 3x3만 썼을까요?

이는 layer를 더 깊게하고 파라미터 수를 줄여 효율성을 깊게 만들기 위해서였습니다.

 

3x3 필터를 쓰면 3번 쓰면,7x7 필터를 1번 쓴 것과 feature map이 같은 size로 줄어들게 됩니다.

( 제가 참고했던 블로그 링크가 이 글 마지막에 있으니 보시면, 쉽게 이해가갑니다. )

그럼 같은 효과로 더 깊은 네트웍을 쌓을 수 있죠? 

심지어는 activation 함수도 더 많이 넣어줄 수 있습니다.( CNN layer는 항상 필터 적용후에, activation function을 적용해주죠 )

이번엔 3x3을 3번 쓴 것과 7x7을 1번 썻을 때의 파라미터 차이를 봅시다.

필터는 각각 가중치를 가지고 있다고 했습니다.

그럼 파라미터 수를 계산해보면,

3x[3x3(필터의 가중치 수)xC(채널의 수)]이므로 3^3XC가 됩니다.

7^2XC > 3^3XC 이므로, 파라미터의 수가 훨씬 적죠.

그래서 3x3의 필터를 고집한 것입니다. 

메모리가 굉장히 중요한데, 메모리적으로도 이득인거죠.

 

 

여기 보면 total 메모리가 only forward 과정에서만, image 1개당 거의 100mb가 필요합니다.

전체 메모리가 5GB라면, 50장밖에 못하는 거죠...

알렉스 넷은 60MB가 필요했는데, layer가 깊어진 만큼 메모리 부담이 크게 늘어납니다.

 

강의 내 Q&A 입니다.

Q : 쓸모없는 것들도 많은 텐데 꼭 memory를 많이 써가면서 연산을 전부 저장해야하는가?

A : 전부는 아니지만, NN은 Backward에서 체인룰을 이용해서 update해나가기 때문에 상당 부분의 연산을       저장 해야한다.

 

VGG Net 요약입니다.

2014 이미지 넷에서는 2등, localization에서는 우승을 한 훌륭한 모델입니다.

알렉스 넷에서 말했듯이 Local Response Nomalization은 성능향상에 크게 도움이 안되어 쓰지 않았다고 합니다.

 

보시다시피 VGG19가 16보다 더 deep하고 성능이 좋지만, 메모리가 많이 들어서 16이 더 많이 쓰였다고 하고, 여러 모델을 앙상블해서 bet result를 찾았다고 합니다.

그리고 마지막 FC7은 피쳐들을 굉장히 잘 대표했다고 합니다. 다른 데이터들에서도 feature들을 잘 추출해냈고, 다른 task들도 일반화를 잘 시켰다고 합니다.

 

이번에는 2014 classification에서 우승했던 GoogLeNet을 살펴봅시다.

구글넷은 VGGNet의 연산량의 한계에 대해서 많이 고민한 모델입니다.

물론 layer도 22개로 훨씬 깊어졌지만, 파라미터 수는 5M개로 AlexNet보다 개수가 작습니다.

심지어는 파라미터를 줄이기 위해서 FC layer를 제거했죠.

 

오른쪽의 인셉션 모듈을 봅시다.

그림처럼 병렬처리를 해줌으로써 연산에 엄청난 효율을 가져옵니다.

 

먼저 naive 버전입니다.

병렬 처리를 생각한 모델인데, 필터와 풀링을 병렬로 처리한 뒤, 상위의 Filter concatenation에서 한꺼번에 concate를 해줍니다.

 

여기서 point가 여러가지가 있는데 우선 각 필터에 stride는 무조건 1로하고, 3x3, 5x5에 각각 제로패딩을 해주어서 size가 같은 feature map들이 나오게해서 concate 시켜줍니다.

그렇게 하면, 위 슬라이드를 예로 각각의 filter로 부터 전부 같은 size의 feature map들이 나오게 되는데, 이는 기존의 한 layer에서는 무조건 같은 사이즈의 filter만 썼던 것과는 달리 굉장히 다양한 특성을 지닌 feature map들을 얻을 수 있습니다.

(concate를 하면, 4개의 필터를 거친 같은 사이즈들의 feature map들을 묶는 것입니다.)

 

두번째 point는 1x1 filter입니다. 굳이 1x1 filter를 쓰는 이유는 각각 필터값들이 변하지 않은 채로 depth가 줄어듭니다. ( 이는 아래 슬라이드에서 추가 설명합니다. )

가령, 28x28x128의 feature map을 1x1x128필터를 16개쓰면 28x28x16개로 depth를 줄여서 연산량을 많이 줄일 수 있죠.

 

세번째 point는 3x3 Pooling 했을 때, max Poolig을 해주면 이전 stride의 max값이 다음 stride의 필터에도 겹쳐서 좋은 값을 여러번 쓸 수 있습니다. 

이미지 내에서 특징이 강한 픽셀값을 여러번 쓸 수 있는 것입니다.

 

하지만 naive 버전은 문제가 있습니다.

이렇게 같은 size의 feature map들을 concate해주면, 128+192+96+256 = 672개 channel이므로

854M의 연산을 통해서 28x28x672 feature map이 나옵니다.

너무 많아요 연산의 효율을 높혀야 합니다.

 

풀링 레이어도 depth를 줄일 수 없는 것이 문제입니다.

풀링 레이어는 공간 정보를 전부 다 가지고옵니다.

 

그래서 아까 말한 1x1 ConV를 이용해서 채널의 수를 줄여주려합니다.

 

이렇게 56x56x64의 피쳐맵을 1x1x64의 필터를 32개 써서 depth를 줄여줍니다.

이렇게 하면, spatial dimension의 손실 없이 depth를 줄일 수 있는 큰 장점이 있죠.

 

(피쳐 맵을 제로 패딩해서 stride를 1로 설정하고 size가 변하지 않게 1보다 큰, 예를 들면 5x5 필터를 쓰는 것 보다 연산량도 훨씬 적습니다.)

 

그래서 오른쪽의 아키텍쳐를 설계하게 되고, 1x1 ConV를 bottleneck layer 라고 칭합니다.

연산량과 channel을 줄이기 위해 naive 버전에서 bottleneck layer를 먼저 거치게끔 만들었죠. 

 

풀링 레이어는 풀링 레이어에서 나온 feature map들을 bottleneck layer에 넣어주네요.

 

bottleneck layer를 깔아주니, naive 버전에 비해 depth와 ConVops가 많이 줄어들었죠?

 

Q : 1x1 layer를 쓰면 정보가 손실되는게 아닌가?

A : 분명히 정보 손실은 있지만 중복값들이 있는 feature map들을 선형결합 하면서, 또 다양한 조합의 feature map들을 얻어 여러번의 non-linearity를 가해주면, 차원도 줄이면서 더 깊은 층을 설계할 수 있고,  이것에 대해서 더 면밀히 분석은 안해봤지만 확실히 여러가지 이유로 인해 더 잘 작동된다.

 

그렇게 탄생한 GoogLeNet의 full 아키텍쳐입니다.

 

마지막에는 파라미터를 줄이기 위해서 FC층을 제거합니다.

또 제거한 모델이 더욱 잘 작동한다고 합니다.

 

https://bskyvision.com/539?category=635506

이렇게 기존 flatten방식으로 하면, 연산량이 너무 많이 생기므로 각 feature map들을 평균내어 channel 수 만큼 레이어에 가져온 것이죠.

만약 FC 방식을 사용한다면 훈련이 필요한 가중치의 개수가 7 x 7 x 1024 x 1024 = 51.3M이지만 global average pooling을 사용하면 가중치가 단 한개도 필요하지 않죠.

 

앞선 레이어들에서 효과적으로 다양한 필터를 통해 feature map을 통과 시켰기 때문에 과감하게 에버리지 풀링을 했다고 합니다.

파라미터 수도 많이 줄어서 과적합도 방지합니다.

 

강의에서는 mini network라고 지칭합니다.

layer가 깊어질수록 backward 과정에서 Vanishing gradient를 걱정하지 않을 수 없습니다. 

그래서 아래 두개의 보조기를 달아 놓았는데, 이 보조기는 에버리지 풀링도 있고, FC layer도 있습니다.

FC layer는 soft max 함수라서 1000개의 이미지의 스코어를 뽑아낼 수도 있다고합니다. 

그러면, loss도 계산이 가능하죠.

 

layer가 깊어지므로 gradient의 손실을 막기위해 설계했다는데, 정확한 원리 설명은 없어서 저도 이해가 가질 않네요. 

그저 이전 단계에서의 gradient를 주입해준다고 합니다.

 

Q : 최종 loss에서 이 보조기들의 loss가 쓸모가 있나요?

A : 쓸모가 있다. 최종 분류에서 어떻게 평균을 냈는지는 정확히 기억이 나지 않지만, 이것들을 아마 활용한다.

 

GoogLeNet 마무리입니다.

22개 layer로 되어있다.

인셉션 모듈이 쓰였다.

FC layer를 삭제했다.

AlexNet보다도 파라미터 수가 작다.

14년도에 우승한 알고리즘이다.

 

이번에는 2015 Challenge를 우승한 ResNet입니다.

마이크로 소프트에서 개발했다고 합니다.

 

ResNet은 revolution이라고 할 만큼 네트웍이 깊어집니다.

무려 152개의 레이어를 지닌 아키텍쳐입니다.

 

 

우선 연구자들은 layer의 깊이와 성능이 비례하는지에 대해 의문을 가졌다고합니다.

깊이가 깊어질수록 성능이 좋아지는게 맞는걸까?

 

 

결과는 그렇지 않았습니다.

오버 피팅의 문제도 아닙니다. 그냥 train/test 성능이 둘 다 좋지 않습니다.

ResNet저자들은 여기서 residual connection의 탄생을 이끕니다.

 

더 깊은 모델을 세울 때 어느 순간 optimization에서 문제가 생긴다고 생각한 겁니다.

우선 저자들은 이 문제에 어떻게 다가갔는지가 중요합니다.

 

깊이가 얕은 모델과 그 모델을 고대로 가져와서 깊이를 더 깊게 만드는데 깊이를 더 깊게 만들때 추가 layer들은 identity mapping을 해줍니다.( 입력값이 들어오면 그대로 출력값으로 나가게끔 해준다는 의미 )

그렇게 하면 적어도 얕은 깊이의 모델의 성능은 나와야 될겁니다. 맞죠?

 

그렇게 핵심 아이디어인 Residual block이 나옵니다.

 

 

슬라이드를 보시면 기존의 층과 Residual block을 넣은 층의 비교입니다.

전 슬라이드에서 말한 아이디어를 적용한 개념이 바로 오른쪽의 그림입니다.

 

기존 출력값인 F(x)에 identity mapping으로 입력값인 x를 더해줍니다.

 

강의에서는 F(x)를 변화량 delta라고 표현합니다.

기존 왼쪽의 layer인 H(x)로 학습하는 방식은 네트웍이 깊어질수록 학습이 어려워지고 문제가 생겼습니다. 

그래서 이 구조를 깨버리고 변화량인 F(x)를 학습하는 Residual block을 설계한 것입니다.

 

강의에서는 이를 입력값을 수정한다는 의미로 받아들일 수도 있다고 설명합니다.

 

F(x) = H(x) - x이고 변화량인 F(x)를 residual이라고 표현할 수 있습니다.

그래서 이 아키텍쳐는 ResNet이라는 이름이 붙게 된거죠.

 

이게 이해하기 굉장히 힘들 수 있습니다.

전 슬라이드의 의미를 되새기면서 생각해보면, 네트웍이 깊어질수록 과적합 문제가 아니라 optimization에서 문제가 일어나기 때문에 학습 방식을 고쳐야 한다고 생각했어요.

저자들은 56층의 layer가 적어도 20 layer의 성능이 나오면 나왔지 더 나빠지지 않도록 할 수 있는 방안을 고심했고, 그게 바로 residual block인 것입니다! 

20층이 사실 최고의 성능을 내는 부분이었고, 56층까지 가면서 변화량이 0이라면, residual block은 나머지 층에서 계속 input=output 값을 내보내게 되는 것이고, 이게 backward 시에는 더해주는 상수 값인 x가 계속 존재하니까 기울기 소실의 문제도 해결하게 되는 것입니다! 

가설이 먹힌 것이지요

(제가 이해한 방식을 최대로 설명했네요 ㅋㅋㅋ...)

 

 

 

 

 

 

ResNet은 기본적으로 VGG-19를 뼈대로 ConV층을 추가해 layer를 깊게 만들었습니다.

3x3 ConV layer를 2개씩 쌓고 residual block을 끼워 주는데, 주기적으로 필터를 2배씩 늘리고 stride를 2로 두어서 다운 샘플링해주었다고 합니다.

 

모델의 시작은 ConV층으로 시작해서,

모델의 마지막에는 FC층이 없고, global average pooling을 이용했다고 합니다.

마지막은 1000 카테고리 이미지 분류를 위한 FC층만 있죠.

 

34, 50, 101, 152 resnet이 있습니다.

저자들은 결국 152층까지 설계하게 된거죠.

이에 대한 성능 비교도 했는데, 제가 공유한 블로그에 가시면 됩니다.

 

50 layer부터는 파라미터가 급격하게 많아져서 bottleneck을 이용한다고 합니다.

넘어가지 않으면 그냥 3x3 ConV를 연속해서 쓴다고하네요.

 

ResNet은 모든 ConV layer 후에 계속해서 BN을 써준다고 합니다.

초기화는 Xavier/2를 이용한다고 합니다 Xavier는 지난 강의에서 배웟었죠?

learining rate는 0.1에서 loss가 줄지 않으면 조금씩 줄여서 학습을 시킵니다.

drop out은 쓰지 않았다고 합니다.

 

*강의자료

**참고한 블로그

cs231n.stanford.edu/2017/syllabus.html

 

Syllabus | CS 231N

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

cs231n.stanford.edu

bskyvision.com/539

 

[CNN 알고리즘들] GoogLeNet(inception v1)의 구조

LeNet-5 => https://bskyvision.com/418 AlexNet => https://bskyvision.com/421 VGG-F, VGG-M, VGG-S => https://bskyvision.com/420 VGG-16, VGG-19 => https://bskyvision.com/504 GoogLeNet(inception v1) =>..

bskyvision.com

bskyvision.com/644

 

[CNN 알고리즘들] ResNet의 구조

LeNet-5 => https://bskyvision.com/418 AlexNet => https://bskyvision.com/421 VGG-F, VGG-M, VGG-S => https://bskyvision.com/420 VGG-16, VGG-19 => https://bskyvision.com/504 GoogLeNet(inception v1) =>..

bskyvision.com

댓글