일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Tacotron
- FastSpeech
- Noise Contrastive Estimation
- Negative Sampling
- Neural Collaborative Filtering
- Ai
- TTS
- FastSpeech2
- ALS
- 논문리뷰
- word2vec
- Dilated convolution
- 부스트캠프 AI Tech
- Tacotron2
- 추천시스템
- Skip-gram
- Recommender System
- Implicit feedback
- matrix factorization
- SGNS
- ANNOY
- BOJ
- 백준
- Item2Vec
- wavenet
- CV
- Collaborative Filtering
- CF
- NEG
- RecSys
- Today
- Total
devmoon
[논문 리뷰] AlexNet / ImageNet Classification with Deep CNN 본문
AlexNet이라고 흔히 불리는 이번 논문은 2012년 이미지 분류 대회에서 우승을 차지한 모델이다. CNN을 사용한 딥러닝 구조에서 어떻게 많은 120만 장의 사진들을 그 당시 기술로 처리를 하였고, 파라미터 수가 많은데 과적합 문제를 어떻게 해결했는지 알아볼 수 있는 좋은 논문이다.
INTRODUCTION
2012년, 객체 인식(Object Recognition)을 하기 위해서는 머신러닝을 사용한 방법들이 거의 필수적으로 다가왔고 그 성능을 끌어올리기 위해서는 많은 양의 데이터셋이나 더 강력한 모델 그리고 오버 피팅을 방지하기 위한 기술들이 필요했다. 따라서 약 100만 개의 데이터를 학습시키기 위한 모델이 필요했었고, 수천 가지의 카테고리로 분류하기 위해서는 가지고 있지 않은 데이터에 대해서도 좋은 성능을 내도록 학습시켜야 했다.
CNN은 위 문제를 모델의 깊이와 너비를 변경할 수 있어 모델의 크기를 조절하며 해결할 수 있었다. CNN은 feedforward neural network 보다 더 적은 파라미터와 복잡성이 있어 학습하기 쉬움에도 불구하고 이론상 최대 성능은 feedforward neural network보다 약간만 떨어졌다. CNN은 이렇게나 매력적이지만, 큰 크기를 갖는 고해상도 이미지에 대해서는 엄두도 못낼만큼 cost가 많이 들었다. 다행히 그 당시에 등장한 GPU와 2D-CNN구조는 많은 양의 데이터를 통해 극심한 오버피팅이 일어나지 않고 모델을 학습할 수 있도록 도와주었다.
DATASET
ImageNet 데이터셋은 22,000개의 카테고리가 있는 150만개의 고해상도 이미지이다. 2010년부터 ILSVRC 대회에서는 ImageNet의 사진 중에서 약 1000개의 카테고리 별로 1000개의 사진을 골라서 대회에서 사용되고 있다. 전체 사진으로 보았을 때는 약 120만 개의 train dataset과 5만 개의 validation dataset, 15만 개의 test dataset을 제공한다. 제공되는 데이터셋의 사진들은 다양한 크기의 사진들이 존재했는데, AlexNet은 고정된 크기의 사진이 필요함에 따라 다음 과정을 거쳤다.
- 이미지의 가로 세로중 짧은 쪽의 픽셀 수가 256이 되도록 줄인다.
- 256 x 256 의 정사각형 이미지를 얻기 위해 줄인 사진의 중앙을 crop 하여 얻어낸다.
- 각 픽셀의 RGB값을 전체 이미지의 RGB 평균으로 빼준다.
ARCHITECTURE
이번 파트는 AlexNet의 구조를 알려주고 어떤 기법을 사용되었는지 소개하는 본론이다. 각 기법들을 소개하는 순서는 중요도에 의해 정렬되었으며, 가장 처음에 나오는 기법이 가장 중요한 것이다.
1. ReLU Nonlinearity
일반적으로 뉴런의 결과를 낼 때 활성함수로 하이퍼볼릭 탄젠트나 시그모이드 함수를 사용하였다. 하지만, 이런 saturating nonlinearities를 사용하는 것보다 non-saturating nonlinearities 인 ReLU를 사용하는 것이 학습 속도 측면에서 훨씬 빠르다고 주장한다. 여기서 saturating은 양의 무한대 또는 음의 무한대로 갈수록 그 기울기가 0으로 수렴하는 것을 말한다.
위의 사진을 보면 점선(saturating nonlinearities)인 하이퍼볼릭 탄젠트 함수를 사용하는 것보다 실선(non-saturating nonlinearities)인 ReLU를 사용하는 것이 학습 에러율을 25% 이하로 낮추는 데 걸리는 시간이 6배 단축된다고 한다. 또한 ReLU를 사용하지 않았다면 엄청난 크기의 신경망을 학습하지 못했을 것이라고 발표하며 ReLU의 사용을 강조하였다.
물론 non-saturating 활성함수의 사용은 AlexNet이 처음은 아니었다. 이전에 $\vert \text{tanh}(x) \vert$ 와 같은 함수를 사용한 논문이 있으며 위의 함수를 통해 오버피팅을 방지했다는 발표가 있었다. 하지만, AlexNet이 필요로 한 것은 빠른 학습 속도이었기에 다른 함수를 필요로 했던 것이다.
2. Multiple GPUs
저자들이 학습에서 사용한 GPU는 GTX 580 GPU로 3GB의 메모리를 가지고 있는 장비이다. 학습 데이터셋으로 주어지는 120만장의 이미지는 모델을 학습시키기에 충분한 양이었지만, 그 개수와 크기는 GPU가 감당할 수가 없었다. 따라서 저자들은 2개의 GPU를 병렬적으로 사용하여 문제를 해결했다.
다만, 딥러닝의 특정 레이어에서만 2개의 GPU가 서로 데이터를 교환할 수 있게 만들고 나머지 레이어에서는 같은 GPU로부터 연산을 이어받을 수 있게 만들었다. 각각의 GPU는 커널을 절반으로 나누어서 연산을 처리하게 하여 하나에 가해지는 부담을 줄였다. 이 과정은 아래 AlexNet의 구조를 도식화한 부분에서 묘사되어있다.
3. Local Response Normalization
현재는 Batch Normalization의 등장으로 잘 사용하지 않는 normalization 기법이지만, 당시에는 ReLU의 결과값이 너무 커져서 주변 뉴런에 영향을 주는 것을 방지하기 위해 normalization 기법이 필요했다. CNN 특성상 현재 픽셀에 대한 결과를 계산하기 위해 이웃한 픽셀도 참고하기 때문에 영향을 주게 되는 것이다.
$$ b_{x, y}^i = a_{x, y}^i / \left ( k + \alpha \sum_{j=\max (0, i-n/2)}^{\min(N-1, i+n/2)}(a_{x, y}^j)^2 \right )^\beta $$
- $a_{x, y}^i$ : (x, y)에 존재하는 픽셀에 대해 $i$ 번째 커널을 적용하여 얻은 결과에 ReLU를 씌운 값
- $N$ : 레이어에 존재하는 전체 커널의 수
- $n$ : 인접하다고 판단할 범위 값 (하이퍼 파라미터)
수식에서 등장하는 상수 $k, n, \alpha, \beta$ 는 하이퍼파라미터로 논문에서는 각 값을 $k=2, n=5, \alpha =10^{-4}, \beta =0.75$ 로 설정하였다. 위의 정규화 과정은 모든 레이어에서 사용된 것은 아니고 특정 레이어에서만 사용되었으며, ReLU를 거치고 난 결괏값에 사용하였다. 이 정규화 방법을 통해 Top-1 에러율은 1.4%, Top-5 에러율은 1.2% 감소시킬 수 있다고 밝혔다.
4. Overlapping Pooling
기존에 CNN에서는 Pooling을 진행할 때, pooling unit들이 겹쳐져서 연산되는 것이 아니라 겹치지 않게 연산이 이루어졌다. 저자들은 하지만, 저자들은 겹쳐서 pooling 연산을 수행하여 Top-1 에러율을 0.4%, Top-5 에러율을 0.3% 감소시켰다고 한다. (stride = 2, kernel = 3 x 3 사용)
5. Overall Architecture
이 부분에서는 저자들이 대회에서 사용한 모델의 구조를 설명한다. 모델의 전체 구조는 총 8개의 레이어로 이루어져있으며 세부적으로는 5개의 Convolution Network와 3개의 Fully Connected Network로 구성되어있다. Fully Connected의 마지막 레이어는 1000개의 클래스로 분류하는 softmax 연산을 거쳐서 최종적으로 1000개의 객체를 분류할 수 있게 만들었다.
위의 Convolution 레이어에서 2, 4, 5번째 레이어는 바로 이전의 GPU에서 연산된 결과를 그대로 가져와서 사용하는 반면, 3번째 레이어에서는 GPU간의 communication을 통해 이전 레이어에서 연산된 2개의 GPU 결과를 모두 받아오도록 만든 것을 확인할 수 있다. (3번째 레이어에서 점선이 교차되어서 그려진 것을 볼 수 있다.)
Fully Connected 레이어는 이전 레이어의 뉴런을 모두 연결하여 받아왔고, 앞서 설명한 Response Normalization은 Convolution 레이어의 1번째와 2번째 레이어에서 사용되었다. Overlapping Pooling을 진행하는 Max pool과정은 Convolution 레이어의 1번째, 2번째 그리고 마지막인 5번째 레이어에서 사용되었다. 활성함수로 사용된 ReLU는 모든 레이어(5개의 Convolution, 3개의 Fully Connected)에서 사용되었다.
아래에서 Convolution 연산의 결과를 계산하기 위해서 계산식을 알고있어야 한다. 식에 들어가는 인자는 입력의 크기, 커널의 크기, 커널의 개수, 패딩과 stride의 크기이다. 이 정보들이 있으면 다음 레이어의 출력 크기를 계산하는 것이 가능하다. 이제 아래에서는 이 식을 이용해서 각 레이어의 output 크기를 연산한다.
$$ \frac{I - K + 2P}{S} + 1 $$
- $I$ : 입력 이미지의 너비(높이)
- $K$: 커널의 너비(높이)
- $P$ : 패딩의 크기
- $S$ : stride 크기
# 1번째 Convolution 레이어
논문에서 첫 번째 레이어에서 받는 입력의 크기가 224 x 224 x 3 크기의 입력을 받는다고 되어있지만, 이후에 이는 오류라고 발표하며 정정된 내용에서는 227 x 227 x 3 의 크기가 맞다고 발표하였다. 따라서 위의 사진과 달리 227 x 227 x 3 으로 간주해서 해석을 진행해야 올바른 계산 결과를 도출할 수 있다. 처음 입력 227 x 227 x 3 의 입력 이미지를 96개의 커널(11 x 11 x 3)을 stride(4), padding(0) 로 연산을 진행하게 되면 그 출력은 아래와 같이 연산해볼 수 있다.
$$ \frac{227 - 11 + 2 \times 0}{4} + 1 = 55 $$
따라서 가로와 세로의 크기가 55이며 채널의 수는 커널의 개수인 96으로 설정되어 55 x 55 x 96의 결과를 얻어낼 수 있다. 하지만 중요한 것은 총 2개의 GPU를 사용하여 커널을 절반으로 나누어 가져 가기 때문에 하나의 GPU는 55 x 55 x 48 의 결과를 받는다. 다음은 큰 값이 주변에 영향을 주지 못하도록 하는 Response Normalization을 진행하고 stride(2), kernel(3x3) 의 Max Pooling을 진행한다.
$$ \frac{55 - 3}{2} + 1 = 27 $$
결과적으로 Max Pooling까지 진행했을 때, 1개의 GPU는 27 x 27 x 48의 연산 결과를 얻게 되고 이는 다시 2번째 레이어의 입력이 된다. 다시 첫 번째 레이어에서 하는 것을 정리하면 다음과 같다.
- 입력 : 227 x 277x 3
- 커널 : 11 x 11 x 3, 96개, stride(4), padding(0)
- GPU 1개의 Convolution 연산 결과: 55 x 55 x 48
- ReLU
- Response Normalize 진행
- GPU 1개의 Max (Overlapping) Pooling 결과 : 27 x 27 x 48
# 2번째 Convolution 레이어
- 입력 : 27 x 27 x 48
- 커널 : 5 x 5 x 48, 256개, stride(1), padding(2)
- GPU 1개의 Convolution 연산 결과: 27 x 27 x 128
- ReLU
- Response Normalize 진행
- GPU 1개의 Max (Overlapping) Pooling 결과 : 13 x 13 x 128
# 3번째 Convolution 레이어
- 입력 : 13 x 13 x 128 x (2개)
- 커널 : 3 x 3 x 256, 384개, stride(1), padding(1)
- GPU 1개의 Convolution 연산 결과 : 13 x 13 x 192 (2개의 CPU communication 연산 포함)
- 입력이 communication으로 인해 2개를 전달받기 때문에 커널의 채널크기가 입력 채널 크기의 2배
- ReLU
# 4번째 Convolution 레이어
- 입력 : 13 x 13 x 192
- 커널 : 3 x 3 x 192, 384개, stride(1), padding(1)
- GPU 1개의 Convolution 연산 결과 : 13 x 13 x 192
- ReLU
# 5번째 Convolution 레이어
- 입력 : 13 x 13 x 192
- 커널 : 3 x 3 x 192, 256개, stride(1), padding(1)
- GPU 1개의 Convolution 연산 결과 : 13 x 13 x 128
- ReLU
3개의 Fully Connected 레이어에는 각각 4096개의 뉴런이 존재하며 최종적으로 softmax 연산을 통해 1000개의 객체에 대한 확률을 모델링하도록 설정하였다. 이렇게 AlexNet의 전체 모델 구조를 살펴보았으며 여기에 사용된 파라미터의 개수는 약 6000만 개가 된다고 한다. 파라미터의 수가 클수록 그리고 레이어가 깊어질수록 오버피팅이 발생하기 쉬운데 AlexNet은 이를 해결한 방법들에 대해서 이제부터 소개하기 시작한다.
Reducing Overfitting
파트4에서는 저자들이 사용한 2개의 주된 과적합 방지 기법에 대해서 소개한다.
1. Data Augmentation
오버피팅을 방지하기 위한 가장 쉽고 좋은 방법은 데이터의 라벨이 변형되지 않는 선에서 데이터를 임의로 추가하여 크게 하는 것이다. 따라서 저자들은 2개의 데이터 증강 방식을 선택했으며 특히 그 연산량이 적어서 따로 저장공간에 저장할 필요 없이 연산할 때마다 바로바로 처리할 수 있다고 한다.
첫 번째 변형 방법은 좌우반전이다. 이미지(256 x 256)를 좌우반전시켜도 이미지의 라벨은 변하지 않기 때문에 사용할 수 있으며 그 변형된 사진에서 다시 랜덤으로 (224 x 224) 크기의 패치를 얻어내어 입력으로 사용하였다. 이렇게 되면 32 x 32 x 2 = 2048 배만큼 데이터를 더 늘릴 수 있게 된다. Test 시에는 각 꼭지점 4 부분의 224 x 224 패치와 중앙의 패치 총 5개의 패치 그리고 마찬가지로 좌우반전에서 다시 뽑은 5개의 패치를 사용해 총 10개의 패치를 입력으로 넣었다. 저자들은 10개의 패치에 대해 나온 결과를 평균 내어 최종 output으로 산출하였다고 한다.
두 번째 변형방법은 RGB 채널의 색상강도를 조절하는 방법이다. 주성분분석(PCA)를 진행하고 평균(0), 표준편차(0.1)을 갖는 가우시안 분포에서 랜덤 변수를 추출한 후, 원래의 픽셀 값에 곱해주어 색상의 변형을 주는 방법이다. 이방식을 사용하게 되면 원래의 라벨을 해치지 않으면서 색상의 변형을 일으키는 것이 가능하다.
2. Dropout
서로 다른 모델의 예측결과를 결합하는 앙상블 기법은 그 효과가 매우 좋았지만, 네트워크 구조가 거대한 딥러닝 모델의 경우 학습하는데 시간이 오래 걸리기 때문에 비용적으로 비효율적이었다. 따라서 저자들은 새로운 방법을 찾기를 원했고 당시로는 최근에 발표된 Dropout 기법을 사용해보았다고 한다.
Droptout 기법은 사용자가 지정한 확률을 근거로 하여 특정 뉴런에 신호를 전달하지 않는 방법을 말하며, 이를 통해 모델의 복잡성을 크게 감소시키는 것이 가능하다. 저자들은 50% 확률로 네트워크에 포함된 뉴런들이 다음 뉴런으로 신호를 전달하지 않도록 설정하였다. AlexNet에서는 1번째와 2번째 Fully connected 레이어에 Dropout을 적용시켜 좋은 효과를 보았지만, 최종적으로 구하고 싶은 해에 수렴하기 까지는 2배 넘는 iteration 이 소모되었다고 한다.
그 이후에는 학습에 대한 더 자세한 설정(momentum, batch크기, 학습률)에 대한 이야기를 다루며 최종적으로는 그 성능에 대해서 발표한다.실제로 그 결과를 보았을 때 사람과 유사한 수준의 분류를 해내는 것을 알 수 있었으며 사람이 보아도 분류하기 애매한 사진들은 학습하기가 어려웠었다.
실제로 이미지 분류대회를 한 번 진행하면서 데이터 증강 기법이 주는 성능 차이가 있었고, 논문에서 발표한 Horizontal Flip, Color PCA를 사용하였을 때 성능 향상을 경험한 적이 있어서 더 흥미롭게 읽을 수 있었다. 현재를 기준으로 10년 전에 발표된 논문임에도 뛰어난 성능을 보인 것이 놀라웠고 Computer Vision 분야의 빠른 발전을 다시 한번 느낄 수 있게 해 주었다. 추가로 더 많은 레이어가 추가되었을 때, 현재는 어떠한 방식으로 오버피팅이나 계산 복잡도 문제를 해결하는지 궁금해졌고 더 적은 레이어로 이와 유사한 성능을 낼 수 있는 방법은 무엇이 있는지에 대한 궁금증이 생겼다.
'AI > 논문 리뷰' 카테고리의 다른 글
[논문 리뷰] Matrix Factorization techniques for Recommender Systems (0) | 2022.12.04 |
---|---|
[논문 리뷰] Collaborative Filtering for Implicit Feedback Datasets (0) | 2022.11.08 |
[논문 리뷰] VGGNet / Very Deep Convolutional Networks for large-scale image recognition (0) | 2022.10.04 |
[논문 리뷰] Batch Normalization (2) | 2022.08.24 |
[논문 리뷰] An overview of gradient descent optimization algorithms (2) | 2022.08.19 |