늦깎이 공대생의 인공지능 연구실

[용어정리]Synchronized Batch Normalization 본문

카테고리 없음

[용어정리]Synchronized Batch Normalization

Justin T. 2024. 2. 12. 23:43

  AI의 발전 속도가 참으로 빠르다는 것을 느끼다보니, 그 발전 흐름에 뒤쳐지지 않기 위해 지속적으로 트랜드를 따라고자 하는 것은 AI를 연구하는 사람으로서 하나의 사명이기도 합니다. 그러기에 한때는 최신 기술을 빠르게 받아들이는 것이 정도라고 생각했었으나, 최근에는 앞만 바라보다 정작 AI 기술에 대한 기초 상식을 소흘히 하지 않았나 하는 생각이 들기도 합니다.
 이번 포스팅에서는 멀티 GPU 학습시 적용되는 기술 중 하나인 Synchronized Batch Normalization에 대해 설명드리도록 하겠습니다. 먼저 Synchronized Batch Normalization의 토대라 할 수 있는 Batch와 Normalization부터 살펴보도록 하겠습니다.
 

1. Batch (배치)

 Batch란 우리가 일상에서 쓰는 말 중 하나인 배치 고사(査)가 아니라 집단이라는 의미의 영단어로서, AI가 1회의 학습(Iteration)을 수행시 한 번에 학습하는 데이터의 단위를 의미합니다. AI 학습 수행시 Batch Size를 16으로 설정하였을 경우, AI는 1회의 Iteration 수행시 16개의 데이터를 한 번에 학습한다고 이해하시면 되겠습니다.

https://www.slideshare.net/w0ong/ss-82372826

 

2. Normalization(정규화)

 Normalization이란 주어진 데이터를 표준 정규분표(Standard Normal Distribution) 그래프로 나타내는 것을 말합니다.
 우리들 주변에서 흔히 접할 수 있는 현상들은 대부분 정규분포에 가까운 데이터이다보니 거의 대부분의 데이터들을 정규분포로 표현할 수 있습니다. 아래의 그래프는 흔한 정규분포 그래프로서  X축을 기준으로 데이터의 평균을 나타내는 \(\mu\)와 데이터가 얼마나 흩어져 있는지를 나타내는 \(\sigma\)로 표현할 수 있습니다.

https://www.emathinstruction.com/

 
 인공지능으로 데이터를 학습할 때, 다양한 수치 데이터들을 학습하고, 학습된 모델을 토대로 데이터의 특성을 파악할 수 있습니다. 그러나 이러한 수치들이 모두 같은 모양의 분포를 이루지는 않습니다. 예를들어, 한 표본 집단에 속한 사람들의 특성을 알아내보고자 특성을 분석할 때, 해당 인물의 키, 몸무게, 수면시간 등을 활용하는 것이 합리적이라 할 수 있습니다. 그러나 각각의 데이터들은 모두 다른 단위가 다를 뿐 아니라, 데이터별 편차가 제각각 다르기 때문에, 해당 데이터들을 직접 학습시키게 되면 편차가 큰 특정값에 의한 쏠림 현상으로 확률이 결정되는 일이 발생하게 됩니다.
 이러한 현상을 해결하기 위해서는 각 데이터들의 분포를 일치시켜 편차를 최소화시켜야 합니다. 즉, 각 데이터 분포의 평균과 표준편차를 일치시킨다면, 특정 데이터값에 의한 쏠림 현상을 완화시킬 수 있는 것입니다. 
 

https://digital-play.tistory.com/84

 
 위의 그래프에서 보시는 바와 같이 데이터의 분포를 평균 0, 표준편차 1로 표준정규분포로 만들게 되면, 특성값 중 편차가 크거나 각 특성간 격차를 줄일 수 있습니다.

https://velog.io/@cbkyeong/

 
 위의 그림은 원본 데이터를 표준정규분포로 변환하였을 때의 모습입니다. 일부 데이터에서 표준치를 벗어나는 값이 존재하나, 거의 대부분의 데이터가 정규분포를 이루고 있어 각 특성값의 편차가 심각하게 차이나지 않아 특정값에 쏠리지 않은 데이터를 확보할 수 있습니다.
 

