- 1. Basic Vision Model
- [12′ NIPS] ImageNet Classification with Deep Convolutional Neural Networks (AlexNet) 핵심 리뷰
- [15′ CVPR] Going deeper with convolutions (GoogleNet, inception) 핵심 리뷰
- [15′ ICLR] VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION (VGGNet)
- [15′ ICML] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- [16′ CVPR] Deep Residual Learning for Image Recognition (ResNet)
- 2. Vision Model 응용 버전
- [16′ BMVC] Wide ResNet : Wide Residual Networks
- [17′ CVPR] Xception: Deep Learning with Depthwise Separable Convolutions
- [17′ ICLR] FRACTALNET: ULTRA-DEEP NEURAL NETWORKS WITHOUT RESIDUALS
- [17′ CVPR] Densely Connected Convolutional Networks (DenseNet)
- [17′ CVPR] Deep Pyramidal Residual Networks (PyramidNet)
- [17′ CVPR] Active Convolution: Learning the Shape of Convolution for Image Classification
- [17′ CVPR] Residual Attention Network for Image Classification
- [18′ CVPR] SENet : Squeeze and excitation networks
- [18′ BMVC] BAM: Bottleneck Attention Module
- [18′ ECCV] CBAM : convolutional block attention module
- [19′ CVPR] Selective Kernel Networks (SKNet)
- [19′ ICML] EfficientNet : Rethinking Model Scaling for Convolutional Neural Networks
- [21′ ICLR] Vision Transformer : AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
- [21′ NIPS] MLP-Mixer: An all-MLP Architecture for Vision
- [논문 리뷰] KAN: Kolmogorov–Arnold Networks
1. 들어가며
이번 글에서는 2015년 ICLR에 발표된 VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION 논문을 리뷰합니다. 이 논문은 VGGNet 이라고 불리며 이번 글에서도 VGGNet 이라고 지칭하겠습니다.
딥러닝의 세계에서는 복잡한 아키텍처와 수많은 하이퍼파라미터가 주목을 받기 쉽습니다. 그러나 복잡성이 늘어나면서 모델의 이해와 해석이 어려워지는 문제가 있습니다. 이러한 배경 속에서 VGGNet은 단순하면서도 강력한 아키텍처로 주목을 받았습니다. 이 글에서는 기존 딥러닝 모델의 복잡성과 그로 인한 문제점을 분석한 뒤, VGGNet이 어떻게 이 문제를 해결하는지 제안 방법을 설명합니다. 또한, 실험 결과를 살펴보고, 파이썬으로 직접 구현해봅니다. 마지막으로 VGGNet의 성능과 의의를 살펴보겠습니다.
VGGNet은 주로 작은 크기의 컨볼루션 필터와 더 깊은 네트워크 구조를 사용하여 뛰어난 성능을 보입니다. 이 아키텍처는 단순하지만 효과적인 방법으로 이미지 분류 문제에서 높은 성능을 달성하였고, 다양한 분야에서 활용되고 있습니다. 이 글을 통해 VGGNet의 기본 구조와 그 특징, 그리고 파이썬으로 어떻게 구현할 수 있는지에 대해 자세히 알아보겠습니다.
마지막으로, VGGNet의 의의와 그 영향에 대해 논의하겠습니다. 이 모델은 딥러닝 아키텍처가 꼭 복잡하지 않아도 높은 성능을 낼 수 있음을 보여주었습니다. 또한, 이 아키텍처는 다른 딥러닝 문제나 다양한 데이터셋에도 쉽게 적용할 수 있어, 딥러닝의 다양한 분야에서 널리 사용되고 있습니다. 이를 통해 VGGNet이 어떻게 딥러닝 커뮤니티에 긍정적인 영향을 미쳤는지 알아보았습니다.
2. 기존 방식의 문제점
VGG Net이 발표된 2014년 당시, AlexNet이 ImageNet 콘테스트에서 딥러닝 모델을 사용하여 우승한 뒤로 딥러닝 모델을 사용하는 image classification 연구가 많이 이루어졌습니다. 하지만 딥러닝 모델의 ‘깊이’가 성능에 주는 영향에 대한 체계적인 분석은 없던 상황이었습니다.
3. 제안 방법
이러한 문제를 해결하기 위해 저자들은 모델의 ‘깊이’가 성능에 미치는 영향을 실험을 통해 분석합니다. 이를 위한 실험 구상은 이렇습니다.
첫 번째 조건은 모든 실험의 Convolution Filter는 3×3 사이즈만 사용한다는 것입니다.
두 번째 조건은 깊이를 제외한 모든 조건은 동일하게 설정한다는 것입니다.
이렇게 깊이를 제외한 모든 조건을 동일하게 설정한 뒤 Image Classification 성능을 비교함으로써 모델의 ‘깊이’가 성능에 미치는 영향을 분석합니다.
3-1. 3×3 Convolution만 사용
VGG Net이 가지는 중요한 의의중 하나는 모든 Convolution 필터를 3×3 사이즈만 사용했다는 점입니다. 이는 동일한 시기에 발표된 GoogleNet(Inception)에 비해 훨씬 단순한 구조를 사용하고 있습니다.
3-1-1. 이유
저자들이 3×3 사이즈의 Convolution만 사용한 이유를 살펴보겠습니다.
우선 모든 실험의 조건을 모델의 깊이를 제외하고는 동일하게 해줘야 했기 때문이 컸을 것입니다. 깊이가 다른 모델에서 최종 Output Feature Map의 사이즈를 맞춰주기 위해서는 각 실험마다 다른 사이즈의 Convolution Filter를 사용해야 했을 것이고, 이렇게 구성된 실험을 통해서는 네트워크의 깊이가 성능에 미치는 영향을 정확히 분석할 수 없기 때문입니다. 하지만 그렇다고 해서 3×3 Convolution을 사용함으로 인해 Receptive Field가 작아져버리면 곤란합니다. 이에 대해 저자들은 3×3 Convolution을 여러 개 사용하면 큰 Receptive Field를 만들 수 있다고 주장합니다.
예를 들어 생각해보겠습니다.
위 그림은 5×5 Convolution과 3×3 Convolution을 연속으로 두 번 수행한 연산을 비교한 그림입니다.
먼저 5×5 Convolution 연산을 보겠습니다. 5×5 사이즈의 정보가 1×1으로 압축된 모습을 볼 수 있습니다.
이제 3×3 Convolution을 두 번 수행한 연산과 비교해 보겠습니다. 동일한 사이즈의 Input인 5×5 정보에 3×3 Convolution을 수행하면 중간 그림인 3×3 사이즈의 Feature Map이 나오게 됩니다. (Padding X, Stride:1) 바로 이어서 3×3 Feature Map에 3×3 Convolution을 적용하면 1×1 사이즈의 Output이 나오게 됩니다.
이는 3×3 Convolution을 두 번 연속으로 수행하면 5×5 사이즈의 Receptive Field를 가질 수 있음을 의미합니다. 저자들은 이러한 원리로 3×3 Convolution을 여러 개 쌓으면 충분히 큰 사이즈의 Receptive Field를 구현할 수 있다고 주장합니다.
3-1-2. 장점
이렇게 작은 사이즈의 Convolution을 여러 번 사용하는 방식은 여러 가지 장점을 갖습니다.
첫 번째 장점은 Non Linear Activation을 더 많이 수행할 수 있다는 점입니다.
위 그림은 5×5 Convolution과 3×3 Convolution을 두 번 연속 수행한 연산의 과정을 비교한 그림입니다. 5×5 Convolution 과정에서는 ReLU를 한 번만 사용할 수 있었는데, 3×3 Convolution을 두 번 연속 수행하는 과정에서는 ReLU를 두 번 적용할 수 있었습니다.
두 번째 장점은 파라미터 개수가 적어진다는 점입니다. 예를 들어 생각해 보겠습니다.
위 그림은 5×5 Convolution 연산과 3×3 Convolution을 두 번 연속 수행한 연산의 파라미터 개수를 비교한 그림입니다. Input과 Output Feature Map의 사이즈가 동일함에도 3×3 Convolution을 두 번 연속 수행했을 때 파라미터 개수가 더 적은 모습을 볼 수 있습니다.
3-2. 실험 결과
이렇게 실험한 결과는 다음과 같습니다.
표의 아래쪽으로 갈수록 (A -> E) 더 깊은 네트워크를 의미합니다. 성능을 보면 깊은 네트워크를 사용할수록 ImageNet 성능이 좋아지는 모습을 볼 수 있습니다. 이에 저자들은 ‘네트워크의 깊이가 깊어질수록 모델의 성능은 좋아진다.’라는 결론을 내립니다.
4. 파이썬 구현하기
이번 챕터에서는 위에서 설명한 VGGNet의 설명을 직접 파이썬으로 구현해보며 완벽하게 이해해보겠습니다.
4-1. 필요한 Module Import 하기
먼저 필요한 Module 들을 Import 해줍니다.
import torch
import torch.nn as nn
4-2. VGGNet Class 정의하기
다음으로 VGGNet Class를 정의해줍니다. VGGNet의 핵심은 3×3 사이즈의 필터만 사용한 Convolution의 사용인데요. self.features에 이를 반영한 Feature Extractor를 정의해줍니다. 이어서 이렇게 추출한 Feature에 Classifier를 연결해 최종 Logit을 출력하도록 구성해줍니다.
class VGGNet(nn.Module):
def __init__(self, num_classes=1000):
super(VGGNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(64, 128, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(128, 128, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(128, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# ... (more layers can be added)
)
self.classifier = nn.Sequential(
nn.Linear(256 * 7 * 7, 4096), # Assuming input size is [224, 224, 3]
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, num_classes),
)
def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), -1)
x = self.classifier(x)
return x
4-3. 사용하기
위에 정의한 VGGNet은 다음과 같이 사용할 수 있습니다.
# Create the model
model = VGGNet()
5. 효과
다음은 이렇게 제안한 VGG Net의 성능에 대해 알아보겠습니다.
5-1. ImageNet 성능
VGG Net과 기타 유명한 모델들의 ImageNet 성능은 다음과 같습니다.
동일한 시기에 발표된 GoogleNet에 근소한 차이로 뒤져 2등에 랭크되어 있습니다. 하지만 GoogleNet에 비해 아주 단순한 구조를 사용함에도 불구하고 성능에는 큰 차이가 없어, VGG Net의 철학은 이후 연구에 많은 영향을 주었습니다.
6. 의의
마지막으로 VGGNet의 의의는 다음과 같이 두 가지로 정리할 수 있습니다.
첫 번째는 깊이의 중요성을 입증했다는 점입니다. VGGNet은 모델의 깊이가 성능에 얼마나 큰 영향을 미치는지를 보여주었습니다. 이전 모델들보다 훨씬 더 많은 층을 가지고 있음에도 불구하고, 그 구조는 상대적으로 단순합니다. 이 단순한 구조를 여러 층에 걸쳐 깊게 쌓음으로써, 높은 성능을 달성할 수 있었습니다. 이는 딥러닝 모델의 깊이가 중요한 요소라는 것을 입증하고, 이후에 나온 다양한 딥러닝 모델들이 더 깊은 구조를 탐구하게 된 계기가 되었습니다.
두 번째는 작은 사이즈 Convolution Filter의 효율성을 입증한 점입니다. VGGNet은 작은 크기의 컨볼루션 필터(3×3)를 사용했습니다. 이 작은 필터를 여러 층에 걸쳐 사용함으로써, 큰 필터를 사용하는 것과 동일한 효과를 낼 수 있었지만, 연산량은 훨씬 적었습니다. 이러한 접근법은 모델의 효율성을 높이면서도 성능을 유지할 수 있게 해주었습니다.
이 두 가지 의의는 VGGNet이 단순히 하나의 성공적인 모델을 넘어서, 딥러닝 아키텍처 설계에 중요한 영향을 미친 기술적 획을 그은 작품이라고 할 수 있습니다.
7. 마치며
VGGNet의 강력한 성능과 유연성을 실험 결과와 파이썬 코드 구현을 통해 살펴보았습니다. 이 아키텍처는 단순한 구조와 작은 크기의 컨볼루션 필터를 사용하여 복잡한 문제를 효과적으로 해결합니다. 이러한 단순성은 모델을 이해하고 수정하기 쉽게 만들어, 다양한 분야와 문제에 적용할 수 있는 넓은 범위를 제공합니다.
VGGNet의 중요한 특징 중 하나는 그것이 복잡한 아키텍처나 특별한 트릭 없이도 뛰어난 성능을 달성할 수 있음을 입증한 것입니다. 이는 딥러닝 모델이 꼭 복잡하고 어렵게 구성될 필요가 없음을 보여주며, 이를 통해 더 많은 연구자와 개발자가 딥러닝에 접근할 수 있게 만듭니다.
마지막으로, VGGNet은 다양한 분야에서 활용 가능한 아키텍처로 입증되었습니다. 이미지 분류뿐만 아니라 객체 탐지, 세그멘테이션 등 다양한 컴퓨터 비전 문제에서도 뛰어난 성능을 보이고 있습니다. 이러한 다양성은 VGGNet이 딥러닝 커뮤니티에 미친 긍정적인 영향을 잘 보여줍니다.