다양한 CNN
Practical하게 유용한 결과를 낳는 CNN 모델들이 있다.
- LeNet-5 : 요즘과 비슷한 구조
- AlexNet : 처음으로 CNN을 이용하여 winner가 됨
- ZFNet : AlexNet의 응용
- VGG : 10 layer를 넘김
- GoogleNet : inception module → 다양한 filter를 사용
- ResNet : rasidual connection을 이용하여 네트워크를 깊게 만듦
- DenseNet
LeNet-5 (1998)
0~9까지의 숫자 이미지가 들어오면 맞추는 multi-lable classification의 기능을 수행한다.
전체적인 구조는 CONV + FC로 요즘 사용하는 것과 유사하다.
다만 batch normalization이나 ReLU 등의 테크닉들은 사용되지 않았다.
CONV → POOL → CONV → POOL → FC → FC
AlexNet (2012)
AlexNet은 ILSVRC에서 처음으로 cnn으로 우승한 모델이다.
특징
- ReLU를 사용한 첫 모델이다
- Normalization layer를 사용했다.
- Heavy data augmentation
- Hyperparameter
- Dropout : 0.5
- batch size : 128
- SGD Momentum : 0.9
- Learning rate : 1e-2 → val accuracy가 plateau에 빠졌을 때 10씩 줄인다.
- L2 weight : 5e-4
- 7 CNN ensemble : 18.2% →15.4
구조
CONV1 → MAX POOL1 → NORM1
→ CONV2 → MAX POOL2 → NORM2
→ CONV3 → CONV4 → CONV5
→ MAX POOL3
→ FC6 → FC7 → FC8
ZFNet
기본 골자는 AlexNet 이다.
- CONV1 : 11*11 stride 4 → 7*7 stride 2
- CONV3~5 : 384/384/256 → 512/1024/512
- Error : 16.4% → 11.7%
VGG (2014)
당시에는 10 layer를 넘기는 것이 힘들었다.
VGG는 많은 레이어를 쌓아서 모델을 구축하였다.
작은 filter를 사용함으로써 한 layer의 파라미터 수를 줄이고 layer를 더 깊게 쌓을 수 있다.
각 layer 자체의 성능은 좋지 않다.
그러나 더 깊고 더 많은 non-linearity를 만들어서 더 복잡한 기능을 수행할 수 있다.
VGG-16
16개의 layer를 이용한다.
- CONV
- 3*3 filter
- stride = 1
- padding = same (pad = 1) → 모든 layer에서 padding 수행
- MAX-POOL
- 2*2
- stride = 2
VGG-19
VGG-16에 비해 성능이 약간 더 좋으나 cost에 비해 큰 향상을 이루지 못해서 여전히 VGG-16이 자주 사용된다.
Receptive Field
Receptive field는 입력 이미지에 대해 하나의 필터가 커버할 수 있는 이미지 영역의 일부이다.
Receptive field가 작으면 멀리 있는 곳의 정보를 사용하지 못한다.
큰 filter는 receptive field가 크지만 파라미터가 많기 때문에 깊게 쌓기 힘들다.
Filter가 작으면 receptive field가 안좋지만 layer를 쌓음으로 괜찮아 질 수 있다.
3*3 filter(s=1)를 3 layer 쌓은 것은 7*7 conv layer와 동등하게 효율적인 receptive field를 가질 수 있다.
그러나 layer 당 channel을 $C$라 할 때 파라미터의 수는 $7^2C^2 \rightarrow 3 \times (3^2 C^2)$로 훨씬 적어진다. ($C$ = channel 수)
GoogleNet (2014)
특징
- 깊은 네트워크이며 계산 효율성이 좋다.
- 22개 layer + FC Layer가 없다.
- 적은 파라미터 수 : 5 million 파라미터만 존재→ AlexNet보다 12배 더 적음
- Inception module : 다양한 종류의 filter 사용
- 1x1 CONV bottleneck layer : 채널을 줄이기 위해 중간에 1x1 CONV bottleneck layer을 둠
1x1 CONV Bottleneck Layer
1x1 CONV는 channel의 수를 줄일 수 있다.
하나의 1x1 CONV만 사용한다면 weighted sum을 통해 여러 채널의 input을 하나의 channel로 줄이게 된다.
따라서 1x1 CONV layer가 존재한다면 필터의 수 만큼의 차원으로 줄게 된다.
1x1 CONV layer는 결국 input의 채널 수를 줄여서 다음으로 넘기는 역할을 한다.
뒤에 큰 filter가 오면 결과가 heavy해지지만 큰 filter 전에 bottleneck layer을 두어 채널을 줄임으로써 이를 막을 수 있다.
POOL layer는 동작이 심플하기 때문에 input을 줄일 수는 없다.
Inception Module
어떤 filter가 좋은지 모르기 때문에 여러 크기의 filter를 다 써볼 수 있다.
filter를 학습함으로써 필요 없는 것은 0으로 가진다.
다만 계산량이 늘어난다.
이를 줄이기 위해 GoogleNet은 1x1 CONV layer를 통해 channel을 줄인다.
아래 그림은 여러개의 inception module을 붙여 형성한 네트워크의 모습이다.
중간중간에 output을 내기도 한다.
이는 큰 네트워크가 작게 보이게 하는 효과가 있으며 이를 통해 곱셈이 적어져서 안정적인 gradient가 나올 수 있다.
하지만 최종적인 결과보다 중간 결과를 더 중요하게 여길 수도 있고 더 고차원의 결과가 나올 수 있음에도 그렇지 못하는 문제가 발생할 수도 있다.
이러한 방식은 주로 googleNet에서만 사용된다.
ResNet
Residual Block
첫번째 linear transform의 input을 두 번째 linear transform에 더해준다.
Residual Block의 장점
추가한 layer가 쓸모 없으면 그냥 pass하는(identity function 만들어버리는) 파라미터가 만들어질 수 있다.
단순한 하나의 layer가 identity function이 되는 것은 어렵다.
그런데 residual block은 이것을 가능하게 한다.
ResNet
여러 개의 residual block을 쌓은 것이 ResNet이다.
Residual block을 통해 네트워크를 더 깊게 쌓을 수 있고, 네트워크가 깊어질 수록 더 다양한 동작이 가능해지는 이점을 얻을 수 있다.
요즘 네트워크에는 skip connection 기법이 거의 들어가있다.
'Computer Science > AL, ML' 카테고리의 다른 글
[RNN] Vanilla RNN (0) | 2022.06.15 |
---|---|
RNN : Recurrent Neural Network (0) | 2022.06.15 |
[CNN] Pooling (0) | 2022.06.07 |
[CNN] CNN의 구조와 Notation (0) | 2022.06.06 |
[CNN] Local Connectivity & Weight Sharing (0) | 2022.06.06 |
댓글