3. Batch Normalization(배치 정규화)

 Batch Normalization이란 말 그대로 AI가 학습하려 하는 Batch 크기의 데이터를 정규화 하는 과정이라고 보면 됩니다. Normalization에 대해 설명드린바와 같이 특정 데이터가 너무 크면 학습 결과가 왜곡되고, 너무 작으면 학습에 영향을 주지 않게 되기 때문에, 각각의 데이터들을 표준정규분포로 변환하여 학습을 진행하는 것입니다.
 
 Batch 단위로 입력받은 데이터는 Batch 단위에서 Normalization이 이루어지고, Batch Normalization이 적용된 데이터를 사용하면 모델의 학습 과정에서 Gradient Vanishing과 Gradient Exploding과 같이 학습이 왜곡되는 현상들을 줄일 수 있으며, 전체 최적화값을 찾지 못해 Local Optimum에 빠지는 경우를 줄일 수 있습니다.
 
 Batch Normalization은 아래와 같은 과정으로 계산되어집니다.

https://arxiv.org/pdf/1502.03167.pdf

 
 위의 식에서 \(\gamma\)와 \(\beta\)는 scale과 shift값으로서 Back Propagation 학습 과정에서 변경되는 변수입니다. 정규화된 데이터가 특정 파라미터만 학습되지 않도록 하기 위해 적용되며, Batch Normalization이 적용된 데이터가 좀 더 학습에 최적화 될 수 있게 해줍니다.
 
 AI 모델 학습시 Batch Normalization을 적용하였을 때 다음과 같은 장점이 있습니다.

  1. Batch Normalization을 사용하면 대규모 데이터를 효율적으로 학습할 수 있습니다.
  2. Batch Normalization은 평균 변화(Mean Shift) 현상을 제거합니다. ReLU 및 GeLU와 같은 활성화 함수는 대칭이 아니기 때문에 평균 활성화값이 0이 아닙니다. 이로 인해 평균 변화 현상이 발생합니다. 배치 정규화는 각 채널의 평균 활성화 값이 현재 배치 전체에서 0이 되도록 하여 평균 변화 현상을 제거합니다.
  3. Batch Normalization은 손실 환경(Loss Landscape)을 원활하게 만듭니다.

 

4. Synchronized Batch Normalization(동기화된 배치 정규화)

 Synchronized Batch Normalization(SyncBN)은 EncNet 논문(Hang Zhang, 2020)에서 자신들의 Semantic Segementation 모델 학습시 적용한 방법으로서, Batch Normalization 과정을 멀티 GPU 환경에서 좀 더 효율적으로 적용하여 연산 속도를 줄여 학습 속도를 향상시켰습니다.
 
 단일 GPU 환경에서 모델 학습시 Batch Normalization은 아래와 같은 과정으로 학습이 이루어집니다.

https://hangzhang.org/

 왼쪽 그림은 모델 학습시 forward 과정에서 Batch 단위의 데이터가 Normalization 과정에서 평균 \(\mu\)와 표준편차 \(\sigma\) 연산이 수행되는 것을 나타내며, 오른쪽 그림은 forward 단계에서 계산된 \(\mu\)와 \(\sigma\) 값을 기준으로 편미분 연산이 수행되어 Loss를 줄이는 과정으로서 모델의 최적값을 찾습니다.
 
 AI 모델이 여러대의 GPU에서 학습이 진행될 때, 각 GPU에 동일한 모델들이 복사되며, Batch에 할당된 입력 데이터가 GPU의 갯수만큼 나누어져 각 GPU에서 학습이 이루어집니다. 예를 들어, Batch Size가 16이고, GPU가 4개가 사용될 경우, 데이터가 4개로 나누어진 다음 각 GPU에 할당되어 학습이 진행됩니다. 아래의 그림은 각 GPU가 Batch로 입력된 데이터를 각각 나누어서 학습을 진행하는 것을 나타냅니다.

