- 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. 들어가며
딥러닝 모델의 학습은 여러 요소에 의해 복잡하게 얽혀있습니다. 이 중 하나가 바로 ‘Covariate Shift’ 문제인데, 이는 학습 과정에서 레이어 별로 입력 데이터의 분포가 달라지면서 모델의 학습을 불안정하게 만드는 현상입니다. 이러한 문제를 해결하기 위해 ‘Batch Normalization’이라는 기법이 제안되었고, 이는 모델의 학습을 안정화시키면서도 높은 성능을 유지할 수 있게 도와줍니다. 이번 글에서는 먼저 Covariate Shift의 개념과 이것이 왜 딥러닝 모델의 학습에 문제가 되는지를 상세히 알아보겠습니다. 이해를 돕기 위해, 이 문제가 실제로 어떻게 모델의 학습을 방해하는지에 대한 예시와 함께 설명할 예정입니다.
다음으로, 이러한 Covariate Shift 문제를 해결하기 위한 Batch Normalization의 핵심 아이디어와 작동 원리에 대해 깊이 있게 탐구해보겠습니다. Batch Normalization이 학습 과정에서 어떻게 적용되는지, 그리고 추론 과정에서는 어떻게 다르게 적용되는지에 대한 내용을 수식과 그림을 통해 쉽게 이해할 수 있도록 설명할 것입니다. 또한, CNN에서의 Batch Normalization 적용 방법과 그 효과에 대해서도 자세히 알아보겠습니다.
이어서, 파이썬을 이용하여 Batch Normalization을 직접 구현하는 과정을 함께 거쳐보며, 이론과 실제 적용 사이의 간극을 줄여보겠습니다. 이를 통해 여러분은 Batch Normalization의 작동 원리를 더욱 명확하게 이해할 수 있게 될 것입니다. 코드를 작성하고 실행하는 과정에서, Batch Normalization의 세부 작동 원리를 체험하게 될 것입니다.
또한, 실험 결과를 통해 Batch Normalization이 모델의 성능과 학습 안정성에 어떠한 긍정적인 영향을 미치는지를 실제로 확인할 수 있을 것입니다. 여러 실험 결과와 그 해석을 통해, Batch Normalization의 효과를 실질적으로 이해하고 평가할 수 있게 될 것입니다.
마지막으로, Batch Normalization의 큰 의의를 두 가지 중심으로 다룰 예정입니다. 첫 번째는 학습의 안정성을 크게 향상시키는 것과, 두 번째는 모델에 대한 정규화 효과를 가져오는 것입니다. 이 두 가지 요소는 Batch Normalization이 딥러닝 모델의 학습에서 빠질 수 없는 중요한 요소임을 다시 한번 강조합니다.
이러한 다양한 내용을 통해, 여러분은 Batch Normalization에 대한 깊이 있는 이해를 갖게 될 것이며, 이를 자신의 모델에 효과적으로 적용하여 더욱 강력하고 안정적인 딥러닝 모델을 구축할 수 있게 될 것입니다. 이번 글이 여러분의 학습과 연구에 도움이 되길 바랍니다.
2. 문제 상황
딥러닝 모델은 보통 모델의 깊이가 깊어질수록 성능이 증가한다고 알려져 있습니다. Batch Normalization이 발표된 2015년 이전 연구들을 보면 Inception, VGGNet 등 네트워크의 깊이가 급격하게 깊어지는 모습을 볼 수 있습니다. 네트워크의 깊이가 깊다는 건, 네트워크가 그만큼 많은 가중치를 갖는다는 말이고, 그 말은 곧 네트워크의 표현력이 좋아진다는 의미가 됩니다. 따라서 다양한 특징을 학습할 수 있게 되어 네트워크의 성능이 좋아지게 되죠.
하지만 세상 모든 게 그렇듯 얻는 게 있으면 잃는 것도 있는 법이죠. 모델의 깊이가 깊어질수록 표현력이 좋아진 만큼, 학습 능력은 불안정해지게 됩니다. 왜 그럴까요?
모델의 입장에서 각 연산을 거친 결괏값에 초점을 맞춰 상상해 보겠습니다. 먼저 입력 데이터는 0~1 사이값으로 정규화(Normalization)를 거쳐 넣어줄 겁니다. 입력 데이터는 0~1 값이었지만 한 개 층에서 연산을 거친 뒤 결괏값은 이보다는 큰 범위인 -3 ~ 3 값으로 나왔다고 가정하겠습니다. 이제 다음 층은 정규화된 값이 아닌 -3 ~ 3 사이값을 입력으로 받아야 합니다. 당연히 이에 대한 결괏값은 -3 ~ 3 보다는 더 큰 범위를 갖겠죠.
이렇게 층이 깊어질수록 연산 결괏값의 분포 범위는 더 커지게 됩니다. 이는 입력 데이터의 특성에 따라 최종 결괏값이 일정 범위 안에 머물기 어렵게 만듭니다.
3. 기존 방법
Batch Normalization 방법이 제안되기 전에도 이러한 문제를 해결하기 위해 몇 가지 방법이 제안되었습니다.
첫 번째는 적절한 비선형 활성함수 (Non-Linear Activation Function)을 사용하는 것입니다.
예를 들어 Sigmoid 함수를 사용하면 결괏값의 범위를 0~1 값으로 제한해 줄 수 있습니다. 이를 통해 결괏값의 범위가 무제한으로 커지는 상황은 막아줄 수 있습니다. 하지만 모델의 표현력을 떨어뜨리는 문제를 만들죠. 입력값에는 큰 차이가 있었고, 모델은 이를 인지하고 결괏값에서도 큰 차이를 표현해주어야 하는데, 결괏값을 0~1 사이로 제한해 버리니 차이가 없어지는 겁니다. 이러한 문제는 ReLU 함수를 사용하면 개선해 줄 수 있습니다. ReLU는 Sigmoid와 달리 0보다 큰 입력값에 대해서는 동일한 값으로 변환해 주기 때문입니다.
두 번째는 적절한 가중치 초기화 (Weight Initialization)를 해주는 것입니다.
이는 가장 낮은 loss를 찾아가고자 하는 모델의 입장에서 생각해 보면 이해할 수 있습니다. 어딘가에는 학습 데이터에 대해 가장 낮은 loss를 갖게 하는 가중치 조합이 있을 겁니다. 그런데 출발점이 영 이상하면 찾아가기 힘드니, 시작점만 잘 찾아줘도 목적지까지 수월하게 갈 수 있다는 생각인 거죠. 틀린 말은 아니지만 근본 원인을 해결할 수 있는 방법은 아닙니다.
세 번째는 작은 학습률 (Learning Rate)를 사용하는 것입니다.
이 또한 모델의 입장에서 생각해 보면 쉽게 이해할 수 있습니다. 애초에 문제가 연산할 때마다 결괏값의 범위가 점점 커지는 것이라고 했잖아요. 이렇게 결괏값이 크게 튀는 이유는 모델이 학습하면서 가중치를 너무 크게 바꿔주기 때문이라는 거죠. 따라서 가중치를 조금씩만 바꾸자, 즉 학습률을 작게 해 주자는 생각인 거죠. 이 또한 논리상 틀린 말은 아닌데요, 이렇게 되면 Local Minimum에서 못 빠져나오는 문제도 생기고 학습 자체가 너무 느려지게 되죠.
따라서 어느 제안도 근본 해결책은 아님을 알 수 있습니다.
4. 문제의 핵심 원인
이제 Batch Normalization 논문의 주장을 살펴보겠습니다.
Batch Normalization에서는 문제의 근본 원인은 Covariate Shift라고 주장합니다.
Covariate Shift가 뭘까요? 입력 데이터가 Convolution, Activation, Pooling을 순서대로 거친다고 상상해 보죠.
위 그림은 각 단계별 데이터의 분포를 표현한 그림입니다. 입력 데이터는 정규화를 통해 평균 0과 표준편차 1을 갖는 정규분포로 만들어준 모습을 볼 수 있습니다. 그런데 Convolution을 거친 뒤의 분포는 평균과 표준편차가 틀어진 모습을 볼 수 있습니다. 이처럼 네트워크의 내부 연산 뒤 분포가 달라지는 현상을 Covariate Shfit라고 합니다.
그런데 Covariate Shift가 생기면 뭐가 문제일까요?
위 그림 상황을 이어서 생각해 보겠습니다. Convolution을 통해 나온 값들은 이제 Activation 연산으로 들어가야 합니다.
위 그림은 Sigmoid Activation Function을 표현한 그림입니다.
만약 위의 예시처럼 Convolution 연산의 결과 분포가 거의 대부분 0보다 작은 값을 갖게 된다면, 이에 대한 Sigmoid 결괏값은 대부분 0에 가까운 아주 작은 값을 갖게 됩니다. 이렇게 되면 입력값의 차이가 결괏값의 차이로 반영이 안 되는 상황이 되는 거죠. 즉 모델이 입력 데이터의 특징을 학습하지 못하는 상황이 되어 버린 겁니다.
5. Batch Normalization
5-1. Whitening
이에 대한 해결책은 무엇일까요?문제 원인이 Covariate Shfit라고 한다면 바로 떠오르는 간단한 해결책이 있습니다.
위 그림처럼 연산 결과 평균과 표준편차가 달라진 게 문제이니, 다시 정규화를 해서 평균 0과 표준편차 1의 분포로 만들어주면 되겠죠. 이러한 방법을 Whitening이라고 합니다. 학습 데이터가 총 N개이고 Whitening 해줘야 하는 데이터 (w, h, k)의 사이즈라고 가정해 보겠습니다.
그럼 위의 그림처럼 채널 방향으로 Whitening을 해주는 겁니다. 그럼 총 k번의 Normalization을 수행해 주는 거죠. 이러한 Whitening을 Convolution 연산을 할 때마다 수행해 주는 겁니다.
이제 Covariate Shfit가 해결되었으니 문제는 끝일까요? 문제는 여기서 끝이 아닙니다. Whitening은 Convolution 연산 결과마다 정규화를 해서 평균 0과 표준편차 1의 분포를 만들어주자는 거잖아요. 이렇게 되면 Non-Linear Activation Function이 제 역할을 못하게 됩니다.
위 그림은 Sigmoid 함수를 표현한 그림입니다. Sigmoid 함수는 입력값의 범위에 따라 결괏값의 특성이 다릅니다. 먼저 입력값이 0 근처인 부분을 보죠. 이 부분은 거의 선형적으로 변화하는 특성이 있습니다. 반면 0에서 멀리 떨어질수록 비선형적으로 변화하는 특징이 있죠. 그런데 우리가 지금 Convolution 결괏값을 전부 0 근처의 값으로 만들어주었잖아요. 그러면 이 값들이 Sigmoid를 거치더라도 비선형적 특성을 학습할 수가 없습니다. 함수는 비선형 함수지만 입력값의 범위가 전부 선형적인 특성에 갇혀 있으니까요.
5-2. Batch Normalization
이제 등장하는 게 바로 Batch Normalization입니다. Batch Normalization의 아이디어는 간단합니다. Whitening의 아이디어는 좋았어요. 약간의 보완이 필요할 뿐이죠.
5-2-1. 큰 그림
지금 문제는 Convolution 결괏값을 정규화했다는 게 아닙니다. 정규화를 평균 0, 표준편차 1로만 만들어줬다는 게 문제인 거죠. 그럼 ‘적당한’ 평균과 ‘적당한’ 표준편차로 정규화를 해주면 되는 거 아니겠어요?
위 그림은 Batch Normalization 연산 과정을 표현한 그림입니다. 평균 0, 표준편차 1인 정규분포에 대해 scale와 shift 연산을 통해 분포를 변화시키는 모습입니다. scale은 표준편차를 변화시켜 분포의 범위 (scale)을 바꿔주는 작업입니다. shift는 평균값을 변화시켜 분포를 이동 (shfit) 시키는 작업이죠. 이 둘을 ‘적절히’ 섞어주면 ‘적당한’ 평균과 ‘적당한’ 표준편차를 갖는 분포로 변환해 줄 수 있습니다.
위 그림의 아래 식을 보면 x^은 데이터의 평균을 의미합니다. y가 scale과 shift를 통해 나온 값인데요. x^에 대해 scale(𝛾)와 shift(𝛽)를 연산해 준 모습을 볼 수 있습니다. scale 값을 곱해줘 범위를 바꿔주고 shift 값을 더해줘 분포를 이동시키는 거죠. Whitening과 마찬가지로 Convolution 결과 feature map이 k개의 차원을 갖는다면, 총 k개의 (𝛾,𝛽) 쌍이 나오게 되는 겁니다. 그리고 이를 m개의 Convolution 결과에 적용한다면 m개의 Batch Normalization layer가 생기게 될 거고, 각 Batch Normalization layer는 k개(각 차원수)의 (𝛾,𝛽)를 갖게 됩니다.
5-2-2. Batch Normalization 학습하기
자, 아직 고민해봐야 할 문제가 남아있습니다. ‘적당한’ 𝛾와 𝛽를 찾으면 된다고 표현했는데요, 이 ‘적당한’ 값을 어떻게 찾을까요?
학습을 통해 찾습니다. Batch Normalization Layer의 학습 파라미터는 바로 이 (𝛾,𝛽)입니다. 각 Batch Normalization Layer마다 k개의 (𝛾,𝛽)를 학습해줘야 하는 것이죠. 물론 학습 방향은 Loss가 줄어드는 방향입니다.
그런데 Batch Normalization을 모든 학습 데이터 전체를 가지고 매번 계산하자면 너무 힘들잖아요? 데이터가 10만 개라고 하면 매 학습 때마다 10만 개의 데이터에 대한 m개 layer의 k개 평균과 표준편차를 계산해야 하니까요. 그래서 데이터 전체 (Batch)가 아닌 mini-batch마다 Batch Normalization을 수행하는 방법을 사용합니다.
이제 Batch Normalization을 추가하여 CNN을 구성하면 다음과 같아집니다.
Convolution과 Activation 사이에 Batch Normalization Layer가 추가된 모습을 볼 수 있습니다. 이렇게 추가된 Batch Normalization Layer는 입력 분포를 학습 Loss가 줄어드는 방향으로 ‘적절하게’ 바꿔주는 (scale & shift) 모습을 볼 수 있죠.
5-2-3. 정리
Batch Normalization의 철학을 정리해 보면 이렇습니다.
Convolution 연산을 수행할 때마다 결괏값의 분포가 너무 커지는 게 문제였습니다. 그래서 자연스럽게 Convolution 연산을 할 때마다 결괏값들을 정규화해 주자는 아이디어가 나왔죠. 하지만 이렇게 되면 비선형성을 학습할 수 없게 된다는 문제가 생겼습니다. 그래서 이번에는 정규화한 뒤에 적당한 scale과 shift를 추가해 주자는 아이디어가 나왔죠. 이때의 scale과 shift항은 학습 loss가 줄어드는 방향으로 학습을 하는 것이고요. 이를 알고리즘으로 표현하면 다음과 같습니다.
또한 위의 논리대로라면 Backpropagation을 통해 Batch Normalization 파라미터 (𝛾,𝛽)를 학습할 수 있어야 합니다. (𝛾,𝛽)에 대한 미분 연산은 다음과 같습니다.
(𝛾,𝛽) 모두 Loss에 대해 미분 가능하므로 Backpropagation을 사용하여 학습할 수 있습니다.
5-3. Inference of Batch Normalization
이제 Batch Normalization의 학습 과정은 전부 살펴봤습니다.
Inference 단계에서는 Batch Normalization을 어떻게 계산하면 될까요?
Inference 단계에서 입력으로 받은 mini batch에 대해 동일한 작업을 수행하면 될까요?
5-3-1. Inference 단계에서의 고민
생각해 보면 이렇게 했을 때 두 가지의 문제가 발생합니다.
첫 번째 문제는 mini batch 사이즈입니다. Inference 단계에서는 Train 때와는 다른 mini batch를 사용할 수 있습니다. 더욱 극단적으로 mini batch 사이즈가 1일 수도 있죠. 한 장의 이미지에 대해서도 결괏값을 낼 수 있어야 하니까요. 그런데 mini batch 사이즈가 1인 상태에서의 Batch Normalization은 의미가 없습니다. 한 장의 이미지만 가지고 Normalization을 할 수는 없으니까요.
두 번째는 좀 더 근본적인 문제인데요. 기껏 학습한 Batch Normalization 기능을 제대로 활용하지 못한다는 것입니다. Batch Normalization 연산 과정을 다시 한번 생각해 보죠.
Batch Normalization 연산은 크게 두 가지로 나누어 생각해 볼 수 있습니다.
첫 번째는 Normalization 과정입니다. 이를 통해 mini batch의 평균을 0으로 표준편차를 1로 만들어주죠.
두 번째는 scale과 shift 과정입니다. 이 과정을 통해 Loss가 줄어드는 방향으로 데이터 분포를 이동시켜 줍니다.
지금의 문제는 첫 번째의 Normalization 과정에서 평균과 분산을 무슨 값을 사용할 것인지인데요. 이때의 평균과 분산을 Inference 단계에서 받은 mini batch의 값을 사용하면 무슨 문제가 생길까요? 학습 데이터로부터 배운 데이터 분포의 특성을 활용하지 못하게 됩니다. Batch Normalization을 학습하는 과정에서 모델은 학습 데이터 전체를 mini batch로 돌면서 학습을 합니다. 따라서 이때의 scale과 shift 값은 학습 데이터 전체를 커버하는 최적의 값이죠. 그런데 갑자기 처음 보는 데이터들인 Inference 단계에서의 mini batch에 대한 평균과 분산으로 Normalization 해주면 이러한 학습 과정에서의 지식을 활용하지 못하게 됩니다. 뿐만 아니라 모든 Inference의 mini batch 마다 평균과 분산값이 다를 테니 뒤죽박죽으로 값이 튀게 될 겁니다. 따라서 Inference 단계의 Normalization에서 사용할 평균과 분산은 학습 데이터를 대표하는 값을 사용해야 합니다.
5-3-2. Inference 단계에서의 평균과 분산 계산하기
그럼 학습 데이터를 대표하는 평균과 분산은 어떻게 구할까요?
위 그림은 Inference 단계에서 사용할 평균과 분산을 구하는 과정을 표현한 그림입니다. 평균과 분산을 학습 데이터 전체 mini batch의 이동 평균으로 구하는 모습을 볼 수 있습니다. 각 mini batch마다의 평균과 분산이 다를 텐데요, mini batch가 뒤로 갈수록 학습이 진행될 거고, 따라서 점차 이상적인 분포를 향해 나아가고 있을 겁니다. 그럼 뒤에서 나오는 mini batch의 평균과 분산일수록 학습 데이터 전체를 대표한다고 할 수 있겠죠. 따라서 학습 데이터 mini batch에서 나온 평균과 분산들의 이동평균을 사용해 Inference 단계에서 사용할 평균과 분산을 구해줍니다.
5-3-3. 정리
정리하자면 다음과 같습니다.
학습 단계에서 Normalization에 사용하는 평균과 분산은 학습 데이터 mini batch의 평균과 분산을 사용합니다. 반면 Inference 단계에서 Normalization에 사용하는 평균과 분산은 학습 단계에서 쌓이는 mini batch들의 평균과 분산의 이동평균값을 사용합니다. 이 과정을 Batch Normalization 논문에서와 같이 알고리즘으로 표현하면 다음과 같습니다.
5-4. Batch Normalization의 한계
Batch Normalization은 장점도 많지만 한계도 분명 존재합니다.
위의 논리를 쭉 따라왔다면 쉽게 들 수 있는 생각인데요. mini batch를 사용하여 Normalization과 scale and shift를 하기에 mini batch 사이즈에 크게 영향을 받는다는 것입니다. 특히 mini batch 사이즈가 작아질수록 문제가 심각해집니다. 첫 번째 단계인 Normalization 단계에서 mini batch의 평균과 분산으로 Normalization을 수행하는데요. 이때 mini batch 사이즈가 작을수록 평균과 분산은 학습 데이터 전체의 평균, 분산과는 다른 값이 나올 겁니다. 따라서 Normalization을 할 때마다 다른 방향으로 mini batch 데이터들이 움직이게 되겠죠. 그 결과 학습이 불안정해지게 됩니다. 이러한 문제를 개선하기 위해 이후 Layer Normalization 등 다양한 Normalization 기법이 등장합니다.
6. 파이썬 구현
이번 챕터에서는 위에서 살펴본 Batch Normalization 내용을 정확히 이해하기 위해 파이썬으로 직접 구현해보겠습니다.
6-1. Import Module
먼저 필요한 Module 들을 Import 해줍니다.
import torch
import torch.nn as nn
import torch.nn.functional as F
6-2. Batch Normalization Class 정의하기
다음은 1D 데이터에 대한 Batch Normalization Class를 정의해줍니다. forward 함수를 보면 학습 과정과 테스트 과정에서의 수식을 따로 구현한 모습을 볼 수 있습니다.
class BatchNormalization1D(nn.Module):
def __init__(self, num_features, eps=1e-5, momentum=0.1):
super(BatchNormalization1D, self).__init__()
# Initialize scale and shift parameters
self.gamma = nn.Parameter(torch.ones(num_features))
self.beta = nn.Parameter(torch.zeros(num_features))
# Initialize moving averages
self.running_mean = torch.zeros(num_features)
self.running_var = torch.ones(num_features)
self.eps = eps
self.momentum = momentum
def forward(self, x):
# Check if we are in training or evaluation mode
if self.training:
# Compute the mean and variance of the input
mean = x.mean(dim=0)
var = x.var(dim=0, unbiased=False)
# Update running mean and variance
self.running_mean = (1 - self.momentum) * self.running_mean + self.momentum * mean
self.running_var = (1 - self.momentum) * self.running_var + self.momentum * var
# Normalize the input
x_normalized = (x - mean) / torch.sqrt(var + self.eps)
else:
# Normalize using running mean and variance during evaluation
x_normalized = (x - self.running_mean) / torch.sqrt(self.running_var + self.eps)
# Scale and shift
out = self.gamma * x_normalized + self.beta
return out
7. 효과
이번에는 실험을 통해 Batch Normalization은 어떤 효과가 있는지 살펴보겠습니다.
위 그림은 다양한 모델의 학습 진행 상황에 따른 ImageNet 정확도를 나타낸 그래프입니다.
우선 첫 번째로 살펴봐야 할 부분은 Inception과 BN-Baseline입니다.
Inception 모델에 Batch Normalization을 적용했을 뿐인데 학습 속도가 훨씬 빨라진 모습을 볼 수 있습니다. 이는 지금까지 계속 얘기했듯 Batch Normalization을 통해 Covariate Shift 현상이 완화되면서 나타난 효과라고 할 수 있습니다.
두 번째로 살펴봐야 할 부분은 BN-Baseline, BN-x5, BN-x30입니다.
x5, x30은 각각 Learning Rate를 5배, 30배 큰 값을 사용한 실험을 의미합니다. 이 세 개 그래프를 비교해 보면 Baseline보다 Learning Rate가 훨씬 큰 값일 때 학습 속도도 빠르고 성능도 더 좋은 모습을 알 수 있습니다. 앞서 모델의 깊이가 깊어지면서 학습이 불안정해졌고, 이를 해결하기 위한 방안중 하나로 작은 Learning Rate를 사용했다고 말씀드렸습니다. 하지만 Batch Normalization을 사용하면 깊은 네트워크에서도 큰 Learning Rate로 학습할 수 있고, 심지어 학습 속도도 더 빠르고 성능도 더 좋아진 것이죠.
이는 Sigmoid를 사용한 BN-x5-Sigmoid 곡선을 보면 이해할 수 있습니다. 기존에는 Sigmoid를 사용해서는 큰 Learning Rate로 학습할 수 없었습니다. 왜냐하면 앞서 얘기했듯 큰 Learning Rate에서는 연산 결괏값이 크게 튀어 Sigmoid의 입력값이 0에서 크게 벗어나게 되고, 그 결과 Sigmoid의 결괏값으로는 0과 1에 가까운 값들만 나오기 때문이죠. 하지만 Batch Normalization과 Sigmoid를 같이 사용하면 적절한 scale과 shift를 통해 이를 조절하여 원활하게 학습을 진행한다고 이해할 수 있습니다. 따라서 Batch Normalization을 사용하면 큰 Learning Rate로도 학습할 수 있게 되죠.
8. 의의
다음은 Batch Normalization 논문의 의의를 살펴보겠습니다.
첫 번째 의의는 학습 안정성을 향상시킬 수 있는 방법을 제안했다는 점입니다. Batch Normalization은 딥러닝 모델의 학습을 더 안정적으로 만듭니다. 각 레이어의 입력 분포가 변하는 문제, 일명 “Internal Covariate Shift”를 완화시켜 학습 속도를 높이고, 더 깊은 네트워크를 효과적으로 학습할 수 있게 해줍니다. 이로 인해 딥러닝 모델이 더 빠르게 수렴하고, 학습률을 크게 설정해도 안정적으로 학습할 수 있습니다.
두 번째 의의는 정규화 효과를 증명한 것입니다. Batch Normalization은 모델에 약간의 정규화 효과를 부여합니다. 이는 과적합을 방지하는 데 도움이 됩니다. 각 미니배치의 통계를 사용하여 정규화를 수행하기 때문에, 학습 데이터에 대한 모델의 의존성을 약화시키고 일반화 성능을 향상시킵니다.
이 두 가지 의의는 Batch Normalization이 단순히 성능 향상을 넘어, 딥러닝 모델의 학습 과정 자체를 더 효율적이고 안정적으로 만드는 중요한 기술적 발전이라고 할 수 있습니다.
9. 마치며
이 글을 통해, 여러분은 Batch Normalization의 전반적인 개념과 작동 원리, 그리고 이를 효과적으로 구현하고 적용하는 방법에 대해 깊이 있게 이해하게 되었을 것입니다. Covariate Shift의 문제로부터 시작하여, 이를 해결하기 위한 Batch Normalization의 핵심 아이디어와 이를 실제로 구현하고 적용하는 과정을 함께 살펴보았습니다. 이를 통해, 여러분은 이 기법이 딥러닝 모델의 학습을 어떻게 안정화시키고, 성능을 향상시키는지에 대한 실질적인 이해를 갖게 되었을 것입니다.
또한, 실험 결과를 통해 Batch Normalization의 실제 효과를 명확하게 확인할 수 있었으며, 이를 통해 이 기법의 중요성과 필요성을 더욱 확실하게 인지하게 되었을 것입니다. 이러한 이해는 여러분이 자신의 딥러닝 모델을 구축하고 최적화하는 데 큰 도움이 될 것입니다.
하지만, 모든 기법에는 장단점이 존재합니다. Batch Normalization 또한 완벽하지 않으며, 특정 상황에서는 다른 정규화 기법이 더 효과적일 수 있습니다. 따라서, 여러분은 이 글을 통해 배운 내용을 바탕으로, 자신의 문제와 모델에 가장 적합한 정규화 기법을 선택하고 적용할 수 있어야 합니다.
마지막으로, Batch Normalization은 여전히 활발히 연구되고 있는 분야입니다. 새로운 정규화 기법과 아이디어가 지속적으로 제안되고 있으며, 이러한 최신 연구 동향을 지켜보는 것도 여러분의 모델을 더욱 향상시키는 데 중요한 역할을 할 것입니다. 이 글이 여러분의 딥러닝 학습과 연구에 작은 도움이라도 되었다면 기쁠 것입니다. 여러분의 학습과 연구가 계속해서 발전하기를 바랍니다!