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

CNN의 등장과 발전 과정 - 2 (VGGNet, ResNet, DenseNet, EfficientNet)

by 도토리묵 :D 2022. 11. 19.

지난 시간에 이어 이번에는 나머지 CNN 계열을 살펴보자~

 

✅VGGNet

VGGNet은 2014년 ILSVRC대회에서 2위를 차지한 모델이다. 하지만 Googlenet 보다 구조가 훨씬 간단하여 오늘날까지도 백본 모델로 많이 사용되기에 설명을 하려 한다.

https://arxiv.org/pdf/1409.1556.pdf

 

 

VGGNet은  Very deep convolutional networks for large scale image recognition라는 논문 제목과 같이 Network 깊이가 CNN 성능에 어떤 영향을 주는지 알아보기 위해 층을 깊이 쌓는 것에 초점을 맞춘 연구이다.

 

일반적으로는 레이어층이 깊어지면 깊어질수록 모델의 성능은 좋아진다. (무조건 좋아지는것은 아님.. vanishing gradient와 같은 여러 문제가..ㅎㅎ)

 

VGGNet은 이전 CNN모델들 보다 훨씬 깊은 layer을 가진다.

 

 

VGGNet 구조 <그림1>
VGGNet 구조 <그림2>

VGGNet을 실험할때 최대한 깊이에 대한 성능을 확인하고자 6개의 구조로 나눠서 실험을 진행하였다. 

 

VGGNet은 아래의 주요 특징들이 있다

 

1.Factorizing convolution

2.Pre-initialization

3. FC layer → Conv. layer

 

하나씩 알아보자

 

Factorizing convolution (합성곱 분해)

VGGNet은 실험할때 factorizing convolution이라는 것을 사용했다. conv 계층에서 필터 사이즈는 3 x 3 필터만 고정으로 사용하였는데, 이유는 필터의 사이즈가 클수록 이미지가 빠르게 줄어들기에 레이어를 깊이 만들 수가 없기도 하고  큰 필터를 사용했을 때에 비해 적은 크기의 필터를 중첩해서 사용한 것이 파라미터 개수가 더 적기 때문이다.

출처: 코딩재개발

예시로 위의 사진과 같이 3 x 3 필터를 3개 사용 한 것과 7 x 7 필터 1개를 사용한 것은 동일한 사이즈의 피쳐맵을 추출하지만 파라미터는 전자가 훨씬 적다. 또한 layer가 더 많아질수록 RELU 함수를 많이 사용하고 그에 따라 non-linearity가 높아져 유용한 특징을 추출할수 있다.

 

 

Pre-initialization

깊은 네트워크를 학습할때 발생하는 문제점이 Vanishing gradient, Exploding gradient이라는 것을 우리는 알고 있다.

이 문제는 비교적 간단한 11-layer 구조를 학습한 뒤 이후 구조에서 11-layer VGGNet 에서 학습된 파라미터 값을 초기값으로 사용하고 Conv layer들을 추가해서 추가된 레이어들을 학습시켜 가는 방법으로 해결했다고 한다. 이로 인해 학습 시간도 줄일 수 있었다고 한다. 

출처: 라온피플

 

 

FC layer → Conv layer

기존 CNN에서는 Fully connected layer 를 사용할 때 input 파라미터가 정해져 있다. 이로 인해  이미지 크기가 변하면 FC layer로 들어오는 파라미터 수가 변하게 되어 학습을 할 수 없다. 

 

이런 문제를 VGGNet 에서는 FC Layer을 Conv Layer로 변경하여 해결했다.

위의 예시를 보면 14x14 Image가 입력되면 첫 번째 Fully conv layer의 Feature map 크기가 1x1이 된다. 하지만 16x16 Image가 입력되면 첫 번째 Fully conv. layers의 Feature map 크기가 2x2가 된다.

 

이때 아래의 경우는 최종 피쳐맵이 1x1 이 아닐 수 있다는 것이다.

만약 아래의 경우가 100개의 Class를 구분하는 문제라고 가정했을 때, 각 2x2 Feature map 100개를

Sum-pooled(average) 평균 내어 1x1 Feature map 100개로 만든 후 100개의 Class를 구분할 수 있게 만들면 된다. 이 방법을 사용하면 모델이 Input image의 Scale에 상관없이 Class를 구분할 수 있게 된다.

(논문에 나온 Sum-pooled 의 방법은 일반적인 Global average pooling 일 것이라고 많은 사람들은 추측을 하고 있는데 논문에 자세한 설명이 없어.. 추측의 정도로..ㅠ)

 

 

