그룹 정규화(Group Normalization)란? AI가 채널을 묶어 특징값을 맞추는 방법
TL;DR
그룹 정규화는 각 입력의 채널을 여러 그룹으로 나누고 그룹별 평균과 분산으로 값을 정규화하는 신경망 층입니다. 다른 샘플의 배치 통계를 섞지 않아 작은 배치에서도 계산 방식이 달라지지 않습니다. 채널 수는 그룹 수로 나누어떨어져야 하며 그룹 수, 채널 축, 엡실론과 프레임워크 기본값을 잘못 맞추면 실행 오류나 수치 차이가 생깁니다.
핵심 3줄 요약
- 핵심 1
채널을 그룹으로 나눕니다. 각 그룹 안의 채널과 공간 위치에서 평균과 분산을 따로 구합니다. - 핵심 2
배치 크기에 기대지 않습니다. 한 샘플씩 계산하므로 작은 배치와 학습·평가 모드에서도 같은 통계 원리를 씁니다. - 핵심 3
그룹 수가 계산 범위를 정합니다. 채널 수의 약수인지와 채널 축, 엡실론, 감마·베타 설정을 함께 확인해야 합니다.
이 글에서 다룰 내용
- 그룹 정규화의 한 문장 정의
- 8개 채널을 2개 그룹으로 나누는 쉬운 예시
- 채널 그룹·평균·분산·엡실론·감마·베타의 역할
- 배치·레이어·인스턴스 정규화와의 차이
- 작은 배치의 이미지 모델에서 쓰는 이유
- 프레임워크 구현과 ONNX 변환 전 확인할 항목
- AI 초보자가 자주 묻는 질문
그룹 정규화를 한 문장으로 정의하면 무엇인가요?
그룹 정규화(Group Normalization, GN)는 각 입력 사례의 채널을 여러 그룹으로 나누고, 그룹마다 평균과 분산을 계산해 활성값을 표준화한 뒤 학습 가능한 크기와 편향을 적용하는 신경망 층입니다.
Wu와 He의 원 논문은 채널을 그룹으로 나누고 각 그룹 안에서 정규화 통계를 계산하는 방법으로 GN을 제안했습니다. 통계 범위에 배치 축이 들어가지 않는다는 점이 핵심입니다. 같은 미니배치에 어떤 다른 이미지가 함께 들어왔는지가 한 이미지의 그룹 통계를 바꾸지 않습니다.
이미지 입력이 [배치, 채널, 높이, 너비] 모양이라면 한 샘플의 한 그룹에 속한 채널들과 그 채널의 공간 위치를 함께 모아 평균과 분산을 구합니다. 정규화한 값에는 보통 채널별 감마와 베타를 적용해 모델이 필요한 크기와 중심을 다시 학습합니다.
한 줄 정리: 그룹 정규화는 한 샘플의 채널을 몇 묶음으로 나눌지 정한 뒤 묶음별로 특징값의 눈금을 맞추는 층입니다.
쉬운 예시로 이해해 볼까요?
어떤 이미지 특징 맵에 채널이 8개 있고 그룹 수를 2로 정했다고 가정해 보겠습니다. 채널 수 8을 그룹 수 2로 나누면 한 그룹에는 채널 4개가 들어갑니다.
- 그룹 1: 채널 1·2·3·4와 각 채널의 모든 공간 위치
- 그룹 2: 채널 5·6·7·8과 각 채널의 모든 공간 위치
- 계산: 두 그룹이 서로 다른 평균과 분산으로 각각 표준화됨
그룹 1의 값이 전체적으로 크고 그룹 2의 값이 작더라도 두 묶음은 각자의 통계를 사용합니다. 각 값에서 해당 그룹의 평균을 빼고 분산에 엡실론을 더한 뒤 제곱근으로 나눕니다. 이렇게 하면 그룹마다 값의 중심은 0, 분산은 1에 가까워집니다.
표준화 뒤에는 채널별 감마를 곱하고 베타를 더합니다. 그래서 최종 출력이 항상 평균 0과 분산 1로 남는 것은 아닙니다. 모델은 감마와 베타를 학습해 특정 채널을 다시 강조하거나 중심을 옮길 수 있습니다.
쉬운 예시: 8명의 합창단을 4명씩 두 조로 나눠 조마다 음량 기준을 맞춘 뒤, 각 사람의 최종 음량은 다시 조절하는 과정과 비슷합니다.
왜 AI 모델에서 그룹 정규화가 중요한가요?
작은 배치에서도 통계가 흔들리지 않습니다
배치 정규화는 미니배치에서 같은 채널의 통계를 구하므로 배치가 작아지면 평균과 분산 추정이 불안정해질 수 있습니다. 그룹 정규화는 한 샘플 안에서 통계를 계산합니다. 메모리 때문에 한 번에 처리할 이미지 수가 적어져도 정규화의 계산 범위는 그대로 유지됩니다.
원 논문은 작은 배치로 학습한 ImageNet 분류와 객체 탐지·분할, 비디오 분류 실험에서 GN을 BN의 대안으로 평가했습니다. 이는 작은 배치에서 유용할 수 있다는 근거이지 모든 모델과 데이터에서 BN보다 항상 낫다는 보장은 아닙니다.
학습과 평가에서 현재 입력 통계를 씁니다
PyTorch GroupNorm 문서는 학습 모드와 평가 모드 모두 입력 데이터에서 계산한 통계를 사용한다고 명시합니다. 배치 정규화처럼 학습 중 누적한 이동 평균과 이동 분산을 평가 때 불러오는 구조가 아닙니다.
정규화 층만 보면 train과 eval 모드에서 통계 원리가 같습니다. 모델 전체의 출력은 드롭아웃이나 데이터 증강처럼 모드에 따라 동작이 바뀌는 다른 요소의 영향을 받을 수 있으므로 모델 모드 전환은 여전히 필요합니다.
채널 구조를 보존하며 중간 범위를 조절합니다
그룹 정규화는 입력의 모양을 바꾸지 않고 그룹별로 활성값의 중심과 척도를 맞춥니다. ONNX 문서도 출력 Y가 입력 X와 같은 모양이라고 정의합니다. 합성곱 블록처럼 채널 구조를 유지해야 하는 곳에 넣기 쉽습니다.
모양이 같다는 이유로 아무 위치에나 넣을 수 있는 것은 아닙니다. 이미 학습된 모델의 정규화 층을 바꾸면 통계 범위와 파라미터 의미가 달라집니다. 구조 변경 뒤에는 재학습이나 충분한 검증이 필요합니다.
그룹 정규화는 어떻게 작동하나요?
1. 채널 축과 그룹 수를 정합니다
먼저 입력 텐서에서 채널이 어느 축인지 확인합니다. PyTorch는 [N, C, 나머지 차원] 형태를 기준으로 num_channels와 num_groups를 받습니다. TensorFlow와 Keras는 axis로 채널 축을 지정하므로 channels_last와 channels_first를 구분해야 합니다.
채널 수는 그룹 수로 나누어떨어져야 합니다. 채널 30개를 그룹 8개로 똑같이 나눌 수는 없습니다. 그룹 수 1, 2, 3, 5, 6, 10, 15, 30처럼 채널 수의 약수 중에서 모델 설계와 실험에 맞는 값을 고릅니다.
2. 그룹마다 평균과 분산을 구합니다
각 샘플을 다른 샘플과 분리한 채 그룹 안의 채널과 공간 위치를 모아 평균과 분산을 계산합니다. 그룹 2개라면 한 샘플 안에 통계 묶음도 2개 생깁니다. 다음 샘플은 같은 과정을 별도로 수행합니다.
그룹 수가 바뀌면 한 통계에 묶이는 채널의 범위도 달라집니다. 같은 입력과 같은 감마·베타를 써도 그룹 수가 다르면 평균과 분산이 달라져 출력도 달라집니다.
3. 표준화하고 엡실론을 더합니다
각 값에서 그룹 평균을 빼고 그룹 분산에 작은 엡실론을 더한 뒤 제곱근으로 나눕니다. 엡실론은 분산이 0에 가깝거나 저정밀도 계산에서 값이 불안정해지는 문제를 줄입니다.
프레임워크 기본값은 같지 않을 수 있습니다. PyTorch 문서의 기본 eps는 1e-5이고 TensorFlow와 Keras 문서의 기본 epsilon은 0.001입니다. 모델을 옮길 때 층 이름만 맞추고 엡실론을 생략하면 수치 차이가 생길 수 있습니다.
4. 감마와 베타로 다시 조정합니다
표준화한 결과에는 보통 채널별 감마를 곱하고 베타를 더합니다. 감마 초기값은 1, 베타 초기값은 0인 구성이 흔합니다. 학습이 진행되면 모델이 채널별 출력 범위와 중심을 조정합니다.
PyTorch는 affine과 bias 옵션으로 학습 가능한 변환을 제어합니다. TensorFlow와 Keras는 scale과 center를 사용합니다. 옵션 이름과 기본값을 함께 기록해야 같은 동작을 재현하기 쉽습니다.
핵심 인사이트: 그룹 정규화의 결과를 좌우하는 설정은 그룹 수, 채널 축, 엡실론, 감마·베타 사용 여부입니다. 이름이 같아도 이 값이 다르면 같은 층이 아닙니다.
그룹 정규화와 헷갈리는 용어는 무엇이 다른가요?
배치 정규화와 그룹 정규화의 차이
배치 정규화는 보통 여러 샘플의 같은 채널에서 통계를 구합니다. 그룹 정규화는 한 샘플의 채널을 여러 묶음으로 나눠 통계를 구합니다. 전자는 배치 크기와 이동 통계가 중요하고 후자는 그룹 수와 채널 축이 중요합니다.
둘 다 평균과 분산, 감마와 베타를 쓰더라도 서로 같은 층은 아닙니다. 기존 BatchNorm 가중치를 GroupNorm에 그대로 복사한다고 계산 범위와 학습된 통계까지 보존되지는 않습니다.
레이어 정규화와 그룹 정규화의 차이
레이어 정규화는 한 샘플의 지정된 특징 축을 하나의 통계 범위로 묶는 방식이 일반적입니다. 그룹 정규화는 채널을 여러 그룹으로 나눈다는 설정이 더해집니다. 그룹 수가 1이면 계산 통계는 레이어 정규화와 같거나 매우 가까워집니다.
구현별 감마와 베타의 축이 달라 정확한 동치 여부에는 주의가 필요합니다. Keras 문서는 그룹 수 1이 레이어 정규화와 거의 같다고 설명하고, PyTorch는 GroupNorm의 한 그룹 예시를 LayerNorm과 동등한 경우로 안내합니다.
인스턴스 정규화와 그룹 정규화의 차이
인스턴스 정규화는 이미지에서 샘플별·채널별로 공간 위치의 통계를 구합니다. 그룹 정규화에서 그룹 수를 채널 수와 같게 두면 각 그룹에 채널 하나가 들어가 인스턴스 정규화와 같은 범위가 됩니다. ONNX와 PyTorch 문서도 이 관계를 명시합니다.
RMSNorm과 그룹 정규화의 차이
RMSNorm은 제곱평균제곱근으로 크기를 조정하며 일반적인 레이어 정규화처럼 평균을 빼는 중심화 단계를 생략합니다. 그룹 정규화는 채널 그룹마다 평균과 분산을 구합니다. 둘은 계산식과 통계 범위가 모두 다릅니다.
정규화와 정규화 규제의 차이
Group Normalization의 normalization은 활성값의 중심과 척도를 조정하는 연산입니다. 과적합을 줄이려고 손실에 벌점을 넣거나 가중치를 제한하는 regularization과는 다른 개념입니다. 한국어 이름만 보고 같은 정규화로 묶지 않아야 합니다.
비교 정리: 배치 정규화는 샘플 묶음, 레이어 정규화는 한 샘플의 지정된 특징, 그룹 정규화는 한 샘플의 채널 그룹, 인스턴스 정규화는 한 샘플의 채널별 공간 위치에서 통계를 구합니다.
실전에서는 어디에 쓰이나요?
작은 배치의 이미지 분류
고해상도 이미지나 큰 모델 때문에 GPU 한 장에 소수의 이미지만 넣을 수 있을 때 배치 통계에 기대지 않는 GN을 검토합니다. 원 논문은 작은 배치의 ResNet-50 학습에서 BN보다 안정적인 결과를 보고했습니다. 실제 적용에서는 학습률과 데이터 처리 조건도 함께 맞춰 비교해야 합니다.
객체 탐지와 이미지 분할
객체 탐지와 분할은 큰 입력과 복잡한 헤드 때문에 배치 크기가 작아지기 쉽습니다. 원 논문은 COCO의 Mask R-CNN 계열 실험에서 사전 학습부터 파인튜닝까지 GN을 적용한 결과를 제시했습니다. 현재 모델에 넣을 때는 백본과 헤드의 정규화 구성을 따로 확인합니다.
비디오 모델과 메모리 제약 학습
여러 프레임을 함께 처리하는 비디오 모델은 한 샘플이 차지하는 메모리가 큽니다. 원 논문은 Kinetics 비디오 분류에서도 GN을 평가했습니다. 다만 입력 모양이 5차원이라면 프레임·높이·너비 중 어떤 차원이 그룹 통계에 들어가는지 구현 문서를 확인해야 합니다.
모델 교환과 추론 엔진
ONNX는 GroupNormalization 연산자를 정의합니다. 모델을 내보낼 때 사용 중인 opset과 추론 엔진이 해당 연산자를 지원하는지, 그룹 수와 채널별 scale·bias가 보존됐는지 확인합니다. 지원하지 않으면 변환기가 여러 기본 연산으로 풀어 쓸 수도 있으므로 변환 전후 출력을 비교합니다.
실전 팁: 모델 설정에서 GroupNorm이라는 이름만 찾지 말고 입력 모양, 채널 수, 그룹 수, 엡실론과 affine 파라미터를 한 묶음으로 기록하세요.
그룹 정규화를 적용할 때 어떤 순서로 확인하나요?
1. 입력 텐서의 차원 이름을 적습니다
입력이 [배치, 채널, 높이, 너비]인지 [배치, 높이, 너비, 채널]인지 먼저 적습니다. 차원 순서를 모른 채 axis를 복사하면 공간 축을 채널로 잘못 지정할 수 있습니다.
2. 채널 수와 그룹 수를 맞춥니다
채널 수를 그룹 수로 나눈 나머지가 0인지 확인합니다. 네트워크의 단계마다 채널 수가 바뀐다면 같은 그룹 수를 모든 블록에 그대로 적용할 수 있는지도 살펴봅니다.
3. 엡실론과 affine 설정을 고정합니다
원래 모델의 epsilon, scale·center 또는 affine·bias 값을 기록합니다. 프레임워크 기본값에 기대면 재구현과 모델 변환에서 설정이 달라질 수 있습니다.
4. 학습과 평가 출력을 비교합니다
같은 입력과 같은 파라미터로 GroupNorm 층만 실행해 train과 eval 결과를 비교합니다. PyTorch 구현이라면 현재 입력 통계를 두 모드에서 모두 사용하므로 차이가 난 원인을 주변 층과 정밀도 설정에서 분리해 찾습니다.
5. 변환 전후 수치 차이를 검사합니다
작은 고정 입력을 만들어 원본 프레임워크와 추론 엔진의 중간 출력과 최종 출력을 비교합니다. ONNX opset, 채널 축, 그룹 수, 엡실론, scale과 bias 모양을 확인하면 차이의 원인을 좁히기 쉽습니다.
한 줄 정리: 입력 모양을 적고 채널과 그룹의 나눗셈을 확인한 뒤 엡실론·파라미터를 고정하고 같은 입력으로 변환 전후 출력을 비교합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 그룹 수 32를 무조건 복사하지 않습니다. 여러 문서의 기본값이 32여도 채널 수가 32로 나누어떨어지지 않거나 현재 모델에 맞지 않을 수 있습니다. 그룹 수는 채널 구조와 검증 결과로 정합니다.
둘째, 채널 축을 확인합니다. PyTorch의 channels_first 예시와 TensorFlow의 channels_last 기본 구성을 그대로 섞으면 다른 차원에서 정규화할 수 있습니다. transpose와 모델 변환 뒤에는 축 순서를 다시 봅니다.
셋째, 작은 배치에서 항상 더 좋다고 단정하지 않습니다. GN은 배치 통계 문제를 피하지만 모델 구조, 학습률, 데이터와 다른 정규화의 장점까지 없애지는 않습니다. 같은 평가 조건에서 BN과 비교합니다.
넷째, 그룹 수 1과 채널 수만큼의 그룹을 같은 설정으로 보지 않습니다. 전자는 레이어 정규화에 가까워지고 후자는 인스턴스 정규화와 같은 범위가 됩니다. 두 극단 사이에서 통계에 묶이는 채널 수가 달라집니다.
다섯째, ONNX 연산자 버전을 확인합니다. ONNX 문서의 GroupNormalization 21은 채널별 scale과 bias를 사용하며 이전 버전 18과 정의 세부가 다릅니다. 내보내기와 실행 환경의 opset 지원을 맞춥니다.
주의: 모양이 맞아 실행됐다는 사실만으로 정규화가 올바르다고 볼 수 없습니다. 의도한 채널 축과 그룹에서 평균과 분산을 구했는지 작은 입력으로 직접 확인해야 합니다.
자주 묻는 질문
Q1. 그룹 정규화와 배치 정규화는 무엇이 가장 다른가요?
통계를 구하는 범위가 가장 다릅니다. 배치 정규화는 여러 샘플의 같은 채널을 모으고 그룹 정규화는 한 샘플의 채널을 여러 그룹으로 나눕니다. 그래서 GN 계산은 미니배치 크기에 직접 기대지 않습니다.
Q2. 그룹 수는 많을수록 좋은가요?
아닙니다. 그룹 수가 늘면 한 그룹에 들어가는 채널 수가 줄고 통계 범위가 달라집니다. 채널 수의 약수라는 조건을 지키면서 모델과 데이터에 맞는 값을 검증해야 합니다.
Q3. 그룹 수를 1로 두면 LayerNorm과 완전히 같나요?
통계를 구하는 범위는 레이어 정규화와 같거나 매우 가까워집니다. 다만 프레임워크마다 감마와 베타가 적용되는 축이 달라 정확히 같은 결과가 아닐 수 있으므로 구현 문서를 확인합니다.
Q4. 그룹 수를 채널 수와 같게 두면 무엇이 되나요?
각 그룹에 채널 하나만 들어가므로 인스턴스 정규화와 같은 통계 범위가 됩니다. PyTorch, TensorFlow, Keras와 ONNX 문서가 이 관계를 안내합니다.
Q5. GroupNorm은 추론 때 저장된 평균과 분산을 쓰나요?
PyTorch GroupNorm은 학습과 평가 모두 현재 입력에서 통계를 계산합니다. BatchNorm의 running mean과 running variance를 옮겨 쓰는 방식이 아닙니다.
Q6. 프레임워크를 바꾸면 같은 결과가 나오나요?
그룹 수, 채널 축, 엡실론, 분산 계산 방식, 감마·베타 옵션과 데이터 형식을 같게 맞춰야 합니다. 기본값과 연산자 버전이 다를 수 있으므로 같은 고정 입력으로 허용 오차 안의 결과인지 확인합니다.
출처
마무리
그룹 정규화는 한 입력의 채널을 여러 그룹으로 나누고 그룹별 평균과 분산으로 활성값을 표준화한 뒤 감마와 베타로 필요한 표현 범위를 다시 학습하는 층입니다. 배치 통계나 이동 평균에 기대지 않아 작은 배치에서도 같은 계산 원리를 유지합니다.
초보자라면 세 가지만 기억하면 충분합니다. 채널 수는 그룹 수로 나누어떨어져야 하고 채널 축을 정확히 지정해야 하며 프레임워크마다 엡실론과 옵션 기본값이 다를 수 있습니다. 이 기준을 확인하면 BatchNorm·LayerNorm·InstanceNorm과 구분하고 모델 설정과 변환 결과를 더 정확히 읽을 수 있습니다.
