Adore__

[BoostCourse DL] 4. CNN 본문

AI Learner/DL

[BoostCourse DL] 4. CNN

3_GreenHeart 2023. 4. 6. 17:50
728x90

Source: Boost Course 'DL 기초다지기'

 

 

Convolution


▪️ convolution 연산

convolution filter를 적용하고자 하는 image에 도장을 찍는 다고 생각하면 된다.

해당 위치에 있는 convolution filter 값과 image pixel 값을 곱해서 나온 전체 9개 값을 더해주면, 하나의 output이 나오게 된다.

Naver Connect Foundation

 

▪️ 2D convolution

적용하고자 하는 filter에 따라서 해당 이미지가 blur가 될 수 있고, emboss나 outline이 될 수 있다.

만약 3x3 filter에서 각 값이 모두 1/9로 채워져 있다면, 이미지 한 pixel의 평균값이 output으로 나오기때문에 blur효과를 줄 수 있다.

 

 

 

▪️ RGB Image Convolution

convolution filter 갯수에 맞춰서 output 갯수도 달라진다.

따라서 input channel과 output의 channel을 알면, 이에 적용되는 convolution filter의 크기 또한 알 수 있다.

NAVER Connect Foundation

 

이처럼 convolution을 여러번 할 수 있다. 한번 convolution을 거치고 나면, 다음에는 non linear activation (ReLU)을 거치게 된다.

여기서 항상 조심해야 할것은 이 연산에 필요한 parameter의 숫자이다. 만약 input이 28x28x4이고 output이 24x24x10이면, 10개의 5x5x4 필터가 필요하다.

 

 

 

▪️ Convolution Neural Network

크게 2단계로 나눌 수 있다.

1) convolution layer -> pooling layer : 이미지에서 유용한 정보인 feature extraction을 얻는다.

2) fully connected layer : 분류하거나 회귀를 해서 내가 원하는 출력값을 얻어준다.

 

최근에는 fully connected layer 층이 점점 없어지거나 최소화시키는 추세이다.

parameter 수가 증가할 수록 generalization 성능이 안좋게 나오기때문이다. 즉, 아무리 train data에서 성능이 좋아도, 실질적으로 새로운 데이터에 사용되었을 때 좋은 결과를 내지 못한다는 것이다.

따라서 CNN에서는 최대한 layer를 deep하게 만들면서 동시에 parameter를 줄이는 방향으로 발전시키고자 한다.

스스로 model을 만들 때, layer별로 몇개의 parameter로 이루어져있고 전체 parameter 수가 어느정도인지 파악하는 게 좋다.

 

* Stride : filter가 이동하는 보폭

* padding : filter를 적용해서 output을 낼 때, 기존 이미지의 boundary 정보가 버려진다. 따라서 가장자리를 0으로 채워서 더해준 후에 stride를 하게되면 정보 손실을 막을 수 있다.

Naver Connect Foundation

convolution filter를 적용할 때, 적절한 크기의 padding이 들어가 있고 stride가 1이면, 입력과 출력의 feature map의 dimension이 같아질 수 있다. (filter가 3x3 -> padding 1필요 / filter 5x5 -> padding 2필요 /..)

Naver Connect Foundation

 

 

▪️ Convolution Arithmetic (parameter 개수 계산하기)

다음은 AlexNet의 구조이다. 원래는 96 channel의 feature map을 만들어야 하는데, GPU가 크지 않아서 1개에 48개씩, 2개를 만들었다.

1st layer :  11 x 11 x 3(input channel수) x 48 (output channel) * 2(GPU 2개)  = 35k

...

convolution layer에서는 갈수록 1개의 kernel의 filter의 크기는 줄어들지만, input feature map의 channel과 output feauture map의 channel은 크다.

이 단계에 만들어질 수 있는 최대 parameter 수는 884k 정도이다. (빨강)

 

하지만, fully connected layer를 보면 (파랑) 숫자가 기하급수적으로 증가한다.

Naver Connect Foundation

dense layer가 훨씬 많은 parameter를 갖게되는 이유는 convolution operator가 하나의 kernel의 모든 위치에 대해서 동일하게 적용되기때문이다.

 

이처럼 대부분의 parameter는 fully connected layer에 들어가있기때문에, 앞으로의 trend는 이 fully connected layer를 줄이고 앞단계의 convolution layer를 깊게 쌓는 것을 목표로 한다.