결론

VGGNet은 네트워크의 깊이에 따른 성능을 확인하려고 하였고 깊어질 수록 성능이 좋아졌음, 하지만 파라미터 수가 많아 학습시간이 오래 걸리는 문제가 있다.

 

 

 

 

✅ResNet

ResNet은 2015년에 Microsoft의 Kaiming He가 제안한 모델이다.

https://arxiv.org/pdf/1512.03385.pdf

 

ResNet은 이미지넷 대회에서 Top-5 Error가 3.57%가 나왔는데, 이것은 사람의 이미지 분류 오차율인 5% 보다 더 좋은 결과이다. 이로써 아주 의미 있는 성과이며 요즘까지도 많이 쓰이고 인기가 많은 모델이다.

 

 

연구 계기

위에서도 언급했지만 네트워크의 깊이가 깊어지면 일반적으로 성능이 좋아진다 하지만 이에대한 gradient vanishing과 exploding gradient, overfitting 등의 문제가 생긴다. 해당 논문에서는 깊이가 깊어질수록 무작정 성능이 좋아지는지 어디까지 좋아지는지에 대한 실험을 하였으며 결과는 아래와 같았다.

 

 

VGGNet의 19 Layer보다 더 깊게 해서 실험을 하였고 역시나.. 결과는 더 좋지 않았다..
(깊이가 무작정 깊어진다고 성능이 높아지는것이 아님!!)

 

이런 문제를 해결하기 위해 ResNet은 Residual learning(잔여 학습)이라는 개념을 도입했다!

 

 

Residual learning

출처: 동빈나 유튜브

layer가 깊어지면 깊어질수록 최적화를 시키기 어렵다. 즉, 우리가 아는 CNN 네트워크를 단순히 깊게 쌓는 것 만으로 학습이 잘 이루어지지 않기에 학습이 잘 될 수 있도록 하기 위해 residual learning 방식을 사용하면 된다고 논문에서는 주장한다.

 

residual learning 은 쉽게 말해 이전의 결과를 추가해서 학습시킨다고 생각하면 된다.

 

기존 CNN은 왼쪽의 구조처럼 input값인 x를 입력받고 각각 weight layer를 거친 뒤 최적의 H(x)를 찾는 것이다.

이에 비해 우측 구조는 기존 H(x)를  F(x) + x로 찾고자 하는 것이다.

 

다시 설명하자면 왼쪽 구조는 H(x)를 찾기 위해 2개의 weight layer의 가중치를 각각 찾아야 하는데 우측 같은 경우엔

F(x)+ x를 찾기 위해 기존에 학습했던 정보인 x는 그대로 가져오고 남아있는 잔여 한 정보인(새로 추가된) F(x)만 학습하면 된다. 즉, weight layer를 개별적으로 학습하는 것보다  F(x)를 찾는 게 더 쉽다는 것이다.

이로 인해 수렴 난이도가 더 낮아지고 이는 레이어가 깊어지면 깊어질수록

 

 

Residual block (수식)

조금 더 수식적으로 알아보자

논문에서는 F(x)에 대해 우측과 같이 정의했는데, 입력값 x가 들어왔을 때 첫 번째 weight값을 곱하고 activation function(논문에서는 relu사용)을 곱하고 그 결과에 이어 두 번째 weight값을 곱해주는 이것이 F(x)이다.

 

또한 일반적으로는 화살표 아래와 같이 w인 weight값을 단순히 2번이 아니라 여러 번 사용할 수 있다고도 하고 그래서 multiple convolutional layers라고도 한다. 거기에 그대로 입력값인 x를 더해 출력인 y가 만들어진다

 

 

구조

출처:라온피플

아래와 같은 방법을 적용해서 Plain net과  ResNet을 만들었다.

  • ResNet은 VGGNet처럼 3x3 Convolution을 사용했다.
  • 연산량을 줄이기 위해 Max pooling만 한번 사용함
  • Hidden FC , Dropout 사용 안 함
  • 출력 Feature map 크기가 같은 경우, 해당 모든 Layer는 동일한 수의 Filter를 가짐
  • Feature map의 크기가 1/2배인 경우, Filter 수 2배로 늘림 
  • Feature map 줄일 때 Pooling 대신 Convolution 시 Stride를 2로 함
  • 위 작업은 연산량 균형을 맞추기 위해 실시함

 

 

실험 결과

출처: 동빈나 유튜브

