인스턴스 정규화(Instance Normalization)란? AI가 이미지마다 채널 통계를 맞추는 방법
TL;DR
인스턴스 정규화는 이미지 한 장마다 각 채널의 공간 위치에서 평균과 분산을 구해 특징값을 조정하는 신경망 층입니다. 배치의 다른 이미지를 통계에 섞지 않으며 스타일 변환 같은 이미지 생성 작업에서 널리 알려졌습니다. 구현할 때는 입력 축, 엡실론, 감마·베타, 실행 모드의 통계와 모델 변환 결과를 함께 확인해야 합니다.
핵심 3줄 요약
- 핵심 1
이미지마다 따로 계산합니다. 같은 미니배치의 다른 이미지가 평균과 분산에 영향을 주지 않습니다. - 핵심 2
채널별 공간 값을 맞춥니다. 이미지의 각 채널에서 높이와 너비 위치를 한 묶음으로 정규화합니다. - 핵심 3
기본 설정을 확인해야 합니다. affine·running statistics·엡실론 설정이 다르면 같은 이름의 층도 출력이 달라집니다.
이 글에서 다룰 내용
- 인스턴스 정규화의 한 문장 정의
- 두 이미지와 두 채널로 보는 쉬운 예시
- 평균·분산·엡실론·감마·베타의 역할
- 배치·레이어·그룹·적응형 인스턴스 정규화와의 차이
- 스타일 변환과 이미지 생성에서 쓰이는 이유
- PyTorch와 ONNX 모델 변환 전 확인할 항목
- AI 초보자가 자주 묻는 질문
인스턴스 정규화를 한 문장으로 정의하면 무엇인가요?
인스턴스 정규화(Instance Normalization)는 미니배치의 각 입력 사례와 각 채널을 따로 놓고 공간 위치의 평균과 분산으로 특징값을 정규화하는 신경망 층입니다.
이미지 텐서가 N, C, H, W 순서라면 N은 이미지 수, C는 채널 수, H와 W는 높이와 너비입니다. 인스턴스 정규화는 특정 이미지의 특정 채널에 속한 H×W 값을 모아 평균과 분산을 계산합니다. 다른 이미지나 다른 채널의 값은 그 통계에 들어가지 않습니다.
ONNX 표준 연산자도 평균과 분산을 인스턴스별·채널별로 계산한다고 정의합니다. 정규화한 값에는 채널별 scale을 곱하고 bias를 더하며 출력 모양은 입력과 같습니다.
한 줄 정리: 인스턴스 정규화는 한 이미지의 한 채널 안에서 공간 특징의 중심과 척도를 맞추는 층입니다.
쉬운 예시로 이해해 볼까요?
흑백값이 아니라 두 개의 특징 채널을 가진 이미지 A와 이미지 B가 한 배치에 들어왔다고 가정해 보겠습니다. 이미지 A의 첫 채널은 밝고 이미지 B의 첫 채널은 어두워도 두 이미지는 서로 다른 평균과 분산을 사용합니다.
- 이미지 A, 채널 1: A의 높이×너비 위치만 모아 평균과 분산 계산
- 이미지 A, 채널 2: A의 두 번째 채널 위치만 따로 계산
- 이미지 B, 채널 1: B의 첫 채널 위치만 따로 계산
- 이미지 B, 채널 2: B의 두 번째 채널 위치만 따로 계산
예를 들어 이미지 A의 한 채널 값이 2, 4, 6, 8이면 평균은 5입니다. 각 값에서 5를 빼고 해당 네 값의 분산과 엡실론으로 만든 표준편차로 나눕니다. 이렇게 하면 그 채널의 위치값은 평균 0 부근, 일정한 척도로 조정됩니다.
이미지 B의 같은 채널 값이 20, 40, 60, 80이어도 A와 섞어 평균 27.5를 구하지 않습니다. B는 B의 평균 50과 분산을 씁니다. 사례별 대비나 밝기 통계가 다른 상황에서 배치 구성이 정규화 통계를 바꾸지 않는 이유입니다.
쉬운 예시: 여러 사진의 밝기를 한꺼번에 평균 내기보다 사진마다 색상 채널의 밝기와 대비를 따로 맞추는 과정에 가깝습니다.
왜 AI 모델에서 인스턴스 정규화가 중요한가요?
배치의 다른 이미지에 기대지 않습니다
배치 정규화는 여러 사례에서 얻은 채널 통계를 함께 사용합니다. 인스턴스 정규화는 각 사례를 분리하므로 같은 이미지가 어떤 다른 이미지와 묶였는지에 따라 현재 통계가 달라지는 문제를 피합니다.
그렇다고 배치 크기와 완전히 무관한 모델이 되는 것은 아닙니다. 옵티마이저의 기울기 추정, 메모리 사용량과 다른 층은 여전히 배치 크기의 영향을 받습니다. 정규화 통계를 계산하는 범위만 배치의 다른 사례와 분리됩니다.
스타일 변환에서 알려진 층입니다
Ulyanov 연구진의 원 논문은 빠른 스타일 변환 구조에서 배치 정규화를 인스턴스 정규화로 바꾸고 학습과 테스트에 모두 적용했습니다. 논문은 이 작은 구조 변경으로 생성 이미지의 질이 눈에 띄게 나아졌다고 보고했습니다.
여기서 스타일은 색감, 질감, 대비 같은 시각적 통계와 관련됩니다. 인스턴스별 채널 통계를 정규화하면 입력 이미지마다 다른 대비 정보의 영향을 줄여 변환 네트워크가 목표 스타일을 적용하기 쉬워질 수 있습니다. 모든 이미지 작업에서 품질이 자동으로 좋아진다는 뜻은 아닙니다.
학습과 평가의 통계 동작을 단순하게 둘 수 있습니다
PyTorch InstanceNorm2d는 기본적으로 학습과 평가 모두 현재 입력의 인스턴스 통계를 사용합니다. 배치 정규화처럼 학습 중 쌓은 이동 평균과 이동 분산을 평가 때 반드시 사용하지 않습니다.
다만 PyTorch에서 track_running_stats를 켜면 학습 중 이동 통계를 저장하고 평가에서 사용할 수 있습니다. 이름만 보고 항상 현재 입력 통계를 쓴다고 단정하지 말고 실제 설정과 저장된 버퍼를 확인해야 합니다.
인스턴스 정규화는 어떻게 작동하나요?
1. 사례와 채널을 분리합니다
먼저 입력 텐서의 배치 축과 채널 축을 확인합니다. NCHW 입력에서는 이미지 n과 채널 c의 조합 하나를 고르고 그 안의 H×W 위치를 정규화 묶음으로 삼습니다. NHWC를 쓰는 환경이라면 채널 축 위치를 설정과 맞춰야 합니다.
2. 공간 위치의 평균과 분산을 구합니다
선택한 이미지와 채널의 모든 공간 위치에서 평균을 구하고 각 값이 평균에서 얼마나 떨어졌는지로 분산을 계산합니다. PyTorch 문서는 InstanceNorm2d의 표준편차 계산에 biased estimator, 곧 correction=0과 같은 분산 추정치를 사용한다고 안내합니다.
공간 크기가 1×1이라면 통계를 낼 값이 하나뿐입니다. 분산이 0이 되고 정규화 결과가 정보 없는 값으로 줄어들 수 있으므로 매우 작은 특징 맵에 적용할 때는 구조를 따로 살펴야 합니다.
3. 엡실론을 더해 나눕니다
각 값에서 평균을 뺀 뒤 분산에 작은 엡실론을 더하고 제곱근을 구한 값으로 나눕니다. 엡실론은 분산이 0이거나 매우 작을 때 0으로 나누는 문제와 수치 불안정을 줄입니다.
PyTorch InstanceNorm2d와 ONNX InstanceNormalization의 기본 엡실론은 1e-5입니다. 그러나 다른 라이브러리나 사용자 정의 구현이 같은 기본값을 쓴다고 가정하면 안 됩니다. 모델을 옮길 때는 값을 명시적으로 맞춥니다.
4. 감마와 베타로 다시 조정합니다
정규화한 결과에는 보통 채널별 감마 또는 scale을 곱하고 베타 또는 bias를 더할 수 있습니다. ONNX 연산자는 크기 C의 scale과 B 입력을 요구합니다. PyTorch는 affine=True일 때 학습 가능한 채널별 파라미터를 둡니다.
PyTorch InstanceNorm2d의 affine 기본값은 False입니다. 이미 학습한 모델의 파라미터 키가 없다고 곧바로 손상된 체크포인트로 판단하면 안 됩니다. 원래 층이 affine을 사용했는지 먼저 확인합니다.
핵심 인사이트: 같은 InstanceNorm이라도 통계 축, 분산 계산, 엡실론, affine과 running statistics 설정이 맞아야 같은 출력을 재현합니다.
인스턴스 정규화와 헷갈리는 용어는 무엇이 다른가요?
배치 정규화와 인스턴스 정규화의 차이
배치 정규화는 보통 배치의 여러 이미지와 공간 위치를 함께 보고 채널별 통계를 구합니다. 인스턴스 정규화는 이미지별·채널별로 공간 위치만 봅니다. 배치 정규화는 이동 통계를 평가에 사용하는 구성이 일반적이지만 인스턴스 정규화는 현재 입력 통계를 쓰는 구성이 흔합니다.
레이어 정규화와 인스턴스 정규화의 차이
레이어 정규화는 한 사례 안에서 설정한 특징 차원들을 묶어 평균과 분산을 계산합니다. 이미지에서 채널과 공간 축을 함께 묶을 수도 있습니다. 인스턴스 정규화는 보통 채널을 서로 분리하고 각 채널의 공간 위치를 정규화합니다.
그룹 정규화와 인스턴스 정규화의 차이
그룹 정규화는 한 사례의 채널을 여러 그룹으로 나누고 그룹마다 채널과 공간 위치의 통계를 구합니다. 그룹 수를 채널 수와 같게 두면 그룹마다 채널 하나가 들어가 인스턴스 정규화와 같은 통계 범위가 됩니다. Keras 문서는 groups=-1로 이 관계를 구현할 수 있다고 설명합니다.
두 연산이 수학적으로 같은 범위를 쓰더라도 라이브러리의 파라미터 모양, 기본 엡실론과 축 처리 방식이 다를 수 있습니다. GroupNorm 층 이름을 InstanceNorm으로 바꾸는 것만으로 변환이 끝나지는 않습니다.
적응형 인스턴스 정규화와의 차이
적응형 인스턴스 정규화(Adaptive Instance Normalization, AdaIN)는 콘텐츠 특징을 정규화한 뒤 다른 스타일 특징에서 얻은 평균과 표준편차를 목표값으로 사용합니다. 일반 인스턴스 정규화의 학습 가능한 고정 감마·베타와 달리 스타일 입력에 따라 조정값이 바뀌는 방식입니다.
이미지 전처리 정규화와의 차이
이미지 전처리는 입력 픽셀에 데이터셋 평균과 표준편차를 적용하거나 값을 0과 1 사이로 바꾸는 과정입니다. 인스턴스 정규화는 신경망 안의 특징 맵에서 사례별·채널별 통계를 계산하는 층입니다. 적용 위치와 통계의 출처가 다릅니다.
비교 정리: 배치 정규화는 여러 사례, 레이어 정규화는 지정된 특징 묶음, 그룹 정규화는 채널 그룹, 인스턴스 정규화는 한 사례의 채널별 공간 위치에서 통계를 구합니다.
실전에서는 어디에 쓰이나요?
빠른 이미지 스타일 변환
인스턴스 정규화는 한 입력 이미지의 채널별 통계를 조정해 목표 화풍을 입히는 빠른 스타일 변환 네트워크에서 널리 알려졌습니다. 원 논문은 학습과 테스트 모두에 이 층을 적용한 구조를 다뤘습니다.
이미지 생성과 변환 모델
텍스처 생성, 이미지 간 변환과 일부 생성 모델에서 사례별 시각 통계를 다룰 때 사용합니다. 다만 내용 보존에 필요한 대비 정보까지 줄일 수 있으므로 작업과 모델 구조에 따라 LayerNorm, GroupNorm 또는 다른 정규화를 선택합니다.
PyTorch 모델 구현
PyTorch는 1차원·2차원·3차원 입력용 InstanceNorm 모듈을 제공합니다. 이미지 특징 맵에는 InstanceNorm2d를 주로 사용하며 num_features, eps, affine과 track_running_stats를 설정합니다.
ONNX 모델 교환
ONNX는 InstanceNormalization을 공통 연산자로 정의합니다. 입력과 출력 모양은 같고 채널 크기의 scale과 bias를 받습니다. 내보낸 그래프가 하나의 연산자로 남았는지, 여러 기본 연산으로 풀렸는지와 실행 엔진의 연산자 버전 지원을 확인합니다.
실전 팁: 모델 설정에서 InstanceNorm을 찾았다면 입력 레이아웃, 채널 수, eps, affine, track_running_stats와 ONNX scale·bias 모양을 한 묶음으로 기록하세요.
인스턴스 정규화를 적용할 때 어떤 순서로 확인하나요?
1. 입력 텐서의 축을 적습니다
입력이 NCHW인지 NHWC인지 확인하고 배치·채널·공간 축을 표시합니다. 한 통계 묶음에 정확히 어느 값이 들어가는지 작은 텐서로 적어 보면 축 오류를 빨리 찾을 수 있습니다.
2. 층 설정과 체크포인트를 맞춥니다
eps, affine, track_running_stats 값을 기록하고 감마·베타 파라미터와 running mean·variance 버퍼가 있는지 확인합니다. 원래 모델에 없는 파라미터를 임의로 만들거나 저장된 버퍼를 무시하지 않습니다.
3. 학습과 평가 모드를 비교합니다
같은 고정 입력을 train 모드와 eval 모드에 넣어 출력을 비교합니다. running statistics를 쓰지 않는 기본 설정에서는 현재 입력 통계를 사용하지만 설정이 켜져 있으면 평가 출력이 저장된 통계의 영향을 받습니다.
4. 프레임워크와 ONNX 설정을 대조합니다
원본 층의 채널별 감마·베타를 ONNX의 scale과 B에 정확히 연결합니다. 엡실론과 입력 레이아웃도 맞추고 변환기가 축 이동 연산을 추가했는지 그래프에서 확인합니다.
5. 경계 입력으로 수치를 검사합니다
모든 값이 같은 채널, 분산이 매우 작은 채널, 큰 값과 작은 값이 섞인 채널을 시험합니다. 원본과 변환 모델의 중간 출력과 최종 출력을 허용 오차 안에서 비교합니다.
한 줄 정리: 축과 설정을 고정하고 학습·평가 모드를 확인한 뒤 같은 입력으로 원본과 변환 결과를 비교합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 인스턴스 정규화를 배치 정규화의 설정 하나로 보지 않습니다. 통계를 모으는 축과 실행 모드의 기본 동작이 다릅니다. 학습한 층을 이름만 바꿔 교체하면 기존 성능이 유지된다고 볼 수 없습니다.
둘째, 입력 레이아웃을 추측하지 않습니다. 채널 축을 공간 축으로 잘못 지정하면 전혀 다른 값들이 한 묶음으로 정규화됩니다. 모델 코드와 실제 텐서 모양을 함께 확인합니다.
셋째, affine과 running statistics 기본값을 확인합니다. PyTorch InstanceNorm2d는 affine과 track_running_stats가 모두 기본적으로 False입니다. 다른 구현과 체크포인트가 같은 설정이라고 가정하지 않습니다.
넷째, 작은 공간 크기를 따로 시험합니다. 특징 맵이 1×1에 가까워지면 분산을 계산할 값이 부족하고 정보가 크게 줄 수 있습니다. 층의 위치와 입력 크기를 확인합니다.
다섯째, 스타일 변환의 성공을 다른 작업에 일반화하지 않습니다. 인스턴스별 대비 통계를 줄이는 성질은 어떤 작업에는 유용하지만 분류나 복원처럼 그 정보가 필요한 작업에는 손해가 될 수 있습니다. 동일한 데이터와 평가 지표로 비교합니다.
주의: 모델이 오류 없이 실행됐다는 사실만으로 인스턴스 정규화가 원래 구현과 같다고 볼 수 없습니다. 축·설정·모드와 고정 입력 출력을 함께 검증해야 합니다.
자주 묻는 질문
Q1. 인스턴스는 이미지 한 장을 뜻하나요?
이미지 모델의 일반적인 NCHW 입력에서는 배치 안의 이미지 한 장이 한 인스턴스입니다. 1차원 신호나 3차원 볼륨에서도 배치의 각 사례를 인스턴스로 보고 해당 공간 차원에서 통계를 계산합니다.
Q2. 인스턴스 정규화는 채널을 서로 섞나요?
보통 섞지 않습니다. 한 이미지의 채널마다 공간 위치의 평균과 분산을 따로 구합니다. 채널을 묶고 싶다면 그룹 정규화처럼 통계 범위가 다른 층을 검토합니다.
Q3. 배치 크기가 바뀌면 같은 이미지의 통계도 바뀌나요?
같은 이미지와 같은 특징값이라면 다른 이미지가 배치에 추가됐다는 이유만으로 그 이미지의 현재 인스턴스 통계가 바뀌지는 않습니다. 다만 학습 전체 과정은 배치 크기에 따른 기울기와 메모리 영향을 받을 수 있습니다.
Q4. GroupNorm의 그룹 수를 채널 수로 두면 같은가요?
통계를 계산하는 범위는 인스턴스 정규화와 같아집니다. Keras는 groups=-1을 이 관계로 안내합니다. 정확한 출력 동치에는 엡실론, 감마·베타 모양, 축과 분산 계산 설정까지 맞아야 합니다.
Q5. 학습과 추론에서 항상 같은 통계를 쓰나요?
PyTorch 기본 설정은 두 모드 모두 현재 입력의 인스턴스 통계를 씁니다. track_running_stats=True로 설정하면 학습 중 이동 통계를 저장하고 평가에서 사용할 수 있으므로 실제 층 설정을 확인합니다.
Q6. 인스턴스 정규화와 AdaIN은 같은가요?
같지 않습니다. 일반 인스턴스 정규화는 현재 특징을 정규화하고 고정된 학습 파라미터를 적용할 수 있습니다. AdaIN은 다른 스타일 특징의 평균과 표준편차를 목표 통계로 사용해 입력 스타일에 따라 결과를 조절합니다.
출처
마무리
인스턴스 정규화는 배치 안의 각 사례와 각 채널을 분리하고 공간 위치의 평균과 분산으로 특징값을 조정하는 층입니다. 배치 통계에 기대지 않으며 빠른 이미지 스타일 변환 연구에서 널리 알려졌습니다.
초보자라면 세 가지만 기억하면 충분합니다. 이미지마다 따로 계산하고, 채널마다 공간 위치를 묶으며, 축·엡실론·affine·running statistics가 결과를 좌우합니다. 이 기준을 확인하면 BatchNorm·LayerNorm·GroupNorm과 구분하고 PyTorch 모델을 ONNX로 옮길 때 생기는 차이도 더 정확히 찾을 수 있습니다.