이로서 layer는 점점 깊어지지만 parameter 수는 감소하고, 성능은 올라가게 만들 수 있다.

 

ex) 1x1 Convolution : dimension을 줄여주는 방법 중 하나이고, 여기서 dimension은 channel을 말한다 (128 -> 32)

 

 

 

 

 

 

Modern CNN


 

1. AlexNet

위에서 보았던 모델로, 최초로 Deep Learning을 이용하여 ILSVRC에서 수상하였다

 

* ILSVRC

ImageNet Large-Scale Visual Recognition Challenge의 약자.

detection/classification/localization/segmentation 등 여러 목적으로 사용되는 데이터셋으로, 1000개의 각기 다른 categories가 들어 있다.

 

 

▪️특징

- ReLU 활성화 함수 사용 : Gradient 소멸 문제 해결/ Linear model의 좋은 성질을 갖고가면서, 일반화 능력이 좋고 gradient descent를 최적화 하기 편리하다.

- 네트워크가 2개로 나뉘어져 있음 (GPU 부족으로 인해 나눔)

- Local Response normalization(현재 많이 활용 안됨), Overlapping pooling

- Data augmentation

- Dropout

- parameter 관점에서 11x11 filter를 사용하게 되면 너무 많은 parameter가 필요하게 된다.

 

 

▪️Gradient Vanishing problem이란?

sigmoid나 tanh 과 같은 activation 함수의 그래프를 보면, 0에서 멀어질수록 기울기가 점점 완만해진다.

즉, 기울기의 변화량이 점점 작아지게 되고 0에 매우 근접해진다. 이경우 역전파를 통해 gradient를 update할 때 0과 가까운 숫자를 넘겨주게 되어 optimize가 이루어지지 않는 문제가 발생한다.

 

Sigmoid

반면, ReLU는 0이상인 값은 linear 곡선이기때문에 이 문제가 발생하지 않는다.

ReLu

 

 

2. VGGNet

3x3 Convolution을 이용하여 Receptive field는 유지하되, 더 깊은 네트워크 구성

 

▪️왜 3x3일까?

convolution filter의 크기가 커질 때 생기는 이점은, 하나의 convolution filter가 찍었을 때 input안에서 고려되는 영역 크기가 커진다는 것이다. (즉, receptive field 커짐)

 

* Receptive field

여기서 하나의 filter가 cover할 수 있는 input 영역을 말한다.

 

아래 그림을 보면, 3x3 filter 2개를 사용하는 것과 5x5 한개를 사용하는 것은 recpetive field가 같다.

하지만 parameter관점에서 보았을 때 2번째 방법이 1번째 방법보다 훨씬 더 많다.

따라서 작은 filter를 여러번 사용하는 것이 parameter 수를 줄일 수 있는 효과적인 방법이다. (커봤자 7x7을 벗어나지 않는다.)

 

 

3. GoogLeNet

Inception blocks 제안

1x1 convolution을 중간중간 잘 활용하여 전체적인 parameter 수 줄이자!

 

저 동그라미 하나하나가 inception block이다

 

GoogleNet은 하나의 입력에 대해서 여러개의 inception blocks를 갖는 형태이며, 아래 그림은 하나의 inception block(module)의 구조이다.

여기서 중간중간 1x1 convolution이 나타나게 되는데, 이게 GoogleNet의 핵심이다.

 

 

 

GoogleNet의 핵심이자 inception block의 장점은 중간에 1x1 convolution이 들어간다는 것이다.

이는 channel방향으로 dimension을 줄이면서 전체적인 network의 parameter를 줄인다.

dimension이 줄어드는 걸로 어떻게 parameter 수를 줄이는걸까?

 

아래 그림을 보자.

 

Naver Connect Foundation

 

오른쪽 그림을 보면, 중간에 1x1 convolution을 넣어서 spacial dimension은 그대로 유지하되, channel을 128 -> 32로 줄였다. (2단계로 convolution filter 거치게 됨)

 

최종적으로 왼쪽과 오른쪽의 parameter 수를 계산한 것을 비교해보면, 오른쪽이 1/3만큼이나 parameter 수가 적은 것을 알 수 있다.

두 방법 모두 receptive field 크기는 같지만, 1x1 convolution filter를 하나 추가해줌으로서 계산량을 확 낮추는 것이다.

 

 

따라서 지금까지 네트워크의 parameter 수를 보면,

