초기화 · 정규화 · 규제: 깊은 신경망을 안정적으로 학습시키기
기울기 소실·폭발 원인과 Xavier·He 초기화, 배치·레이어 정규화, 드롭아웃, 기울기 클리핑을 계산으로
먼저 알아야 할 것
다루는 내용
층을 지날 때 신호 분산이 어떻게 변하는지 계산해 기울기 소실 · 폭발의 원인을 보이고, Xavier · He 초기화를 유도한 뒤 10층 망 실험으로 효과를 확인합니다. 배치 정규화와 레이어 정규화를 2×3 행렬로 손계산해 차이를 비교하고, 드롭아웃의 역스케일, 가중치 감쇠, 데이터 증강, 기울기 노름 클리핑을 정리합니다.
해설
초기화 · 정규화 · 규제: 깊은 신경망을 안정적으로 학습시키기
층이 깊어지면 신호와 기울기가 층마다 곱해지면서 0으로 사라지거나 끝없이 커집니다. 이 수업은 그 이유를 분산 계산으로 보이고, 이를 막는 세 가지 도구 — ① 가중치를 알맞은 크기로 뽑는 초기화(Xavier · He) ② 층 출력을 다시 맞추는 정규화(배치 · 레이어 정규화) ③ 과적합을 줄이는 규제(드롭아웃 · 가중치 감쇠 · 데이터 증강)와 기울기 클리핑 — 을 작은 숫자와 실험으로 익힙니다.
| 항목 | 내용 |
|---|---|
| 참고 자료 | D2L '수치 안정성과 초기화' 절 · d2l.ai/chapter_multilayer-perceptrons/numerical-stability-and-init.html, PyTorch nn.init · BatchNorm2d · LayerNorm · Dropout 문서 |
| 트랙 · 수준 | 딥러닝 기초 · 중급 |
| 이 수업의 범위 | 기울기 소실 · 폭발, 분산 보존 초기화(Xavier · He) 유도, 배치 정규화 · 레이어 정규화 계산, 드롭아웃의 역스케일, 가중치 감쇠, 데이터 증강, 기울기 노름 클리핑 |
| 먼저 알면 좋은 것 | 역전파, 분산의 성질, 다층 퍼셉트론 |
들어가기 전에
- 옵티마이저와 학습률 스케줄 — 가중치 감쇠와 AdamW, 학습률 웜업을 알고 오면 됩니다.
- 확률과 통계 최소한 — 분산 와 독립의 뜻을 씁니다.
한눈에 보기
- 층을 지날 때마다 신호의 분산이 "입력 수 × 가중치 분산"배가 된다는 것을 보이고, 이를 1로 맞추는 Xavier · He 초기화를 유도합니다.
- 10층짜리 망에서 초기화를 바꿔 가며 활성값 크기가 어떻게 변하는지 직접 돌린 결과로 봅니다.
- 배치 정규화와 레이어 정규화가 "어느 방향으로 평균을 내는가"만 다르다는 것을 2×3 행렬 하나로 계산합니다.
- 드롭아웃이 학습 때 남은 값을 배 키우는 이유를 기댓값으로 확인합니다.
- 기울기 클리핑으로 폭발을 막는 법과, 가중치 감쇠 · 데이터 증강의 역할을 정리합니다.
1. 기울기 소실과 폭발: 곱셈이 쌓이면 생기는 일
직관(해설용 비유): 0.9를 열 번 곱하면 약 0.35, 서른 번 곱하면 약 0.04입니다. 1.1을 서른 번 곱하면 약 17입니다. 신경망의 신호와 기울기도 층마다 가중치와 활성화 기울기가 곱해지므로, 층당 배율이 1에서 조금만 벗어나도 깊은 망에서는 기하급수로 커지거나 작아집니다.
- 기울기 소실(vanishing gradient): 앞쪽 층의 기울기가 거의 0이 되어 학습이 멈춥니다. 시그모이드처럼 기울기가 최대 0.25인 활성화(다층 퍼셉트론 3절)와 너무 작은 초기 가중치가 주된 원인입니다.
- 기울기 폭발(exploding gradient): 기울기가 너무 커져 한 걸음에 파라미터가 튀고 손실이 NaN이 됩니다. 순환 신경망처럼 같은 가중치를 여러 번 곱하는 구조에서 특히 잘 생깁니다.
2. 분산을 보존하는 초기화: Xavier와 He
분산은 층마다 어떻게 변하나
뉴런 하나의 출력 를 봅시다. 가중치와 입력이 서로 독립이고 평균이 0이라고 가정하면(설명용 단순화)
| 기호 | 뜻 |
|---|---|
| 이 뉴런에 들어오는 입력 수(fan-in) | |
| 이 층의 출력 수(fan-out) — 역전파 때 기울기가 모이는 수 | |
| 가중치를 뽑는 분포의 분산 |
출력 분산이 입력 분산과 같으려면 , 즉 이어야 합니다. 역전파에서 기울기 분산을 보존하려면 같은 논리로 이 필요합니다.
Xavier(Glorot) 초기화
Glorot와 Bengio(AISTATS 2010)는 두 조건을 절충해 다음을 제안했습니다(대칭 활성화 tanh 등을 염두).
PyTorch xavier_uniform_은 , 에서 뽑습니다(균등분포 의 분산이 이므로 분산이 위 식과 같아집니다).
He(Kaiming) 초기화
ReLU는 음수 절반을 0으로 만들어 분산을 대략 절반으로 줄입니다. He 등(2015, Delving Deep into Rectifiers)은 ReLU를 고려한 초기화를 유도했습니다.
PyTorch kaiming_normal_은 표준편차 로 뽑고, 기본값은 mode='fan_in', ReLU의 gain은 입니다. calculate_gain의 값은 ReLU , tanh , 선형 · 시그모이드 1입니다.
숫자로 해 보기: 10층 망에 직접 돌려 보기
너비 256인 완전연결층 10개에 표준정규 입력 1,000개를 통과시키며 활성값의 표준편차를 쟀습니다(해설용 실험, NumPy 난수 시드 0, 한 번 실행한 값).
| 활성화 · 초기화 | 1층 | 5층 | 10층 | 읽을 것 |
|---|---|---|---|---|
| tanh · 표준편차 0.01 | 0.1569 | 0.0001 | ≈ 0 | 신호가 사라짐(소실) |
| tanh · Xavier | 0.6284 | 0.3195 | 0.2209 | 천천히 줄지만 유지 |
| ReLU · Xavier | 0.5843 | 0.1754 | 0.0308 | ReLU의 반 토막 효과로 줄어듦 |
| ReLU · He | 0.8263 | 0.7706 | 0.8647 | 거의 일정하게 유지 |
| ReLU · 표준편차 0.1 | 0.9349 | 1.5957 | 3.1253 | 층마다 커짐(폭발 쪽) |
마지막 줄의 0.1은 He의 보다 조금 클 뿐인데 10층 만에 세 배 이상 커졌습니다. 초기화의 목적은 "층을 지나도 크기가 유지되는 출발점"을 주는 것입니다.
왜 0으로 초기화하면 안 되나: 모든 가중치가 같으면 같은 층의 뉴런이 똑같은 기울기를 받아 영원히 똑같이 움직입니다(대칭 문제). 무작위 초기화가 이 대칭을 깨 줍니다. 편향은 0으로 시작해도 괜찮습니다.
3. 배치 정규화와 레이어 정규화
직관: 초기화는 출발점만 맞춥니다. 학습 중에 가중치가 바뀌면 층 출력의 분포도 계속 움직입니다. 정규화 층은 매번 층 출력을 "평균 0, 분산 1"로 다시 맞춘 뒤, 학습 가능한 배율 와 이동 로 필요한 만큼 되돌릴 여지를 줍니다.
| 기호 | 뜻 |
|---|---|
| 정규화할 묶음의 평균과 (편향) 분산 | |
| 0 나누기 방지용 작은 수(PyTorch 기본 ) | |
| 학습되는 배율 · 이동, 처음엔 1과 0 |
둘의 차이는 "어느 방향으로 평균을 내나"뿐입니다.
| 평균 · 분산을 구하는 범위 | 추론 때 | 주로 쓰는 곳 | |
|---|---|---|---|
| 배치 정규화(BatchNorm) | 배치 안의 여러 예제, 특성(채널)마다 따로 | 학습 중 모은 이동 평균 통계를 씀 | 합성곱망 |
| 레이어 정규화(LayerNorm) | 예제 하나의 특성 전체 | 학습 때와 똑같이 계산 | 트랜스포머 · 순환망 |
숫자로 해 보기(해설용, PyTorch로 확인): 행 = 예제 2개, 열 = 특성 3개인 (, ).
- 배치 정규화(열 방향): 첫 열 의 평균 2.5, 분산 2.25 → . 다른 열도 같은 방식이라 결과는 .
- 레이어 정규화(행 방향): 첫 행 의 평균 2, 분산 → . 둘째 행 도 평균 6, 분산 이라 같은 결과입니다.
한 특성만 보는 예: 배치 안 값 은 평균 3, 분산 3.5이므로 로 바뀝니다.
주의할 점
- 배치 정규화는 학습(
model.train())과 추론(model.eval())에서 동작이 다릅니다. 추론 때eval()을 빼먹으면 결과가 배치 구성에 따라 흔들립니다. PyTorch는 이동 평균을 , 기본 로 갱신합니다. - 배치가 아주 작으면 배치 통계가 불안정해 배치 정규화가 약해집니다. 이때 레이어 정규화나 그룹 정규화를 씁니다.
- 원 논문 해설은 배치 정규화, 레이어 정규화에서 봅니다.
4. 드롭아웃: 학습 때 뉴런을 무작위로 끄기
직관(해설용 비유): 팀원이 매일 무작위로 절반씩 결근하는 팀은, 특정 사람에게만 기대지 않고 모두가 일을 나눠 익힙니다. 드롭아웃은 학습 때 은닉 뉴런을 확률 로 꺼서, 특정 뉴런 조합에 과하게 의존(공동 적응)하는 것을 막습니다. Hinton 등(2012, arXiv 1207.0580)이 제안했습니다.
숫자로 해 보기(해설용): , , 이번에 뽑힌 마스크가 이면 입니다. 남은 값을 2배() 키웠기 때문에 평균적으로는 원래 크기가 유지됩니다. 추론 때는 아무것도 끄지 않고 그대로 통과시킵니다.
왜 학습 때 키우나(역드롭아웃 inverted dropout): 학습 때 미리 를 곱해 두면 추론 때 아무 계산도 할 필요가 없습니다. PyTorch nn.Dropout(기본 )이 이 방식이고, eval() 모드에서는 항등 함수입니다. 자세한 내용은 드롭아웃 논문 해설에서 봅니다.
5. 가중치 감쇠와 데이터 증강
- 가중치 감쇠(weight decay): 매 걸음 가중치를 조금씩 0 쪽으로 당겨 지나치게 큰 가중치를 막습니다. SGD에서는 L2 정규화와 같고, Adam에서는 AdamW처럼 분리해서 써야 의도대로 작동합니다(옵티마이저 수업 5절).
- 데이터 증강(data augmentation): 정답이 바뀌지 않는 변형(좌우 뒤집기, 잘라내기, 밝기 바꾸기, 소리의 속도 바꾸기 등)으로 학습 데이터를 부풀립니다. "고양이 사진을 뒤집어도 고양이"라는 지식을 모델에 직접 넣는 셈이라 가장 효과적인 규제 중 하나입니다. 단, 숫자 6과 9처럼 뒤집으면 정답이 바뀌는 경우는 조심합니다.
- 조기 종료(early stopping): 검증 손실이 가장 낮을 때 멈춥니다(모델 평가와 과적합).
6. 기울기 클리핑: 폭발을 막는 안전벨트
직관: 기울기 벡터의 길이(노름)가 정해 둔 한도를 넘으면, 방향은 그대로 두고 길이만 한도에 맞춰 줄입니다. Pascanu · Mikolov · Bengio(2012)가 순환망의 기울기 폭발 대책으로 기울기 노름 클리핑을 제안했습니다.
| 기호 | 뜻 |
|---|---|
| 모든 파라미터 기울기를 한 벡터로 이어 붙인 L2 노름 | |
한도(max_norm) |
숫자로 해 보기(PyTorch clip_grad_norm_으로 확인): , 노름 5, 한도 1이면 이 됩니다. 함수는 클리핑 전 전체 노름 5를 돌려주므로, 이 값을 기록해 두면 학습이 불안정해지는 순간을 찾는 데 도움이 됩니다.
flowchart TB
A[깊은 망 학습이 불안정] --> B{증상}
B -- 활성값 · 기울기가 0 근처 --> C[He/Xavier 초기화, ReLU 계열, 정규화 층]
B -- 손실이 튀거나 NaN --> D[학습률 낮추기, 웜업, 기울기 클리핑]
B -- 학습만 잘 되고 검증이 나쁨 --> E[드롭아웃, 가중치 감쇠, 데이터 증강, 조기 종료]
C --> F[다시 학습하며 손실 곡선 확인]
D --> F
E --> F연습 문제
1. 입력 512개인 ReLU 층에 He 초기화를 쓰면 가중치 표준편차는?
풀이: 입니다.
2. , 인 층의 Xavier 균등 초기화 범위 는(gain 1)?
풀이: 입니다.
3. 배치 안 한 특성 값이 일 때 배치 정규화 결과는( 무시)?
풀이: 평균 5, 분산 , 표준편차 → 입니다.
4. 드롭아웃 에서 살아남은 값은 몇 배가 되나요?
풀이: 배입니다.
5. 기울기 을 한도 5로 클리핑하면?
풀이: 노름 10이므로 를 곱해 입니다.
스스로 점검
- ReLU 망에 Xavier 대신 He 초기화를 쓰는 이유는?
- 답: ReLU가 음수 절반을 0으로 만들어 분산을 약 절반으로 줄이므로, 가중치 분산을 으로 두 배 키워야 층을 지나도 분산이 유지되기 때문입니다.
- 배치 정규화와 레이어 정규화의 가장 큰 차이는?
- 답: 평균 · 분산을 배치 안 여러 예제에 걸쳐 구하느냐(배치), 예제 하나의 특성 전체에 걸쳐 구하느냐(레이어)입니다. 그래서 레이어 정규화는 배치 크기와 무관하고 학습 · 추론 계산이 같습니다.
- 추론할 때
model.eval()을 빼먹으면 어떤 층이 문제를 일으키나요?- 답: 드롭아웃(계속 뉴런을 끔)과 배치 정규화(이동 평균 대신 현재 배치 통계를 씀)입니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 기울기 폭발(exploding gradient) | 역전파 기울기가 층마다 커져 학습이 튀는 현상 |
| fan-in · fan-out | 뉴런에 들어오는 입력 수 · 층에서 나가는 출력 수 |
| Xavier(Glorot) 초기화 | 분산 로 가중치를 뽑는 초기화 |
| He(Kaiming) 초기화 | ReLU용, 분산 로 뽑는 초기화 |
| 대칭 문제(symmetry) | 같은 값으로 초기화하면 뉴런들이 똑같이 학습되는 문제 |
| 배치 정규화(batch normalization) | 배치 안 예제들로 특성마다 평균 0 · 분산 1로 맞추는 층 |
| 레이어 정규화(layer normalization) | 예제 하나의 특성 전체로 정규화하는 층 |
| 드롭아웃(dropout) | 학습 때 뉴런을 확률 로 끄는 규제 |
| 역드롭아웃(inverted dropout) | 학습 때 남은 값을 배 키워 추론 때 손대지 않는 방식 |
| 데이터 증강(data augmentation) | 정답이 안 바뀌는 변형으로 학습 데이터를 늘리기 |
| 기울기 클리핑(gradient clipping) | 기울기 노름이 한도를 넘으면 길이를 줄이기 |
더 깊이 보려면
D2L의 '수치 안정성과 초기화' 절은 기울기 소실 · 폭발과 대칭 깨기, Xavier 초기화 유도를 다루고, 같은 책의 배치 정규화 절과 드롭아웃 절이 구현까지 보여 줍니다. 원 논문 해설은 배치 정규화 · 레이어 정규화 · ResNet(잔차 연결도 깊은 망을 안정시키는 핵심 장치)을 보세요.
다음에 볼 것
- 드롭아웃: 특징 검출기의 공동 적응 막기 — 드롭아웃 원 논문의 실험과 해석입니다.
- 신경망 학습 디버깅과 실험 관리 레시피 — 이 도구들을 실제 학습에서 어떤 순서로 점검할지 정리합니다.
라이선스
이 글은 원문 번역이 아니라 KAITABASE가 직접 쓴 해설이며, 숫자 예와 10층 실험은 설명용으로 만든 것입니다(NumPy 2.5 · PyTorch 2.14로 직접 실행해 확인). 참고 자료 D2L은 CC BY-SA 4.0, PyTorch 문서는 BSD 계열 라이선스입니다.
출처
- 참고: https://d2l.ai/chapter_multilayer-perceptrons/numerical-stability-and-init.html (D2L 수치 안정성과 초기화)
- PyTorch 문서: https://docs.pytorch.org/docs/2.14/nn.init.html · BatchNorm2d · LayerNorm · Dropout · clip_grad_norm_
- Glorot · Bengio, Understanding the difficulty of training deep feedforward neural networks, AISTATS 2010: https://proceedings.mlr.press/v9/glorot10a.html
- He 외, Delving Deep into Rectifiers, 2015: https://arxiv.org/abs/1502.01852
- Hinton 외, Improving neural networks by preventing co-adaptation of feature detectors, 2012: https://arxiv.org/abs/1207.0580
- Pascanu · Mikolov · Bengio, On the difficulty of training Recurrent Neural Networks, 2012: https://arxiv.org/abs/1211.5063
AI 원리부터 이해하기 · 딥러닝 기초 모듈
딥러닝 기초 모듈 학습
이 글은 딥러닝 기초 모듈의 학습 자료입니다. 전체 29개 자료 중 8번째입니다.
출처·원문
원문 보기요약만