residual learning을 사용한 실험 결과로 좌측(plain network) 비해 우측과 같이 residual block을 추가한 layer가 일정 수준 이상 깊어져도 성능이 그대로 좋아지고 학습 초기 단계에서 수렴 속도가 더 빠르다는 것을 알 수 있다.

 

 

 

 

✅DenseNet

DenseNet은 기존의 LeNet, AlexNet, VGG, Inception, ResNet의 장점을 살려 만든 CNN architecture라고 한다.

ResNet과 구조가 비슷한 원리라 간략하게 비교하여 설명하고 넘어가겠다.

 

구조

CNN과 ResNet, DenseNet 구조를 비교해본 그림이다.

ResNet은 이전 결과물을 현재 결과에 더해주는 구조였다면, DenseNet은 모든 결과를  Concatenation으로 다 연결시켜주는 구조이다.

 

그래서 ResNet은 결국 최종적으로 마지막 Layer의 결과로 Classification을 하는데, DenseNet은 전체 Layer 결과를 모두 반영하여 Classification을 할 수 있다. 그렇기 때문에 저자들은 DenseNet이 더 좋은 성능을 낼 수 있다고 주장한다.

 

하지만 모든 Layer를 다 연결하면 필연적으로 Parameter 수가 급격하게 늘어날 수밖에 없다.

이 때문에 DenseNet은 각 Layer의 Channel 수 (Depth)를 줄인다. Channel 수를 많이 늘리지 않아도 모든 Layer를 고려하기 때문에 성능에 문제가 없다는 것이다. 아래 그림을 참고하면 이해가 쉽다.

 

특징

  • 모든 Layer를 다 연결하기 때문에 Gradient의 전달이 잘 이루어짐
  • Parameter 수가 적음
  • Low 한 Feature도 반영 가능

 

 

 

 

✅EfficientNet

EfficientNet은 2019년에 나온 모델로 SOTA(state of the art)를 달성하였다.

https://arxiv.org/pdf/1905.11946v5.pdf

 

우리는 일반적으로 CNN의 성능을 올리기 위해 scale-up을 하는데 아래 3가지 방법을 주로 사용한다.

 

1. network망의 depth를 깊게 만드는 것

2. channel width (filter 개수)를 늘리는 것

3. 입력 이미지의 resolution(해상도)을 올리는 방법

 

하지만 우리는 무작정 3가지 다 깊게 크게 좋게 만드는 것이 아닌 것이라는 것을 당연히 알고 있다. 특히나 하드웨어 성능은 제한적이기에 어떻게 세 가지를 적절히 조율해 한정된 resource 안에서 효과적이면서 좋은 성능을 얻는 것 임을 이 논문에서는 제안한다.

 

EfficientNet은 위 3가지를 효율적으로 조합하여 새로운 scaling 방법인  compound scaling이라는 방법을 사용한다.

 

 

Compound scaling

그림1

위 그림과 같이 scaling 방법에는 여러 방법이 있는데 여기서는 제일 오른쪽인 compound scaling을 하려는 것이다.

 

직관적으로 생각해서 이미지의 해상도가 증가할 때  더 넓은 영역에 퍼져 있는 feature를 잘 잡아내기 위해 네트워크 깊이를 증가시켜야 하고, 해상도가 커진 만큼 더 세밀한 패턴들을 판별하기 위해서 채널 수가 증가되어야 한다.

 

논문의 저자는 Neural Architeture Search(NasNet)를 사용하여, New Baseline Network를 개발하였다

개발된 New Baseline Network를 바탕으로 Scaling Up 하면서, Family Network를 만듦

 

 

 

또한 논문에서는 Accuracy는 최대로 높이면서 Memory와 FLOPS (계산량)는 작게 하는 것이 목적이다.

계산량은 네트워크의 depth에 비례하고 나머지 두 변수에 대해 그 제곱에 비례함으로 다음과 같은 비율로 변수들이 움직이게 정할 수 있다. 

  • 는 상수이고 small gride search를 통해 찾는다. 즉, 초기 가장 작은 네트워크에서 실험적으로 찾는다
  • depth는 2배가 되면  FLOPS도 2배가 되지만 width, resolution 은 2배가 되면 FLOPS는 4배가 된다
  • 논문에서는 를 고정하고 ϕ 를 변화시켜 가면서 전체적인 크기를 키웠다

 

 

결과

결과는 놀라웠다.  많이들 사용하는 ResNet 50과 비교하면.. 같은 파라미터 대비 성능이 10% 정도 좋다..ㅎㅎ

역시 효율적인 것을 중요하게 생각해야 한다는 점을 다시 생각하게 된다..

 

댓글