[12′ NIPS] ImageNet Classification with Deep Convolutional Neural Networks (AlexNet) 핵심 리뷰

This entry is part 2 of 22 in the series Vision Model

1. 들어가며

딥러닝의 세계에서 AlexNet은 특별한 위치를 차지하고 있습니다. 이는 딥러닝의 시초와 같은 모델로, 딥러닝의 부활의 신호탄을 쏘아올린 논문이기도 합니다. 이전의 기존 방법들은 CIFAR10, MNIST와 같은 작은 데이터셋에서는 잘 작동했지만, ImageNet과 같은 대규모 데이터셋에서는 그렇지 않았습니다. 이러한 문제를 해결하기 위해, AlexNet은 혁신적인 아이디어와 구조를 도입하여 대규모 데이터셋에서도 뛰어난 성능을 보였습니다.

본 글에서는 AlexNet 이전의 방법들이 대규모 데이터셋에서 어떠한 문제를 겪었는지를 상세히 살펴보겠습니다. 작은 데이터셋에서는 효과적이었던 기존의 머신러닝 방법들이 왜 대규모 데이터셋에서는 실패했는지, 그 원인과 배경에 대해 깊이 있게 이해해보겠습니다. 이를 통해 AlexNet이 어떠한 기여를 했는지, 그 중요성을 더욱 명확하게 인지할 수 있을 것입니다.

다음으로, AlexNet의 제안 방법에 대해 구체적으로 알아보겠습니다. CNN을 사용한 AlexNet 아키텍처의 독특함, ReLU 활성화 함수의 사용, 그리고 과적합을 방지하기 위한 다양한 전략들에 대해 상세하게 설명할 예정입니다. 이러한 기법들이 어떻게 결합되어 AlexNet의 성공을 이끌었는지, 그 과정을 함께 탐구해보겠습니다.

또한, 본 글에서는 파이썬을 이용하여 AlexNet의 핵심 개념들을 직접 구현하는 방법도 함께 알아보겠습니다. 코드를 통해 AlexNet의 구조와 기능을 직접 확인하고 실험해보면서, 이론과 실제의 연결고리를 더욱 강화할 수 있을 것입니다.

AlexNet의 성공은 단순히 성능 향상 그 이상의 의미를 가지고 있습니다. 이는 딥러닝의 강력한 능력을 전 세계에 입증한 첫 번째 사례이자, GPU를 활용한 병렬 연산의 중요성을 강조한 획기적인 연구입니다. 이 모델은 딥러닝과 컴퓨터 비전 분야에 혁명을 일으켰으며, 이후의 많은 연구와 발전의 기반을 마련해주었습니다.

이제, 여러분과 함께 AlexNet의 세계로 더 깊게 탐험해보며, 이 획기적인 모델이 어떻게 딥러닝 분야를 뒤흔들었는지 함께 알아보겠습니다. 이 글을 통해 AlexNet의 중요성과 그 기여에 대해 깊이 있게 이해하게 될 것입니다. 시작하겠습니다!

2. 기존 방식의 문제점

AlexNet이 제안된 시기가 2012년임을 생각해보면, 당시 많이 사용되던 이미지 분류 데이터셋은 CIFAR, MNIST 같은 작은 사이즈의 데이터셋이었습니다. 저자들은 이러한 작은 데이터셋은 기존의 머신러닝 방법들로도 좋은 성능을 낼 수 있지만 ImageNet 같은 대용량의 데이터셋에서는 좋은 성능을 기대할 수 없음을 문제로 지적합니다.

3. 제안 방법

이러한 문제를 해결하기 위한 저자들의 제안 방법을 살펴보겠습니다.

3-1. CNN 사용

먼저 저자들은 CNN을 도입합니다.

그림1. AlexNet Architecture
그림1. AlexNet Architecture

위의 그림을 보면 제안하는 CNN은 총 8개의 Layer로 구성되어 있는 모습을 볼 수 있습니다. 처음 5개의 Layer는 Convolution Layer, 뒤의 3개는 Fully Connected Layer로 구성되어 있습니다. 낮은 GPU의 성능을 고려하여 2개의 GPU를 병렬로 연결하여 학습하는 구조를 사용했습니다.

3-2. ReLU activation function 사용

다음으로 저자들은 활성 함수로 tanh 대신 ReLU를 사용했습니다.

그림2. ReLU, Tanh 비교
그림2. ReLU, Tanh 비교

위의 그림을 보면 tanh 보다 ReLU의 학습 속도가 월등히 빠른 모습을 볼 수 있습니다. 

3-3. Overfitting 방지를 위한 노력

다음은 Overfitting을 방지하기 위한 저자들의 시도를 살펴보겠습니다.

3-3-1. Data augmentation

먼저 Augmentation 기법에 대해 알아보겠습니다. 우선 학습 이미지 데이터를 Augmentation 하기 위해 256×256의 이미지를 랜덤으로 224×224 패치로 추출한 뒤 Reflection을 적용합니다.

그림3. Data Augmentation - Random Crop, Reflection
그림3. Data Augmentation – Random Crop, Reflection

이러한 방식으로 학습 데이터를 2048배 늘려줍니다. 두 번째로는 RGB 픽셀 값에 랜덤 값을 더해주는 Augmentation을 적용합니다. 정확히는 픽셀 값에 PCA를 하여 구한 Eigen Value를 랜덤 배수로 더해줍니다.

그림4. Data Augmentation - RGB value
그림4. Data Augmentation – RGB value

이는 Illuminance와 Intensity Augmentation에 해당합니다.

3-3-2. Drop out

두 번째로 Drop Out 기법을 적용합니다. Drop Out은 뉴런 간의 연결을 랜덤으로 끊어줘 학습 데이터에 Overfitting 되는 현상을 방지해줍니다.

