CNN (Convolutional Neural Network)
3차원 convolution에서 kernel(필터)와 input의 채널수가 같아야 한다는 점을 항상 명심 하자.
물론, output의 channel수는 커널 한 개당 한 개가 나오게 되므로, output으로 여러 채널을 얻고 싶다면 커널수를 늘리면 된다.
당연히, 커널수가 늘어나는 그만큼 parameter수도 늘어나가 된다는 점을 기억하자.
Convolution
각 파트에서 커널의 특징이 주어지는데, 맨 왼쪽부터 커널의 갯수, 너비 x 높이 x 채널수를 의미한다.
output의 채널은 커널의 갯수만큼 나오게 된다.
고전적 CNN
위 그림은 가장 고전적, 기본적 CNN구조이다. convolution/pooling layer들에서는 feature extraction(특징 추출), affine layer들에서는 결정(dicision making)을 한다. convolution, pooling을 여러번 반복하고 뒤에서는 우리가 전에 다루었던 affine layer가 나오게 된다.
paramter수가 많을 수록 학습이 어렵고 generalization performacne가 떨어지기 때문에 parameter수를 줄일 방법에 대해 연구가 필요하다
최우선적으로, 많은 parameter가 affine layer 부분에 존재하기 때문에 affine layer의 수를 최대한 줄이는 것이 좋다.
실제로 요즘은 CNN에서 affine layer를 줄이고, convolutional layer를 많이 가져가는 방향으로 발전하고 있다.
paramter 갯수는 CNN의 중요한 평가지표 중 하나이므로 **어떤 모델을 보았을 때 해당 모델의 파라미터가 대충 몇개일지 가늠할 수 있는 감을 키우는게 중요하다.
Stride, Padding
stride는 커널이 몇 칸씩 건너뛰면서 특징추출을 할지 결정하는 파라미터 이며, 패딩은 특징 추출시 input의 가장자리에 얼마나 0을 채울지 결정하는 파라미터이다. padding을 겉에 둘러줌으로써 output의 spatial dimension(가로,세로)을 기존보다 늘려줄 수 있다.
패딩은 보통 input과 output의 spatial dimension을 같게 해주고 싶을 때 많이 사용한다.
CNN과 parameter
위 그림은 AlexNet에서 각 레이어별로 parameter수를 구해놓은 예시이다.
AlexNet이 나올 당시 GPU의 성능이 부족했기 때문에 2개로 나눠져 있지만, 결국 계산은 같다.
간단하게 몇개만 구해보자. affine layer는 fully connected layer(dense layer)를 뜻한다.
- 1th convolutoin
- 커널의 사이즈가 11 x 11이고 채널은 3이다.( 보통 커널의 채널수는 input의 채널과 같아야 하므로 생략하는 경우가 많다.)
- output의 채널이 48이므로 커널의 갯수도 48이어야하며, 분기가 2개로 갈라지므로 이를 2번 카운팅해야한다.
- 따라서 여기서의 총 parameter수는 11 x 11 x 3 x 48 x 2 = 34848 이다
- affine layer와 다르게, 여기서의 parameter수는 input의 size에 의존적이지 않다는 점을 기억하자.
- 3th convolution
- 다른 곳들과 다르게 여기서는 interchange가 일어나므로 x2 가 아니라 x4를 해줘야 한다.
- 따라서 계산해보면 3 x 3 x 128 x 192 x 4 = 884736 이다.
- 1th affin layer(6th later, fully connected)
- 기존과 같이 parameter가 input, output 모두의 size에 의존적이다.
- 여기서는 생략되었지만, convolutional layer의 output을 affine layer에 input으로 넣어주기 위해 faltten(쫙 펴주는) 작업도 필요하다.
- 13 x 13 x 128개의 paramter 2세트가 input으로 들어가 2048개의 output 2세트가 나온다.
- 계산해보면 13 x 13 x 128 x 2 x 2048 x 2 = 177209344개이다.
- 3th affine layer(8th layer, fully connected)
- 동일한 방법으로 2048 x 2 x 1000 =4096000개의 paramter가 나오게 된다.
얼핏 보아도 affine layer에서 paramter 갯수가 월등히 많다.
convolutional layer에서는 커널의 크기가 input 크기와 독립적이기 때문에 parameter가 상대적으로 덜 필요하다.
Modern CNN - 1 x 1 convolution
최근의 CNN에서는 1 x 1 convolution (1 x 1 kernel)을 거의 반드시 사용한다.
1 x 1 convolution은 spatial dimension은 유지하되, channel dimension을 줄이는 효과가 있다.
channel 수를 줄이고 convolution을 수행하는 것이 필요한 paramter를 대폭 줄일 수 있다.
AlexNet
딥러닝의 포문을 연 모델로, 지금까지도 쓰이는 많은 기법들이 여기서 유래한다.
- ReLU 함수를 사용
- ReLU는 선형의 특징을 어느정도 유지하는 비선형 활성함수이다.
- 선형(linear)특성을 지니고 있어 gradient descent가 간편하다.
- sigmoid, tanh에서의 vanishing gradient(gradient가 옅어져 사라지는 현상)이 여기서는 나타나지 않는다 .
- GPU를 2개 병렬 연결하여 사용
- Local response Normalization(LRN) 기법을 사용
- 요즘은 잘 사용 하지 않음.
- ReLU사용으로 인해 매우 큰 input이 억제되지 않는 상황에서 정규화(국소적 정규화)를 해준다.
- Data augmentation, Dropout 기법 사용
VGGNet
- 3 x 3 kernel(with stride 1)을 사용
- 기존 AlexNet에서는 11 x 11을 사용했었으나 사실 kernel size는 너무 크면 좋지 않다.
- kernel size가 커지면 receptive field가 커진다. (receptive field는 output 한 칸에 영향을 주는 input layer의 spatial dimension 이다.)
- 하지만 작은 size의 kernel을 여러 개 사용하면 큰 size의 kernel과 같은 receptive field를 가질 수 있다.
- 예를 들어, 아래와 같은 그림에서 3 x 3 kernel 두개를 sequentail 하게 연결하면 5 x 5 한개일 때와 receptive field 가 같다.
- 그런데 parameter 수는 좌측이 3 x 3 x 128 x 128 x 2 = 294912, 우측이 5 x 5 x 128 x 128 = 409600으로 우측이 더 크다.
- 이와 같은 일반적으로 같은 receptive field를 표현하더라도, 작은 kernel을 여러개 쓰는 것이 parameter 갯수 측면에서 더 유리하다.
- 그래서 요즘 나오는 논문들은 웬만해서는 커널 사이즈가 7 x 7을 넘지 않는다고 한다.
- Dropout(p = 0.5)를 사용하였다.
GoogleNet
- NIN(Network in Network)구조를 채택함. NiN은 같은 네트워크 구조가 반복되는 것으로, 위에서 네모 표시가 된 부분이 반복 된다.
- 그리고 이 반복되는 부분은 모두 Inception 구조로, GoogLeNet의 핵심이다.
Inception 구조(Inception Block)
- 하나의 입력이 여러 개로 퍼지고 다시 하나로 합쳐지는 구조이다.
- feature를 효과적으로 sparse하게 추출하기 위해 여러 다른 크기의 kernel을 사용하여 convolution을 여러번 수행한다.
- 연산량이 너무 많아질 것을 방지하기 위해 1 x 1 convolution 연산을 활용하여 prarmeter의 갯수(혹은 channel)을 대폭 줄였다.
- 다른 것들과 spatial dimension, channel수 등을 모두 맞췆주기 위해 Pooling에도 padding과 1 x 1 convolution이 있는 것이 재미있는 특징이다.
ResNet
층이 너무 깊어지면 overfitting 등의 현상으로 오히려 성능이 나빠질 수 있다는 우려를 해결한 모델이다.
- Skip connection을 도입하여 위와 같은 문제를 해결 하였다.
- 위와 같이 입력 데이터를 출력에 더해준다.
- 층이 깊어지면 학습이 잘 안될 것이라는 우려는 근본적으로 역전파의 chain rule에서 1보다 작은 값들 때문에 발생한다.
- 그런데 skip connection을 이용하면 이전 chain만큼의 값이 더 더해지는 것이 보장되므로, 역전파에서 신호가 감쇠되는 효과를 막아 줄 수 있다.
- x를 $f(x)$에 더해주려면 둘의 dimension(channel)이 같아야 하므로 이를 위해 x에 1 x 1 convolution을 하고 더해준다. (projecte shortcut)
- convolution 이후 Batch normalizaion이 이루어진다. 최근에는 이 순서에 대한 논란도 있다고 한다.
- Bottleneck architecture를 도입하였다.
- 3 x 3 convolution을 할 때 연산량을 줄이기 위해 1 x 1 convolution으로 축소 후 연산, 이후 다시 확장하는 과정을 거친다.
- 3 x 3 convolution을 할 때 연산량을 줄이기 위해 1 x 1 convolution으로 축소 후 연산, 이후 다시 확장하는 과정을 거친다.
DenseNet
- ResNet에서는 input을 output에 더해(add)주었다면, DenseNet에서는 input과 outpu을 합친다.(concatenate)
- 하지만 이렇게 하면 channel의 수가 지수단위로 증가(layer를 거칠 때마다 2배로)하고, 그러면 parameter수 역시 급격히 증가 할 것이다.
- 이를 막기 위해 중간중간 1 x 1 convolution으로 cannel을 줄여준다.
- Dense Block에서는 이전 모든 convolution layer의 feature map을 concatenate 한다.
- Transition Blcok 에서는 다른 것도 하지만, 특히 1 x 1x convolution이 들어가 channel 수를 줄인다.
summary
- VGG : 3 x 3 blocks
- GoogLeNet : 1 x 1 convolution
- ResNet : skip - connection
- DenseNet = concatenation
'딥러닝 > Vision' 카테고리의 다른 글
Mask R-CNN (0) | 2022.03.30 |
---|---|
Object Detection (0) | 2022.03.30 |
CNN with pytorch (0) | 2022.02.12 |
EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks (0) | 2021.07.25 |
Mobile Net (0) | 2021.03.24 |