이전에 정리해두었던 vgg net review를 올립니다. 간단한 구조를 채택하여, 성능이 보다 높았던 inception 보다 더 많이 활용되었던 구조입니다. 지금도 backbone으로 종종 쓰이나 resnet보다는 그 활용성이 떨어집니다. 기존의 network 깊이를 19 layer까지 쌓음으로써 성능을 끌어올렸다는 점에서 주목을 받았고, 그 비법은 작은 필터 사이즈의 convolution layer를 여러 개 쌓은 것입니다. 자세한 내용은 후술하겠습니다. 목차는 다음과 같습니다.
Context
- Introduction
- VGG Net 구조
- Classification Framework
- Experiments
- Conclusion
1. Introduction
- ILSVRC 2014 second-winner
- 대규모 이미지 데이터셋 구축이 가능해지고 GPU 등을 활용한 병렬 계산이 가능해지면서 CNN이 image recognition challenge에서 두각을 보이기 시작함.
- LeNet, AlexNet 등을 이어서 zfnet에서는 첫번째 conv layer에서filter size와 stride를 기존보다 작은 값으로 설정하며 성능 향상을 꾀함.
- 또한 train, test 과정에서 전체 이미지와 또한 다양한 scale에서 network를 다룸으로써 역시 성능 향상을 꾀함.
- VGG Net의 경우에는 신경망의 깊이에 초점을 맞추어 성능 향상을 꾀함.
- Convolutional layer를 여러 개 쌓음으로써 전체적인 네트워크의 구조를 더 깊게 쌓음.
- 이때 모든 convolutional layer의 커널 크기를 3으로 고정시킴으로써 네트워크를 깊게 쌓을 수 있었음.
→ 작은 필터 크기가 핵심 - 단순히 ILSVRC 이외에도 다른 데이터셋에도 뛰어난 성능을 보여줌 (generalized well)
- 논문에서는 네트워크 내 layer의 구성에 따라 A, B, C, D, E + A- LRN 구조의 총 6개의 구조를 제안하고 있음. C의 경우에는 1X1 convolution이 추가된 형태임.
→ 1X1 convolution을 통해 conv layers 내의 receptive fields에 대해서는 영향을 주지 않고 non-linearity를 증가시키기 위함. - LRN(local response normalization)은 alexnet에서 사용이 되었던 normalization 방법임.
→ 매우 높은 하나의 픽셀값이 주변 픽셀에 영향을 주는 것을 방지하기 위해 다른 activation map의 같은 위치에 있는 픽셀끼리 정규화 (하지만, 현재는 batch norm을 더 많이 사용함)
2. VGG Net Architecture
- Kernel size = 3 for all layers in the network
- Stride = 1
- Padding은 convolution 이후에도 resolution의 보존이 되도록 적용
- 2X2 Max pooling with stride = 2
- n_classes = 1000
- Fixed-size 224X224 RGB image (train set에 대해 계산된 RGB mean 값을 모든 픽셀에서 빼주는 전처리 과정을 거침)
- 이때 필터 크기를 3이라는 작은 숫자로 고정해줌. (4개의 방향으로 모든 맥락을 파악하기 위해서는 최소 3은 설정해주어야 함.)
- 기존의 cnn은 filter size를 크게 설정하였지만, vgg net에서는 작은 숫자로 고정하고 이를 pooling 없이 여러 개 쌓는 구조로 실제 filter size를 크게하는 것과 동일한 효과를 갖도록 receptive field를 구성함.
(e.g. 2 of 3X3 -> 5X5; 3 of 3X3 -> 7X7)
왜 3X3을 여러 개 쌓은 것이 7X7보다 효과적인가?
1) 각 convolution 후에 relu가 온다는 것을 고려했을 때, non-linearity를 강화함으로써 여러 개의 layer를 쌓는 것이 보다 효과적인 decision function을 만들 수 있음.
2) Parameter 수를 줄일 수 있음. (49𝑐2→ 27𝑐2)
→ 이는 7X7 필터를 3개의 3X3으로 분해시킴으로써 7X7 convolution 필터에 regularization을 적용한 것과 동일한 맥락이라고 볼 수 있음. (가중치 개수를 감소시킴으로써 모델 복잡도를 감소)
1X1 convolution
convolutional layers의 receptive fields에는 영향을 끼치지 않고 decision function의 non-linearity를 증가시켜줌.
즉, spatial size는 유지하지만 convolution 레이어 뒤에 오는 non-linear activation을 추가적으로 거침으로써 non-linearity를 더할 수 있는 구조가 됨. 이러한 1x1 convolution concept은 google inception에서는 spatial size는 유지하면서 parameter 수를 줄일 수 있는 bottleneck 구조 전략으로 활용됨.
[5X5 vs 2 of 3X3]
[1X1 Convolution]
→ 1X1 convolution은 실제로 input, output resolution을 동일하게 유지할 수 있기 때문에 convolutional layers의 receptive fields에는 영향을 끼치지 않는다.
→ 채널 간의 값이 fully connected되어 있는 구조로 (이때의 가중치는 1X1XC 필터의 값) fc layer와 유사함
3. Classification Framework
- 목적함수: multinomial logistic regression objective (a.k.a. cross entropy loss)
$$ CE = - \sum_i^c{t_i log(s_i)} $$ - mini-batch gradient descent with momentum
- Momentum = 0.9, batch size = 256
- Learning rate decay도 적용 (init = .01, decay factor 10)
- Regularization
- Weight decay 적용 (L2 penalty parameter set to .00005)
$$ E(W) = MSE_{train} + \frac{1}{2}\lambda W^TW $$ - drop-out (where rate set to .5)
- Weight decay 적용 (L2 penalty parameter set to .00005)
- 가중치 초기화
- Config A부터 랜덤으로 가중치를 초기화하여 학습, A로부터 앞쪽 4개의 convolutional layer, 뒤쪽 3개의 fully connected layer에서의 가중치를 가져와 initialization
- 나머지 중간 부분은 random initialization
- 위의 과정은 Xavier initialization으로 대체 가능함. (실제 코드 구현에 있어서는 He init을 활용함)
- 가중치는 N(0, .01)로부터 sampling.
- Bias의 초기값은 0으로 설정.
- Training Image Size
- 인풋 사이즈를 크기 224의 정사각형으로 맞춰주기 위해, 이미지를 rescaling해준 후, random crop을 통해 인풋 이미지 crop을 얻어옴. Augmentation 시에는 해당 이미지 crop에 대해 horizontal flip과 random RGB color shift를 적용
- Crop을 할 때, rescaling된 이미지 중 가장 짧은 면의 길이 (S; Training Scale)가 224보다 매우 길다면 이미지 crop은 실제 이미지의 small part만을 반영할 것. (→ 어떻게 s를 설정할것인가? 가 유의미)
- S의 설정
1) single-scale training (S가 하나의 값만 가짐)
: 256과 384 두 가지로 실험
2) multi-scale training (S: 여러 개의 값)
: S의 값을 특정 범위(논문에서는 [256, 512])로부터 random sampling.
- Testing
- Image rescaling (Test scale Q)
: 이때 Q는 꼭 training scale인 S와 일치하지 않아도 되며, 실제로 하나의 s당 여러 개의 q를 사용하
는 것이 성능을 향상시켰음. - FC layer를 convolution 연산으로 변경하여 fully convolutional network로 구성
(inference 시 인풋으로 crop을 사용하지 않고 연산 효율성을 높이기 위함) - Train 시에는 image crop을 이용하였으나, test 시에는 fully convolutional하게 구현했기 때문에 crop 대신에 전체 이미지를 받아서 inference가 가능함.
→ 실제 마지막 classifier 부분의 fully connected layer는 입력 사이즈가 고정이지만, convolution은 그럴 필요가 없기 때문. 만약에 classifier 부분의 인풋이 기존의 7X7보다 큰 경우에는, 클래스 개수만큼 쌓여있는 각 feature map별로 sum pooling(=mean pooling)을 진행.
- Image rescaling (Test scale Q)
4. Experiments
- Dataset (ILSVRC-2012 dataset)
▪ 클래스 개수: 1000
▪ 학습 데이터 개수: 1.3M / val: 50K / test: 100K
▪ Evaluation metrics
- top-1 error (the proportion of incorrectly classified images)
- top-5 error (정답 카테고리가 가장 높은 확률값을 보인 5개의 카테고리 내에 속하지 않
는 비율)
▪ Validation set을 주로 test set으로 활용함.
- Single Scale Evaluation (test 시, image resizing scale이 고정)
- Single scale training: S = Q
- Multi-scale training: Q = 384 (mean of S_min and S_max)
- Multi-Scale Evaluation (test 시, 입력 이미지 사이즈를 다양하게)
- single scale training의 경우, q의 범위를 s에 가깝게 설정. Multi scale training의 경우 q의 범위를 조금 더 넓게 설정.
- Multi-crop evaluation (Test 이미지에도 Crop을 적용한 경우)
- 실제로, fully convolutional net으로 구성하여 테스트한 결과보다 더 성능이 향상됨. (논문
에서는 이러한 성능 향상이 실제 연산량 감소 효과 대비 미미하다고 판단하여 추론 시 fully
convolutional net으로 구성하는 걸 제안함)
- 실제로, fully convolutional net으로 구성하여 테스트한 결과보다 더 성능이 향상됨. (논문
- ConvNet Fusion
- 여러 configuration의 softmax class score 값을 평균 내어 앙상블
5. Conclusion
- 기존 SOTA의 top-5 test error인 11.7%에서 6.8%로 큰 폭의 성능 향상
- GoogLeNet과 성능 차이는 크지 않지만 (0.1%), 모형의 구조는 훨씬 간단함.
- 대규모 이미지 분류의 성능을 향상시키기 위해 convolutional network의 깊이를 깊게 쌓았다는 점에서 큰 의의가 있음.
- Very deep cnn은 보다 작은 필터를 여러 개 쌓아 큰 필터로 convolution하는 효과를 볼 수 있다는 점과 동시에 파라미터는 적게 가져감으로써 과적합을 방지할 수 있다는 점을 기반으로 함.
- 하지만 19개 이상으로 더 쌓는 것은 오히려 성능을 저하시켰기 때문에, 보다 깊게 쌓을 수 있는 방안을 모색할 필요가 있다.
→ ResNet
'DeepLearning > Basic' 카테고리의 다른 글
[DL] Data Shuffling에 대한 짧은 고찰 (0) | 2022.10.19 |
---|---|
[DL] Convolution 연산의 output size에 대한 이해 (0) | 2022.05.03 |
[Generative Models] Generative Adversarial Networks (2014) (2) | 2022.04.05 |
[ML/DL] 쿨백-라이블러 발산 (Kullback-Leibler Divergence) (0) | 2022.03.25 |
[ML/DL] 딥러닝에서의 Cascade (0) | 2021.12.12 |