5.drop out
그림5. Drop Out

저자들은 랜덤으로 50%의 Fully Connected 뉴런의 연결을 0으로 만들어줍니다.

4. 파이썬 구현

위에서 AlexNet의 핵심 내용들을 살펴봤는데요. 파이썬 코드를 사용하여 구현하면 그 의미를 더욱 명확히 파악할 수 있습니다. 이번 챕터에서는 파이썬으로 구현한 AlexNet을 살펴보겠습니다.

4-1. Import Module

먼저 AlexNet을 구현하기 위해 필요한 Module 들을 Import 해줍니다.

import torch
import torch.nn as nn

4-2. Define AlexNet Class

다음으로 AlexNet Class를 정의해주겠습니다.

class AlexNet(nn.Module):
    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(64, 192, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 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=3, stride=2),
        )
        
        self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
        
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes),
        )
        
    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

AlexNet은 사실상 최초로 이미지에 적용한 Convolutional Neural Network라고 할 수 있는데요. 이에 맞게 self.features 변수에 2d Conv와 ReLU, Pooling 등을 포함해준 모습을 볼 수 있습니다. forward 함수를 보면 입력으로 들어간 x는 self.features 연산을 순서대로 거친 뒤 Average Pooling 되어 최종적으로는 Classifier를 통해 Logit을 출력하도록 구성한 모습을 볼 수 있습니다.

4-3. Create Model

이렇게 구현한 AlexNet 클래스는 다음 예시와 같이 사용할 수 있습니다.

# Create the model
model = AlexNet()

5. 효과

다음은 이렇게 제안한 방법의 효과에 대해 알아보겠습니다.

5-1. ImageNet 성능

ImageNet 성능을 비교해보겠습니다.

6.ImageNet 성능
그림6. ImageNet 성능

AlexNet의 Top-5 에러율은 17.0%인 반면, 2등 방법은 25.7%의 에러율로 8.7%나 차이나는 모습을 알 수 있습니다. 이렇게 AlexNet은 최초로 ImageNet 데이터셋에 CNN을 적용하여 매우 좋은 성능을 보임으로서 CNN 부활의 신호탄을 쏘게 됩니다.

6. 의의

마지막으로 AlexNet의 의의에 대해 정리해보겠습니다.

AlexNet의 첫 번째 의의는 누가 뭐라해도 딥러닝의 가능성을 입증한 것일 겁니다. AlexNet은 2012년 ImageNet 이미지 분류 대회에서 압도적인 성능을 보여주었습니다. 이전까지는 기계 학습 알고리즘을 사용해 이미지를 분류하던 것을 넘어서, 딥러닝을 사용하면 더 높은 정확도를 달성할 수 있다는 것을 증명한 것이죠. 이는 딥러닝이 이미지 인식, 음성 인식, 자연어 처리 등 다양한 분야에서 높은 성능을 낼 수 있다는 가능성을 보여주었고, 딥러닝 연구와 응용에 대한 관심을 크게 높였습니다. 딥러닝의 부흥을 이끌어낸 모델이라고 할 수 있죠.

AlexNet의 두 번째 의의는 GPU를 사용한 병렬 연산의 중요성을 입증한 것입니다. AlexNet은 그래픽 처리 장치(GPU)를 활용하여 병렬 연산을 수행했는데요. 이로 인해 복잡하고 큰 모델도 빠르게 학습할 수 있었습니다. 이는 딥러닝 모델을 실제 문제에 적용하기 위한 중요한 발판이 되었습니다. 즉, GPU의 활용은 딥러닝 모델을 더 크고 복잡하게 만들면서도 학습 시간을 크게 단축시켰습니다.

7. 마치며

AlexNet의 여정을 함께 탐험하면서, 이 획기적인 모델이 어떻게 딥러닝의 세계를 변화시켰는지 깊이 있게 살펴보았습니다. AlexNet은 단순한 모델을 넘어서 딥러닝의 가능성을 세계에 알린 중요한 랜드마크입니다. 이 모델은 대규모 데이터셋에서의 성능 문제를 해결하고, 딥러닝의 효과를 입증함으로써, 이후의 많은 연구와 발전의 길을 열어주었습니다.

본 글에서는 AlexNet 이전의 방법들이 겪었던 문제와 이를 극복하기 위한 AlexNet의 독특한 아키텍처와 기법들에 대해 상세히 알아보았습니다. 또한, 파이썬을 통해 모델을 직접 구현하면서 이론과 실제 사이의 간극을 줄일 수 있었습니다. 이를 통해 AlexNet의 핵심 개념과 기능에 대한 깊은 이해를 얻을 수 있었습니다.

AlexNet의 성공은 딥러닝의 강력한 능력을 증명하는 동시에, GPU를 활용한 병렬 연산의 중요성을 강조하였습니다. 이는 현대의 딥러닝 연구와 응용에 있어서 중요한 기반을 제공하며, 이후의 다양한 모델과 기법의 발전을 촉진시켰습니다.

이제 여러분도 AlexNet의 중요성과 그 기여를 충분히 이해하셨을 것이라 믿습니다. 이를 바탕으로 여러분의 딥러닝 연구와 학습에 있어서 새로운 영감과 통찰을 얻으셨기를 바랍니다. AlexNet은 여전히 딥러닝의 역사에서 빛나는 별로 남아있으며, 그 영향력은 계속해서 우리의 연구와 학습에 긍정적인 영향을 미칠 것입니다. 여러분의 딥러닝 여정에 AlexNet이 좋은 친구가 되길 바랍니다!

Series Navigation<< 1. Basic Vision Model[15′ CVPR] Going deeper with convolutions (GoogleNet, inception) 핵심 리뷰 >>
0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
Scroll to Top