본문 바로가기

머신러닝/[논문으로 짚어보는 딥러닝의 맥]

4가지 CNN 살펴보기: AlexNet, VGG, GoogLeNet, ResNet

핵심 키워드

  • CNN(Convolutional Neural Network)
  • Conv2D
  • AlexNet
  • VGG
  • GoogLeNET
  • ResNet

학습하기

 오늘 살펴볼 CNN 아키텍쳐는 총 4가지 입니다. AlexNet, VGG, GoogLeNet, ResNet. 일반적으로 유명한 CNN 아키텍쳐로 이 4개를 꼽기도하며, ILSVRC라는 이미지 분류대회에서 1등을 했던 모델들입니다. 이 대회에서 기존에는 CNN 모델이 거의 없었지만 AlexNet의 1등을 시작으로, 거의 대부분의 참여자들이 CNN 모델을 가져왔습니다.

AlexNet, VGG, GoogLeNet, ResNet 순서대로 개발되었으며, 점점 레이어가 깊어지면서, 성능도 개선되었습니다. 물론 레이어가 그냥 많다고 성능이 좋아지는 건 아닙니다. 성능이 좋아질 가능성이 생길뿐. 일반적으로 과한 레이어는 오히려 학습을 방해합니다. 그래서 이번에는 레이어를 어떻게 잘 쌓을까에 대한 테크닉을 배워보겠습니다.

 첫번째는 AlexNet입니다. 첫번째로 파라미터의 수를 잘 아셔야합니다. 두번째로 알렉스넷의 경우에는 당시 GPU의 성능이 좋지 못했기 때문에, 모델을 2개 파트로 나누어 각각 학습시켰습니다. 알렉스넷의 경우, 사실 굉장한 테크닉을 썼다기보다, 가장 기본적인 내용을 강조하였습니다.

 렐루(Relu)는 액티베이션 함수입니다. 요즘에는 그냥 왠만하면 렐루를 쓰는게 좋다. 라고 모두가 받아들이고 있습니다. 특히나 분류의 경우에는. 잘 안되면 그 때 다른 액티베이션 함수를 적용합니다.

 LRN(Local Response Normalization). 일종의 정규화 테크닉입니다. 우리가 아웃풋으로 컨볼루셔널 피쳐 맵이 나오면 이 중에서 일정 부분만 높게 액티베이션(값을 갖도록) 되도록 하는 것입니다. 

 알렉스넷의 정규화의 경우에는, 2가지를 사용했습니다. 첫번째는 Data augmentation. 데이터를 늘리는 것입니다. 데이터가 10000장이 있을 때, 데이터를 좌우반전(Filp augmentation), 일부를 자르는 것(Crop augmentation) 등을 사용하면 더 많은 데이터를 확보할 수 있습니다. 그러나 주의할 것은 내가 찾고 싶은 물체가 어떤 건지 명확히 알고, 적용해야한다는 것입니다. 예를 들어 7을 예측해야하는데 7이라는 이미지를 반전시킨다면, 그것은 전혀 다른 이미지가 되어버립니다.

 알렉스넷의 경우 256 x 256 이미지에서 224 x 224 이미지를 크롭하는 것으로 32*32개의 이미지를 얻고, 다시 반전하는 것으로 총 32*32*3=2024개의 이미지를 확보합니다. 데이터가 만장이였다만 이천만장으로 증가하는 것이죠. 이에 더하여 Color variation(jiltering)을 적용합니다.  이미지의 RGB 채널에 어떤 특정값을 더함으로써 노이즈를 주는 것입니다.

 또 Dropout이 있습니다. 이는 학습시에 해당 레이어의 일정 노드(랜덤)를 0으로 만들어주는 것 입니다. 알렉스넷의 경우 그냥 아웃풋에 0.5를 곱하는 방식을 사용하였습니다. 이런 방식은 알렉스넷만 채택하였습니다.

 다시 한 번 강조하지만, 파라미터 수를 잘 계산하셔야합니다.

 이제 VGG를 보면, 별로 설명할 것은 없습니다. 컨볼루션은 모두 3,3 스트라이드는 1을 사용하였습니다. VGG는 옥스포드 대학의 팀이름입니다. 이 구조는 아주 간단한 방법론으로 좋은 성적을 냈다는 점으로 주목받습니다. 총 6개의 VGG 모델 중 VGG16과 VGG19가 자주 활용됩니다.

 다음은 GoogLeNet입니다. Yann Lecunn이 구글에서 개발한 아키텍쳐로 굉장히 재밌게 생겼습니다. 22 레이어를 가졌으며 인셉션 모듈이라는 것을 채택하였습니다. 2014년 ILSVRC에서 1위를 하였습니다. 인셉션 모델은 여태봤던 CNN구조와는 조금 다릅니다. 한 개의 네트워크가 중간에 갈라집니다. ...그림을 참고하시면 이해가 될 것 같습니다... 핵심은 1 x 1 컨볼루션을 사용했다는 점입니다. 그냥 컨볼루션을 할 때보다, 1 x 1 컨볼루션을 하고, 컨볼루션을 적용했을 때 파라미터이 수가 줄어들고, 성능이 향상됩니다. 15x15x18을 30개의 3x3x18필터로 컨볼루션하면 15x15x30 피쳐맵이 나오게 되고, 파라미터의 수는 3*3*18*30=4860입니다. 15x15x18을 5개의 1x1x18필터로 컨볼루션하면 15x15x5 피쳐맵이 나오고, 이에 30개의 3x3x5필터로 컨볼루션하면 15x15x30 피쳐맵이 나오지만, 총 파라미터의 수는 (1*1*18*5=90) + (3*3*5*30=1350) = 1440개가 됩니다. 레이어가 늘어났음에도, 레이어를 정의하는 파라미터의 수는 줄었습니다. 생각해봅시다. 파라미터의 수를 개산하는 것은 결국 필터의 가로세로크기와 채널, 필터의 개수입니다. 그런데 필터의 가로세로크기와 개수는 줄이는 데 제약이 많습니다. 채널을 줄이는게 훨씬 쉽죠. 간단히 1x1 필터를 사용하면 작은 계산으로 채널을 줄일수있으니까요. 해서 구글넷은, 이런 인셉션 모듈을 계속 쌓아나간 형태입니다. 이를 네트워크 인 네트워크 구조라고합니다. 

 구글넷에서 배워야할 것은 차원(채널) 축소를 위한 1x1 컨볼루션 아이디어입니다. 두번째로는 갈린 레이어를 만든 그 구조 자체입니다. 갈림길이 생김으로써 조금 더 다양한 특성을 모델이 찾을 수 있게 되었습니다. 이런 구글넷은 VGG보다 깊어졌음에도, 사용된 파라미터는 절반 이하로 줄었습니다. 

 인셉션 v4는 비교적 최근에 발표된 모델인데요. 앞의 구글넷은 5x5 등의 필터를 종종 사용하였는데, v4에서는 오로지 3x3만을 사용합니다. 파라미터를 줄이기위해 5x5를 3x3 두 개로 줄이는 등 여러 구조를 차용했습니다. 이렇게 하니 모델의 정확도가 개선되었는데, 사실 왜인지는 설명하지 않습니다. 그냥 했더니 잘됬다가 끝입니다.

 ResNet. 이건 Deep residual network입니다. 152개의 레이어를 가졌으며 총 5개의 이미지 분류 대회에서 1위를 차지했습니다. 다양한 대회에서 한 개의 모델로 순위를 쟁취했다는 것은, 굉장히 범용성 있고, 좋은 모델임을 의미합니다. 

 네트워크가 deep 하면 좋은가? 당연히 항상 좋지는 않습니다. 그라디언트 배니싱 문제 때문입니다. 때문에 그래디언트를 처음 초기화하는 좋은 메서드를 사용하고, 배치 정규화를하고, 좋은 액티베이션(Relu)를 사용합니다. 이들을 사용함으로써 그래디언트 배니싱문제는 어느 정도 해결됩니다. 그렇다면 다른 문제는 무엇인가. 오버피팅? ResNet은 아니라고 답합니다. 대신 Degradation 문제를 제안합니다. 오버피팅은 트레이닝 에러가 줄어듬에도 테스트 에러는 감소하다 어느 순간부터 서서히 증가하는 것입니다. 트레이닝 데이터를 너무 잘 맞추려하다보니 테스트 데이터를 잘 못 맞추는 것이죠. 이 때문에 얼리스탑콜백을 사용하기도 합니다. 반면, 디그레이션은, 트레이닝 정확도도 테스트 정확도도 잘 나옴에도 불구하고, 실전 성능이 안나오는 것입니다. 사진을 보시면 오버피팅이 없음에도 딥한 모델의 정확도가 낮은것을 알 수 있습니다. 

 Residual learning building block에 대해 알아보겠습니다. ...그림을 보시면 이해할 수 있습니다... 결국 x값과 학습된 값x'사이의 차이만을 모델이 학습을 하는 것입니다.

 그렇다면 이런 잔차 학습이 왜 좋은가? 논문을 그대로 해석하겠습니다. 우리는 오리지널을 최적화하는것보다 잔차를 최적화하는 것이 더 쉬울 것이라 가정했다. 네, 그냥 했어요. 수학적 백그라운드에서 산출된 지식이 아니라 그렇게 가정을 했고, 잘 됬습니다. 계속 말하면, 깊은 잔차 네트워크는 최적화하기 쉽다. 정확도를 올리기 쉽다. 그게 논문의 결과입니다. 주의할 점은 인풋과 아웃풋의 디멘션을 맞춰주는 것 뿐입니다.

 때문에 그림과 같이 1x1 레이어로 차원을 축소하고, 3x3 컨볼루션으로 학습하고, 1x1 레이어로 차원을 증가시킵니다. 이를 Deeper bottleneck architecture라 칭합니다. 

 그래서 resnet을 씀에 따라 deep한 네트워크의 성능이 개선되는 걸 확인할 수 있습니다. 물론 100%는 아닙니다. 또다시 너무 딥한 네트워크는 덜 딥한 네트워크에 비해 성능이 떨어지는 경우가 발생합니다.