오늘 끝나면
정규화
- ✓정규화의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 정규화이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
Dropout·BatchNorm·초기화 — 딥러닝이 드디어 ‘잘 되기’ 시작한 이유 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
AI · Day 4 / 지도학습 · 생성 DL
정규화
손실도 옵티마이저도 골랐는데 학습이 안 됨. 범인은 대개 숫자의 스케일임. 자릿수만 맞춰도 풀림.
자릿수가 다르면 학습이 흔들린다
집값 예측 예시. 입력은 방 개수(2~5)와 면적(50~200)임. 한쪽은 한 자리, 한쪽은 세 자리임.
그럼 손실 지형이 길쭉한 골짜기로 찌그러짐. 한 방향은 가파르고 한 방향은 완만함. 경사하강이 벽을 지그재그로 튕기며 내려감. 학습률 조금만 키워도 발산함.
왜 그럼? 가중치 갱신량이 입력 크기에 비례해서임. 자릿수를 맞추면 지형이 둥근 그릇에 가까워짐. 같은 학습률로도 곧장 바닥으로 감.
평균 0, 분산 1로 줄 세우기
가장 기본은 표준화(standardization)임. 각 특징에서 평균 빼고 표준편차로 나눔.
수식은 한 줄임. z = (x − μ) / σ. 그럼 모든 특징이 평균 0, 분산 1이라는 같은 운동장에 섬. 면적이든 방 개수든 같은 자로 잰 값이 됨.
한 가지 함정
μ와 σ는 반드시 학습 데이터로만 구해야 함.
테스트 통계까지 끌어다 쓰면 미래 정보가 새는 데이터 누수가 됨. 학습에서 구한 값을 테스트에 그대로 적용하면 됨.
치우치고 길쭉한 분포를 원점 둘레로 다시 세움
이제 층 안쪽까지 정규화한다
입력만 맞추면 끝? 아님. 깊은 망에서는 중간 층 분포가 학습 중에 계속 출렁임. 앞 층이 바뀌면 뒤 층이 보는 입력 분포도 바뀜.
그래서 2015년 배치 정규화(BatchNorm)가 나옴. 층 출력을 미니배치 단위로 표준화함. 그다음 학습 가능한 γ(스케일)와 β(이동)로 다시 풀어줌. 정규화하되 표현력은 안 잃음.
효과 큼. 큰 학습률 써도 안정적임. 수렴 빨라짐. 약한 규제 효과까지 따라옴. 오른쪽이 핵심 4줄임.
mu = x.mean(axis=0) # 배치 평균 var = x.var(axis=0) # 배치 분산 x_hat = (x - mu) / sqrt(var + eps) y = gamma * x_hat + beta # 다시 스케일·이동
정규화하되 γ·β로 표현력은 되돌려 줌
배치냐, 층이냐 — 상황이 답을 정한다
정규화는 종류 많음. 핵심은 무엇을 기준으로 평균을 내느냐임.
BatchNorm은 배치 축으로 평균을 냄. 배치 작으면 통계가 흔들려 불안정함.
LayerNorm은 한 샘플 안 특징들로 평균을 냄. 배치 크기와 무관함. 그래서 시퀀스 길이가 제각각인 트랜스포머는 LayerNorm을 씀.
실무 감각
- 이미지 CNN, 배치 충분 → BatchNorm
- 트랜스포머·RNN, 배치 1~수개 → LayerNorm
- 스타일 변환·생성 → InstanceNorm 계열
| 기법 | 평균 기준 | 주 용도 |
|---|---|---|
| BatchNorm | 배치 축 | CNN |
| LayerNorm | 특징 축 | 트랜스포머 |
| InstanceNorm | 채널별 | 생성·스타일 |
| GroupNorm | 그룹별 | 작은 배치 |
배치 크기에 의존해서 BatchNorm은 불안정해짐
작은 줄 세우기가 만드는 큰 차이
현장에서 “모델은 좋은데 학습이 안 돼요”라는 말 많음. 열에 일곱은 정규화 누락이 원인임.
제조 센서 데이터 보면 온도(수십)·압력(수천)·진동(소수점)이 한 테이블에 섞여 있음. 그대로 넣으면 모델은 압력만 보고 진동은 무시함. 표준화 한 줄이 숨은 신호를 살림.
Q. BatchNorm 추론할 때 배치 통계를 그대로 씀?
아님. 추론은 보통 한 건씩 들어와서 배치 통계가 의미 없음. 학습 중에 모아둔 이동평균 μ, σ를 고정해 씀. 그래서 코드에서 model.eval()을 꼭 호출해야 함.- μ, σ는 학습 데이터로만 계산했음?
- 같은 통계를 테스트·운영에도 그대로 적용했음?
- 스케일 다른 특징을 한 테이블에 안 섞었음?
- 추론 전 model.eval() 호출했음?
- 트랜스포머면 BatchNorm 말고 LayerNorm 맞음?