본문 바로가기
인공지능/딥러닝

CNN의 등장과 발전 과정 - 1 (LeNet, AlexNet, GoogleNet)

by 도토리묵 :D 2022. 10. 2.

📌CNN의 등장

 

CNN은 데이비드 허블(David H. Hubel / 캐나다 신경학자)과 토르스텐 비셀(Torsten Wiesel / 스웨덴 신경학자)  이 두 신경학자는 1959년에 시각피질 구조에 대한 실험을  수행했다. 실험에서는 고양이가 사용되었는데 (그림 1) , 그때 시각피질 안의 많은 뉴런들이 작은 국부 수용 영역 (local receptive field)을 가진다는 결과를 보였다. 즉, 뉴런들이 시야의 일부 범위 안에 있는 시각 자극에만 반응을 한다는 의미다(그림 2).

 

뉴런의 수용 영역은 서로 겹칠 수 있으며, 이렇게 겹쳐진 영역들이 전체 시야를 이루게 된다.

(ps. 두 신경학자 선생님들은 1981년에 대뇌반구의 기능과 시각 정보화 과정에 관한 연구로 노벨 생리학 의학상을 수상했다 역시나 대단하신분들 👍..ㅎㅎㅎ)

 

출처: c231n
출처: ibiology science stories

이런 아이디어가 CNN으로 발전해왔으며, 1998년 Yann Lecn 이 손글씨 숫자를 인식하는 딥러닝 모델 LeNet-5를 소개하면서 CNN이 탄생하게 되었다. 두둥!!

 

 

 

 

📌CNN의 발전과정

 

LeNet

 

http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

 

LeNet은 위에서 설명한 것과 같이 Yann LeCun이 개발한 Cnn 아키텍처이다.

LeNet은 LeNet-1부터 LeNet-5까지 있고 최종적으로 1998년에 발표된 LeNet-5만 간략하게 설명하고 넘어가겠음!

 

 

LeNet 아키텍쳐

  • LeNet-5는 LeNet-1에서 보다 입력 이미지의 크기가 커졌다. 이로 인해 이전 대비 디테일한 부분까지 고려해 성능이 높아졌다.
  • LeNet-5는 네트워크가 크기 때문에 파라미터수는 6만 개다. (LeNet-1: 약 3천 개)
  • Convolution layer 3개, 2번의 Average pooling , Fully connected layer 1개로 구성되어 있다
  • 활성화 함수는 tanh, average pooling 사용
  • CNN의 구조를 처음 제안한 모델이라는 점에서 의의가 있다 (최근에는 잘 사용되지 않음)

 

 

 

 

✅AlexNet

 

https://proceedings.neurips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf

 

AlexNet은  제프리 힌턴(Geoffrey E. Hinton) 교수님이 제안한 모델로써2012년에 개최된 ILSVRC(ImageNet Large Scale Visual Recognition Challenge) 대회에서 Top 5 error를 15.3%로 2등인 모델과 앞도적인 성능 차이로 우승을 한 CNN구조이다.
(참고로 2등은 26.2%... ㅋㅋㅋ
이 당시 엄청났다고 함.. 1~2퍼센트 차이로 우승이 가려지는 대회인데 ㅎㄷㄷ 😮)

 

 

AlexNet 아키텍쳐(출처: 딥러닝 바이블)

  • AlexNet은 Convolution Layer 5개,  Fully connected layer 3개로 구성되어 있다
  • 활성화 함수로 relu와 max pooling을 사용함
  • AlexNet은 당시에 표준이었던 tanh 함수 대신에 ReLU(Rectified Linear Units)를 사용한다.
    ReLU의 장점은 훈련 시간에 있는데, ReLU를 사용하는 CNN은 tanh를 사용하는 CNN보다 6배 더 빠르게 CIFAR-10 데이터셋에서 25% 오류에 도달할 수 있었다고 한다
  • Multiple GPUs: 그 당시에는 GPU는 여전히 3기가 바이트의 메모리로 돌아다니고 있었다고 한다. (훈련 데이터셋에 120만 개의 이미지가 있었기 때문에 이것은 특히나 좋지 않았음..)
    그래서 이 많은 파라미터를 학습시키기 위해 GPU를 병렬로 사용해 학습하는 방법을 사용했다고 한다.
    이는 더 큰 모델을 학습할 수 있을 뿐만 아니라 학습 시간도 단축한다는 것을 의미함.
    (GTX 580 2대를 사용해서 일주일 이상 학습시켰다고 함 ㅎㄷㄷ..)

하지만 AlexNet은 6천만 개의 파라미터가 있었는데, 이는 과적합 측면에서 주요한 문제였었다. (참고로 LeNet은 파라미터가 6만 개였음.. 그리고 모델 파라미터가 많다고 무조건 좋은 것이 아님 ㅎㅎ~~ 이 부분은 추후 별도 포스팅할 예정)

 

이 과적합을 줄이기 위해서 두 가지 방법이 사용되었는데