1. AlexNet (8-layers) -> 60M

2. VGGNet (19-layers) -> 110M

3. GoogleNet (22-layers) -> 4M 으로, GoogleNet이 가장 parameter수가 작다.

 

 

네트워크는 깊어지고, 동시에 parameter 수는 줄어듬으로써 성능은 좋아졌다.

 

 

4. ResNet

Residual Connection (Skip Connection) 구조 제안

h(x) = f(x) + x

 

 

▪️등장 배경

먼저 두가지를 다시 짚고 가자

* Generalization performance (training error가 줄어듬에도 불구하고, test error와 차이가 많이 나게 되는 것)

* parameter 수가 많을 때 문제점 : overfitting (training error가 줄어드는 반면, test error가 커지는 것. U자 모양)

overfitting

 

여기서의 문제점은 overfitting과는 다르다.

training error와 test error 모두 줄어들지만, test error가 작은데도 불구하고 training error가 커서 학습이 안되는 것이다.

이 그래프를 보면 이상한 것을 느껴야 한다. 보통 더 깊은 네트워크로 학습을 시키면 성능이 올라가야하는데, 56 layer보다 20 layer가 학습이 더 잘되는 걸 볼 수 있다.

즉, 네트워크가 커짐에따라서 학습이 안되는 문제가 바로 이 경우이다.

 

네트워크가 깊어질수록 입력 정보가 여러 층을 거치면서, 이전 층에 대한 정보 손실이 발생하고 가중치가 잘못된 방향으로 갱신될 수 있다.

이를 해결하고자 이전 층의 정보를 이용하여 연결하는 것을 skip connection이라 한다.

 

 

▪️해결책, Skip Connection

ResNet은 정보 손실 문제를 해결하기 위해 Skip Connection을 추가한다.

 
 

https://d2l.ai/chapter_convolutional-modern/resnet.html

x를 1단짜리 convolution layer의 출력값에 더해줘서 'residual (차이)만 학습하게 한다. 

g(x)에 x를 더하여 다음 입력층으로 사용하고 다음 층은 f(x)-x를 학습한다.

즉, 네트워크의 입력과 출력이 더해진 것이 다음 층의 입력으로 사용됨으로서 '연결'이 가능하다.

 

결과를 보면 이제 이상적으로 더 깊은 네트워크의 성능이 좋아진 것을 볼 수 있다.

'훨씬 더 깊게 쌓아도 학습을 더 잘 시킬 수 있겠구나~'

 

 

* Projected Shortcut

차원을 맞춰주기 위해 1x1로 맞춰주는 것이 Projected Shortcut(오른쪽) 이다

 

▪️ResNext (Bottleneck  Architecture)

3x3 convolution 전에 1x1 filter를 사용해서 input channel을 줄이고, 3x3이 끝나면 다시 1x1 conv로 다시 늘리는 방법이다.

 

https://d2l.ai/chapter_convolutional-modern/resnet.html

 

1) 1x1 conv 으로 channel을 줄인다.

2) 3x3으로 receptive field를 키워준다.

3) 다시 1x1 conv로 output channel의 크기를 맞출 수 있다.

=> parameters수는 줄임과 동시에 network를 키우면서 receptive field를 넓힌다.

 

 

5. DenseNet

ResNet과 비슷하지만, 출력값에 x를 더하는(+) 게 아니라, concatenate 한다.

 

문제는, concatenate하게 되면 channel이 점점 커지게 된다 (배수적으로 커짐)

이러면 동시에 convolution feature map도 커지게 된다.

이건 우리가 원하는 방향이 아니다.

 

따라서 중간에 channel을 줄여주는 작업이 필요하다. 엇? 이 방법 익숙하지 않은가?

맞다. 1x1 convolution을 사용해주면 된다.

 

정리하면

feature map을 기하급수적으로 키운다음, 마지막에 1x1 convolution으로 feature size를 줄여줌 

-> 다시 Dense Block으로 키움 -> 다시 1x1 conv로 줄임..

이를 계속 반복하는 구조이다.

 

 

 

🔻 Takeaways

* VGG : 3x3 blocks 반복 구조

* GoogLeNet : 1x1 conv로 channel 줄여서 parameter 줄이기

* ResNet : skip-connection으로 더 깊은 층일수록 학습 잘 되게 하기

* DenseNet : concatenation, 이전 입력값을 더하지 말고 쌓아서 성능 올리기

 

Comments