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