[이론 정리] CNN(Convolutional Neural Network)에 대하여

2023. 3. 21. 18:16AI/이론 정리

Convolution이란 이미지 분야에서 사용되는 연산으로 filter를 이용하여 input의 값을 변화시킨다. 각각의 filter가 어떻게 구성되는지에 따라 output은 달라진다. 예를 들어, 3 X 3 average filter의 경우 각각의 원소는 1/9의 값을 가지게 되고 이는 결과적으로 blur한 영상을 만드는데 이용된다.

 

CNN 크게 3 part로 구성이 된다: convolution layer, pooling layer, fully connected layer

Convolution layer는 image로부터 원하는 feature를 추출하는데 사용된다.

Pooling layer는 그렇게 추출된 결과의 spatial dimension을 줄이는데 사용된다.

Fully connected layer는 그렇게 dimension이 줄어든 결과를 통해 decision making 즉, 최종 답을 도출하는데 사용된다.

 

현재의 CNN의 추세는 Convolution layer의 깊이는 깊게 가져가지만 파라미터의 개수는 줄이는 방향으로 나아가고 있다.

왜 파라미터의 개수를 줄이는 것일까? 

1. overfitting이 일어난다. 왜냐하면 현재 학습 데이터에 맞는 파라미터만 선택될 것이기 때문이다.

2. 시간과 비용이 많이 든다. 왜냐하면 연산의 양이 많아지기 때문이다. 

 

그렇다면 어떻게 하면 파라미터의 개수를 줄이면서 높은 성능을 낼 수 있을까?

이를 알기 위해서는 먼저 CNN 모델에서 파라미터의 개수를 구하는 방법을 알아야 한다.

 

파라미터의 개수 구하기

파라미터는 filter를 만들기 위해 필요한 변수이다. 이는 다음과 같이 계산할 수 있다.

filter를 만드는데 필요한 파라미터 수 = filter의 가로 길이 X filter의 세로 길이 X input image의 channel 크기 X output image의 channel의 크기

여기서 channel은 이미지에서의 RGB 데이터를 생각하면 된다. Red, Green, Blue 즉, 세 개의 channel이 존재하기 때문에 channel의 크기는 3이 된다. 그러면 아래와 같은 convolution의 파라미터 개수를 구해보자.

먼저 input은 가로, 세로 길이가 모두 32이고 channel의 크기가 3이다. @ 왼쪽이 채널의 크기이고 오른쪽이 가로, 세로 길이이다.

이를 Feature maps로 즉 output으로 변환하고자 한다. 우리가 사용하는 filter(=kernel)의 크기는 5*5이고 input의 channel 크기는 3, output image의 channel 크기는 32이기 때문에 위 계산식에 대입하여 보면

파라미터 개수 = 5 * 5 * 3 * 32 = 2400 개가 된다.

CNN은 저렇게 한 layer로만 이루어진 것이 아니기 때문에 모든 layer에 대해서 저렇게 구해준 다음 그 값들을 전부 더해주면 해당 CNN의 총 파라미터 개수를 구할 수 있다. 이렇게 파라미터의 개수를 구해보다 보면 알 수 있다. Fully connected layer(=dense layer)로 변환하는 필터의 파라미터의 개수가 다른 layer의 파라미터 개수보다 월등히 많다는 것을. 예를 들어 마지막 feature maps에서 Hidden unit으로 가는 파라미터의 개수를 구해보자.

파라미터의 개수 = 48 * 1 * 1 * 768 = 36864 이고 다시 여기부터 그 다음 hidden unit으로 가는데 필요한 파라미터의 개수는 다음과 같다.

파라미터의 개수 = 768 * 1 * 1 * 500 = 384000

 

이를 아까 전의 2400 개와 비교하게 되면 384000 / 2400 = 160 배에 해당하게 된다. 결국 이러한 fully connected layer의 개수를 줄이고 다른 layer의 개수를 늘리는 것이 파라미터의 개수를 줄이는 길이 된다. 그리고 이러한 방향으로 CNN 모델은 진화하게 된다.

 

1. AlexNet: 2012년 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)에 우승한 모델로 CNN 모델의 획기적인 도약을 가져온 모델이다. 

AlexNet

위와 같이 각 layer마다 두 개의 neuron이 존재한다. 이렇게 하는 이유는 GPU를 분산해서 병렬적으로 학습시키기 위함이다. 이를 통해 속도의 향상을 얻었고 overlapping pooling이 이용되어 영상을 더욱 세부적으로 처리할 수 있게 되었다. Pooling은 spatial 차원을 축소하기 위한 방법으로 예를 들어 55*55의 이미지를 위와 같이 27*27의 이미지로 이미지 크기를 줄이는 것이다. Max pooling은 pooling을 하는 방법 중 하나이며 가장 큰 값을 선택한다. 예를 들어 pooling window가 2*2이면 4개의 픽셀 중 가장 큰 값을 가진 픽셀을 선택하게 된다. Local Response Normalization은 인접한 뉴런들의 활성화값을 정규화하는 방식으로 인접한 뉴런들이 서로 비슷한 값으로 활성화되는 것을 방지하여 작은 특징들을 잘 감지하도록 도와준다. 또한 data를 뒤집어주고 회전하여 수정한 값을 다시 data로 사용하는 data augmentation과 랜덤하게 뉴런의 값을 0으로 설정하는 dropout을 통해 성능을 높였다.

 