1. Data Augmentation

2. Dropout

이 두가지 방법이다.

 

  •  Data Augmentation : 일부 데이터에 과적합되지 않게 하기 위해 논문의 저자는 data augmentation 기법을 사용했는데 특히, 이미지 변환 및 수평 반사를 생성해서 훈련 데이터셋을 2048배 증가시켰다. 
    또한 RGB 픽셀 값에 대해 PCA(Principle Component Analysis)를 수행하여 RGB채널의 강도를 변경해서 Top 1 error도 줄였다.
  • Dropout : AlexNet에서는 처음 2개의 Fully connected layer에 50% 확률로 Dropout을 적용했다. 이 기술은 일정 확률로 뉴런을 "turning off" 하는 것으로 구성된다고 한다. 쉽게 설명해 매 iteration 마다 다른 샘플의 모델 파라미터를 사용한다는 의미다. (이 dropout에 대해서도 추후 포스팅 예정~!)
    하지만 dropout은 또한 학습시간을 증가시키는 단점이 있음.

 

 

그리하여 AlexNet은 CNN이 본격적으로 많이 사용된 계기가 된 구조이다! (구조가 간단해 요즘은 잘 안 씀)

 

 

 

 

✅GoogleNet

 

GoogLeNet은 2014년 ILSVRC대회에서 1위를 차지한 모델이고, 가장 큰 변화는 네트워크 층의 깊이이다.

 

https://arxiv.org/pdf/1409.4842.pdf

CNN의 성능을 향상하는 가장 직접적인 방법은 네트워크의 크기를 늘리는 방법이다.

2013년까지는 CNN 네트워크 깊이가 10개 미만이었으나, 2014년 GoogLeNet과 VGGNet이 각각 22 layer, 19 layer로 2배 이상 커졌다. 이로 인해 Top-5 에러율도 각각 6.7%, 7.3% 낮아졌다.

 

하지만, 네트워크가 깊어진다고 무조건 다 좋은 건 아니다. 그에 따라 파라미터 수가 증가하게 되고 그 결과로 Overfitting문제가 발생하거나 연산량이 급격히 늘어날 수 있다. 

 

위에 설명한 AlexNet만 보더라도 파라미터 수가 6천만 개이고 GPU 2개를 사용해서 일주일 이상 학습을 시켰다. 단순히 네트워크만 깊게 만들면 학습시간이 엄청나게 길어질 수 있다.

 

따라서, 이러한 문제를 해결하기 위해서는 네트워크 구조의 변화가 필요하다고 생각했고 Google에서 Inception이라는 모듈로 구성된 GoogleNet으로 이를 해결했다.

 

 

Googlenet 아키텍쳐 (출처: 구글)

 

Inception 모듈

inception 모듈

Inception 모듈은 싱가포르 국립대학의 Min Lin이 2013년에 발표한 “Network in Network”의 구조를 더 발전시킨 형태이다.

1 X 1 Convolution으로 채널의 수를 줄여서 파라미터 수를 줄이는 것이 Network in Network의 핵심 내용이다.

(보통 CNN에서는 Convolution 연산을 통해서 피쳐맵의 Width와 Height의 크기는 줄고 채널 수가 늘어나는 형태인데 일반적으로는 Max pooling이 Width와 Height를 줄이는 역할을 한다. 1 X 1 Convolution 연산으로는 채널을 줄일 수 있고 그 결과로 학습해야 하는 파라미터 수의 감소가 일어난다고 보면 됨)

 

초기에는 위 그림의 좌측처럼  1x1/3x3/5x5 Convolution, 3x3 Max pooling을 나란히 놓는 구조를 만들었다. 하지만 3x3/5x5에서도 파라미터를 줄이기 위해 나중엔 우측처럼 사용하였고 Bottleneck 구조라고도 불린다

 

GoogleNet에서는 이를 반영해서 네트워크를 깊게 만들면서도 연산량의 수가 늘지 않는 Inception이라는 모듈을 만들었다. 이로 인해 AlexNet 보다 12배나 파라미터수가 감소하였다

 

GoogleNet은 총 9개의 Inception으로 구성되어 있다고 한다.

 

 

Gradient desent (경사 소실 문제)

하지만 GoogleNet은 층의 수가 많기 때문에 파라미터가 앞쪽으로 갈수록 업데이트가 되지 않는 Gradient desent 문제가 발생할 가능성이 높다.

 

이문제를 해결하기 위해 추가 분류기를 사용한다.

아키텍처 중간에 일부 추가 분류기 분기를 사용했으며 이러한 분기는 훈련 중에만 사용된다. 

추가 분류기를 통해 종속변수 예측치를 도출한다. 그리고 이 예측치를 통해서 새로운 비용 함수를 계산해서 앞쪽 층의 파라미터 업데이트를 실시한다. 비용함수를 보면 이해가 더 쉽게 될 것이다.

GoogleNet cost function

 

 

 

 

 

 

댓글