https://hangzhang.org/

 Batch Normalization이 각 GPU별로 수행되어 각 GPU별로 할당된 입력 데이터 x에 대한 평균 \(\mu\)와 표준편차 \(\sigma\)가 계산됩니다. 멀티 GPU 환경에서 이와 같은 방식으로 학습이 진행될 때 다음과 같은 단점이 있습니다.
 

  1. Batch Normalization은 미니배치에서 학습 데이터 간의 독립성을 깨뜨릴 수 있습니다. 특히 Mutil GPU 환경에서는 각 GPU별로 할당된 입력 데이터별로 배치정규화가 진행되어 이러한 경향이 더욱 부각됩니다.
  2. 분산 학습 과정에서 미묘한 구현 오류가 발생할 수 있습니다.
  3. 각 GPU별로 Batch Normalization 연산이 동일하게 수행되어 연산 수행 시간이 단일 GPU 사용 대비 시간 단축이 크지 않을수도 있습니다.
  4. 특히 Semantic Segmentation 모델 학습 과정에서 Dilated Convolution 연산 수행시 메모리를 상당히 많이 사용하게 되어 각 GPU에 할당되는 Batch 데이터 수가 Batch Normalization 레이어에 비해 너무 적을 수도 있습니다. 

 이러한 단점들을 극복하기 위해, EncNet 모델을 공개하였던 저자는 멀티 GPU 환경에서 효율적인 연산을 수행하는 동기화된 배치 정규화(SyncBN)을 적용하였습니다. SyncBN은 각 GPU에 할당되는 데이터들을 별도로 배치 정규화 연산을 하지 않고, 각 GPU별로 입력되는 Mini-Batch 데이터에 대해 \(x\)와 \(x^2\)를 계산한 다음 모든 값을 합하여 모든 GPU에 같은 값을 입력하여 분산 학습을 수행합니다. 이 과정에서 표준편차 계산 수행이 생략되어 연산 속도가 향상됩니다.
 
 SyncBN 과정에서 \(\sigma\)값이 생략되는 이유는 아래의 수식을 통해 증명할 수 있습니다. 먼저 배치 정규화 과정에서 \(\mu\)와 \(\sigma\)는 다음과 같이 구할 수 있습니다.
$$\mu=\frac{\sum_{i=1}^{N}x_i}{N}$$
$$\sigma^2=\frac{\sum_{i=1}^{N}(x_i-\mu)^2}{N} $$
여기서 표준편차 \(\sigma\)에 대해 좀 더 풀어보면
$$\begin{split}\sigma^2&=\frac{\sum_{i=1}^{N}(x_i-\mu)^2}{N} \\&=\frac{\sum_{i=1}^{N}(x_i^2-2x_i\mu+\mu^2)}{N} \end{split}$$
여기서 \(\mu\)를 상수로 보고 시그마 연산에서 빼내면
$$\sigma^2=\frac{\sum_{i=1}^{N}x_i^2-2\mu\sum_{i=1}^{N}x_i+N\mu^2}{N}$$
여기서 \(\mu=\frac{\sum_{i=1}^{N}x_i}{N}\)를 수식에 적용하면
$$\begin{split}\sigma^2&=\frac{\sum_{i=1}^{N}x_i^2}{N}-2\mu^2+u^2\\&=\frac{\sum_{i=1}^{N}x_i^2}{N}-u^2\\&=\frac{\sum_{i=1}^{N}x_i^2}{N}-\frac{(\sum_{i=1}^{N}x_i)^2}{N^2}\\\end{split}$$
여기서 \(N\)은 GPU의 갯수를, \(i\)는 각 GPU의 Index를 나타냅니다. 위의 수식을 통해 각 GPU에 할당되어 입력된 batch 데이터 \(x\)의 합과 \(x^2\)의 합을 구해 각 GPU에 할당되기 전 전체 Batch 데이터에 대한 Normalization값을 \(\sigma\)를 연산하지 않고도 학습을 진행할 수 있음을 확인할 수 있습니다.
 

https://hangzhang.org/

 
 
 
참고자료:
https://digital-play.tistory.com/84
https://serp.ai/synchronized-batch-normalization/
https://hangzhang.org/PyTorch-Encoding/tutorials/syncbn.html
 

반응형