2. VGGNet

VGGNet

가장 눈여겨 볼 특징은 3 X 3 Convolutional filter를 사용하였다는 것이다. 이는 파라미터를 크게 줄일 수 있다. 왜냐하면 3 X 3 filter를 두 번 거치는 것과 5 X 5 filter를 한 번 거치는 것은 receptive field 차원에서 동일하다. Receptive field는 출력값을 내기 위해서 사용하는 범위를 말한다. 3 X 3 2번과 5 X 5 1번은 모두 receptive field가 5가 되는 것이다. 그러나 파라미터 개수의 차원에서는 3 X 3 X 2 = 18과 5 X 5 = 25이기 때문에 5 X 5를 이용하는 방법이 1.3 배만큼의 파라미터를 가지게 된다. 따라서 필터의 크기를 줄이는 대신 여러번 해주는 방식(=layer를 쌓는것)이 파라미터의 개수를 줄이는데 효과적이다. 이 모델 또한 dropout을 사용하였다.

 

3. GoogLeNet

GoogLeNet

1 X 1 convolution을 하게 된 모델이다. 이는 channel의 크기를 줄이기 위함이다. Channel의 크기를 줄이면 파라미터의 수를 크게 줄일 수 있다. 이렇게 사용되는 filter의 모음을 inception block이라고 한다. 예를 들어, input의 채널이 128이고 3 X 3 filter output의 채널이 128이라면 파라미터의 개수는 3 X 3 X 128 X 128 = 147,456이 된다. 그러나 1 X 1 convolution을 통해 32 channel로 변환하고 다시 128 채널로 바꾸게 되면 파라미터의 개수는 1 X 1 X 128 X 32 + 3 X 3 X 32 X 128 = 40,960으로 파라미터의 개수가 확연하게 줄어들게 된다. 

 

4. ResNet

ResNet

ResNet의 가장 큰 특징은 skip-connection이다. skip connection은 input을 output에 더해주는 것이다. 위의 그림의 34-layer residual 그래프에서 곡선 화살표가 input의 전달을 의미한다. 이렇게 하는 이유는 gradient vanishing을 방지하기 위함이다. gradient vanishing은 모델의 layer 깊이가 깊은 경우 역전파가 되면서 gradient 값이 작아짐에 따라 제대로 전달이 안되는 경우를 의미한다. input을 더해주게 되면 값이 커짐에 따라 이를 방지할 수 있다. 또한 fully connected layer에서 사용되는 것이기 때문에 최종 output(decision)에 영향을 주지 않는다. 이렇게 input을 output으로 전달해주는 역할을 하는 layer를 identity map layer라고 한다. 이를 이용하면 CNN의 layer를 깊게 구축했을 때 오히려 적은 layer를 가진 CNN보다 성능이 안좋아지는 문제를 해결할 수 있다. 즉, 깊게 쌓을 수 있다.

 

5. Densenet: concatenation

 

위와 같은 방식으로 CNN은 발전해왔다.

 

CNN이 CV(Computer Vision)에 사용되는 방식

 

1. Semantic segmentation

Semantic segmentation은 이미지의 각 픽셀이 어떤 라벨에 속하는지를 구분하는 것으로 자율주행에 이용된다. 이때 사용되는 모델이 FCN(Fully Convolutional Network)이다. 이 모델의 특징은 input 크기에 독립적이기 때문에 어떠한 사이즈의 인풋도 가능하다.

2. Object detection

Object detection은 원하는 object를 찾는 것으로 자율주행에 이용된다. 이를 위해 다음과 같은 모델들이 사용된다.

1. R-CNN: bounding box를 구하고 bounding box만큼 CNN 모델을 수행한다. 그에 비례하여 시간도 오래 걸린다.

2. SPPNet: R-CNN과 비슷하지만 한가지 다른 점이 CNN 모델은 한번만 수행하고 bounding box에 해당하는 영역만 extract해온다. R-CNN에 비해 빠르다.

3. Fast-CNN

4. Faster R-CNN: Region Proposal Network + Fast R-CNN으로 predefined size의 anchor box를 사용하여 RPN을 통해 물체가 있을 거 같은지를 판별한다.

5. YOLO: bounding box를 찾는 것과 class 구분을 동시에 수행한다.