검색
← 모듈 로드맵

초기화 · 정규화 · 규제: 깊은 신경망을 안정적으로 학습시키기

강의 · 준전문가 · KAITABASE 정리

기울기 소실·폭발 원인과 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) 유도, 배치 정규화 · 레이어 정규화 계산, 드롭아웃의 역스케일, 가중치 감쇠, 데이터 증강, 기울기 노름 클리핑
먼저 알면 좋은 것역전파, 분산의 성질, 다층 퍼셉트론

들어가기 전에

한눈에 보기

  • 층을 지날 때마다 신호의 분산이 "입력 수 × 가중치 분산"배가 된다는 것을 보이고, 이를 1로 맞추는 Xavier · He 초기화를 유도합니다.
  • 10층짜리 망에서 초기화를 바꿔 가며 활성값 크기가 어떻게 변하는지 직접 돌린 결과로 봅니다.
  • 배치 정규화와 레이어 정규화가 "어느 방향으로 평균을 내는가"만 다르다는 것을 2×3 행렬 하나로 계산합니다.
  • 드롭아웃이 학습 때 남은 값을 1/(1−p)1/(1-p)배 키우는 이유를 기댓값으로 확인합니다.
  • 기울기 클리핑으로 폭발을 막는 법과, 가중치 감쇠 · 데이터 증강의 역할을 정리합니다.

1. 기울기 소실과 폭발: 곱셈이 쌓이면 생기는 일

직관(해설용 비유): 0.9를 열 번 곱하면 약 0.35, 서른 번 곱하면 약 0.04입니다. 1.1을 서른 번 곱하면 약 17입니다. 신경망의 신호와 기울기도 층마다 가중치와 활성화 기울기가 곱해지므로, 층당 배율이 1에서 조금만 벗어나도 깊은 망에서는 기하급수로 커지거나 작아집니다.

  • 기울기 소실(vanishing gradient): 앞쪽 층의 기울기가 거의 0이 되어 학습이 멈춥니다. 시그모이드처럼 기울기가 최대 0.25인 활성화(다층 퍼셉트론 3절)와 너무 작은 초기 가중치가 주된 원인입니다.
  • 기울기 폭발(exploding gradient): 기울기가 너무 커져 한 걸음에 파라미터가 튀고 손실이 NaN이 됩니다. 순환 신경망처럼 같은 가중치를 여러 번 곱하는 구조에서 특히 잘 생깁니다.

2. 분산을 보존하는 초기화: Xavier와 He

분산은 층마다 어떻게 변하나

뉴런 하나의 출력 o=∑j=1ninwjxjo = \sum_{j=1}^{n_{\text{in}}} w_j x_j를 봅시다. 가중치와 입력이 서로 독립이고 평균이 0이라고 가정하면(설명용 단순화)

Var(o)=∑j=1ninVar(wj) Var(xj)=nin σw2 Var(x)\mathrm{Var}(o) = \sum_{j=1}^{n_{\text{in}}} \mathrm{Var}(w_j)\,\mathrm{Var}(x_j) = n_{\text{in}}\,\sigma_w^2\,\mathrm{Var}(x)
기호뜻
ninn_{\text{in}}이 뉴런에 들어오는 입력 수(fan-in)
noutn_{\text{out}}이 층의 출력 수(fan-out) — 역전파 때 기울기가 모이는 수
σw2\sigma_w^2가중치를 뽑는 분포의 분산

출력 분산이 입력 분산과 같으려면 ninσw2=1n_{\text{in}}\sigma_w^2 = 1, 즉 σw2=1/nin\sigma_w^2 = 1/n_{\text{in}}이어야 합니다. 역전파에서 기울기 분산을 보존하려면 같은 논리로 σw2=1/nout\sigma_w^2 = 1/n_{\text{out}}이 필요합니다.

Xavier(Glorot) 초기화

Glorot와 Bengio(AISTATS 2010)는 두 조건을 절충해 다음을 제안했습니다(대칭 활성화 tanh 등을 염두).

σw2=2nin+nout\sigma_w^2 = \frac{2}{n_{\text{in}} + n_{\text{out}}}

PyTorch xavier_uniform_은 U(−a,a)U(-a, a), a=gain×6/(nin+nout)a = \text{gain}\times\sqrt{6/(n_{\text{in}} + n_{\text{out}})}에서 뽑습니다(균등분포 U(−a,a)U(-a,a)의 분산이 a2/3a^2/3이므로 분산이 위 식과 같아집니다).

He(Kaiming) 초기화

ReLU는 음수 절반을 0으로 만들어 분산을 대략 절반으로 줄입니다. He 등(2015, Delving Deep into Rectifiers)은 ReLU를 고려한 초기화를 유도했습니다.

σw2=2nin\sigma_w^2 = \frac{2}{n_{\text{in}}}

PyTorch kaiming_normal_은 표준편차 gain/fan_mode\text{gain}/\sqrt{\text{fan\_mode}}로 뽑고, 기본값은 mode='fan_in', ReLU의 gain은 2\sqrt{2}입니다. calculate_gain의 값은 ReLU 2\sqrt{2}, tanh 5/35/3, 선형 · 시그모이드 1입니다.

숫자로 해 보기: 10층 망에 직접 돌려 보기

너비 256인 완전연결층 10개에 표준정규 입력 1,000개를 통과시키며 활성값의 표준편차를 쟀습니다(해설용 실험, NumPy 난수 시드 0, 한 번 실행한 값).

활성화 · 초기화1층5층10층읽을 것
tanh · 표준편차 0.010.15690.0001≈ 0신호가 사라짐(소실)
tanh · Xavier0.62840.31950.2209천천히 줄지만 유지
ReLU · Xavier0.58430.17540.0308ReLU의 반 토막 효과로 줄어듦
ReLU · He0.82630.77060.8647거의 일정하게 유지
ReLU · 표준편차 0.10.93491.59573.1253층마다 커짐(폭발 쪽)

마지막 줄의 0.1은 He의 2/256≈0.088\sqrt{2/256} \approx 0.088보다 조금 클 뿐인데 10층 만에 세 배 이상 커졌습니다. 초기화의 목적은 "층을 지나도 크기가 유지되는 출발점"을 주는 것입니다.

왜 0으로 초기화하면 안 되나: 모든 가중치가 같으면 같은 층의 뉴런이 똑같은 기울기를 받아 영원히 똑같이 움직입니다(대칭 문제). 무작위 초기화가 이 대칭을 깨 줍니다. 편향은 0으로 시작해도 괜찮습니다.

3. 배치 정규화와 레이어 정규화

직관: 초기화는 출발점만 맞춥니다. 학습 중에 가중치가 바뀌면 층 출력의 분포도 계속 움직입니다. 정규화 층은 매번 층 출력을 "평균 0, 분산 1"로 다시 맞춘 뒤, 학습 가능한 배율 γ\gamma와 이동 β\beta로 필요한 만큼 되돌릴 여지를 줍니다.

x^=x−μσ2+ϵ,y=γ x^+β\hat{x} = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}},\qquad y = \gamma\,\hat{x} + \beta
기호뜻
μ,σ2\mu, \sigma^2정규화할 묶음의 평균과 (편향) 분산
ϵ\epsilon0 나누기 방지용 작은 수(PyTorch 기본 10−510^{-5})
γ,β\gamma, \beta학습되는 배율 · 이동, 처음엔 1과 0

둘의 차이는 "어느 방향으로 평균을 내나"뿐입니다.

평균 · 분산을 구하는 범위추론 때주로 쓰는 곳
배치 정규화(BatchNorm)배치 안의 여러 예제, 특성(채널)마다 따로학습 중 모은 이동 평균 통계를 씀합성곱망
레이어 정규화(LayerNorm)예제 하나의 특성 전체학습 때와 똑같이 계산트랜스포머 · 순환망

숫자로 해 보기(해설용, PyTorch로 확인): 행 = 예제 2개, 열 = 특성 3개인 X=(123468)X = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 6 & 8 \end{pmatrix} (γ=1\gamma = 1, β=0\beta = 0).

  • 배치 정규화(열 방향): 첫 열 (1,4)(1, 4)의 평균 2.5, 분산 2.25 → (−1,1)(-1, 1). 다른 열도 같은 방식이라 결과는 (−1−1−1111)\begin{pmatrix} -1 & -1 & -1 \\ 1 & 1 & 1 \end{pmatrix}.
  • 레이어 정규화(행 방향): 첫 행 (1,2,3)(1, 2, 3)의 평균 2, 분산 2/32/3 → (−1.2247,0,1.2247)(-1.2247, 0, 1.2247). 둘째 행 (4,6,8)(4, 6, 8)도 평균 6, 분산 8/38/3이라 같은 결과입니다.

한 특성만 보는 예: 배치 안 값 (1,2,3,6)(1, 2, 3, 6)은 평균 3, 분산 3.5이므로 (−1.069,−0.535,0,1.604)(-1.069, -0.535, 0, 1.604)로 바뀝니다.

주의할 점

  • 배치 정규화는 학습(model.train())과 추론(model.eval())에서 동작이 다릅니다. 추론 때 eval()을 빼먹으면 결과가 배치 구성에 따라 흔들립니다. PyTorch는 이동 평균을 x^new=(1−m)x^+m xt\hat{x}_{\text{new}} = (1 - m)\hat{x} + m\,x_t, 기본 m=0.1m = 0.1로 갱신합니다.
  • 배치가 아주 작으면 배치 통계가 불안정해 배치 정규화가 약해집니다. 이때 레이어 정규화나 그룹 정규화를 씁니다.
  • 원 논문 해설은 배치 정규화, 레이어 정규화에서 봅니다.

4. 드롭아웃: 학습 때 뉴런을 무작위로 끄기

직관(해설용 비유): 팀원이 매일 무작위로 절반씩 결근하는 팀은, 특정 사람에게만 기대지 않고 모두가 일을 나눠 익힙니다. 드롭아웃은 학습 때 은닉 뉴런을 확률 pp로 꺼서, 특정 뉴런 조합에 과하게 의존(공동 적응)하는 것을 막습니다. Hinton 등(2012, arXiv 1207.0580)이 제안했습니다.

hi′={0확률 phi1−p확률 1−p⇒E[hi′]=(1−p)⋅hi1−p=hih'_i = \begin{cases} 0 & \text{확률 } p \\ \dfrac{h_i}{1 - p} & \text{확률 } 1 - p \end{cases} \qquad\Rightarrow\qquad \mathbb{E}[h'_i] = (1-p)\cdot\frac{h_i}{1-p} = h_i

숫자로 해 보기(해설용): p=0.5p = 0.5, h=(2,4,6,8)\mathbf{h} = (2, 4, 6, 8), 이번에 뽑힌 마스크가 (1,0,1,0)(1, 0, 1, 0)이면 h′=(4,0,12,0)\mathbf{h}' = (4, 0, 12, 0)입니다. 남은 값을 2배(1/(1−0.5)1/(1-0.5)) 키웠기 때문에 평균적으로는 원래 크기가 유지됩니다. 추론 때는 아무것도 끄지 않고 그대로 통과시킵니다.

왜 학습 때 키우나(역드롭아웃 inverted dropout): 학습 때 미리 1/(1−p)1/(1-p)를 곱해 두면 추론 때 아무 계산도 할 필요가 없습니다. PyTorch nn.Dropout(기본 p=0.5p = 0.5)이 이 방식이고, eval() 모드에서는 항등 함수입니다. 자세한 내용은 드롭아웃 논문 해설에서 봅니다.

5. 가중치 감쇠와 데이터 증강

  • 가중치 감쇠(weight decay): 매 걸음 가중치를 조금씩 0 쪽으로 당겨 지나치게 큰 가중치를 막습니다. SGD에서는 L2 정규화와 같고, Adam에서는 AdamW처럼 분리해서 써야 의도대로 작동합니다(옵티마이저 수업 5절).
  • 데이터 증강(data augmentation): 정답이 바뀌지 않는 변형(좌우 뒤집기, 잘라내기, 밝기 바꾸기, 소리의 속도 바꾸기 등)으로 학습 데이터를 부풀립니다. "고양이 사진을 뒤집어도 고양이"라는 지식을 모델에 직접 넣는 셈이라 가장 효과적인 규제 중 하나입니다. 단, 숫자 6과 9처럼 뒤집으면 정답이 바뀌는 경우는 조심합니다.
  • 조기 종료(early stopping): 검증 손실이 가장 낮을 때 멈춥니다(모델 평가와 과적합).

6. 기울기 클리핑: 폭발을 막는 안전벨트

직관: 기울기 벡터의 길이(노름)가 정해 둔 한도를 넘으면, 방향은 그대로 두고 길이만 한도에 맞춰 줄입니다. Pascanu · Mikolov · Bengio(2012)가 순환망의 기울기 폭발 대책으로 기울기 노름 클리핑을 제안했습니다.

g←g⋅min⁡ ⁣(1,c∥g∥)\mathbf{g} \leftarrow \mathbf{g}\cdot\min\!\Big(1, \frac{c}{\|\mathbf{g}\|}\Big)
기호뜻
∥g∥\Vert\mathbf{g}\Vert모든 파라미터 기울기를 한 벡터로 이어 붙인 L2 노름
cc한도(max_norm)

숫자로 해 보기(PyTorch clip_grad_norm_으로 확인): g=(3,4)\mathbf{g} = (3, 4), 노름 5, 한도 1이면 g=(0.6,0.8)\mathbf{g} = (0.6, 0.8)이 됩니다. 함수는 클리핑 전 전체 노름 5를 돌려주므로, 이 값을 기록해 두면 학습이 불안정해지는 순간을 찾는 데 도움이 됩니다.

mermaid
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/512=1/256=1/16=0.0625\sqrt{2/512} = \sqrt{1/256} = 1/16 = 0.0625입니다.

2. nin=100n_{\text{in}} = 100, nout=200n_{\text{out}} = 200인 층의 Xavier 균등 초기화 범위 aa는(gain 1)?

풀이: a=6/300=0.02≈0.1414a = \sqrt{6/300} = \sqrt{0.02} \approx 0.1414입니다.

3. 배치 안 한 특성 값이 (2,4,6,8)(2, 4, 6, 8)일 때 배치 정규화 결과는(ϵ\epsilon 무시)?

풀이: 평균 5, 분산 (9+1+1+9)/4=5(9 + 1 + 1 + 9)/4 = 5, 표준편차 5≈2.236\sqrt{5} \approx 2.236 → (−1.342,−0.447,0.447,1.342)(-1.342, -0.447, 0.447, 1.342)입니다.

4. 드롭아웃 p=0.2p = 0.2에서 살아남은 값은 몇 배가 되나요?

풀이: 1/(1−0.2)=1.251/(1 - 0.2) = 1.25배입니다.

5. 기울기 (6,8)(6, 8)을 한도 5로 클리핑하면?

풀이: 노름 10이므로 5/10=0.55/10 = 0.5를 곱해 (3,4)(3, 4)입니다.

스스로 점검

  1. ReLU 망에 Xavier 대신 He 초기화를 쓰는 이유는?
    • 답: ReLU가 음수 절반을 0으로 만들어 분산을 약 절반으로 줄이므로, 가중치 분산을 2/nin2/n_{\text{in}}으로 두 배 키워야 층을 지나도 분산이 유지되기 때문입니다.
  2. 배치 정규화와 레이어 정규화의 가장 큰 차이는?
    • 답: 평균 · 분산을 배치 안 여러 예제에 걸쳐 구하느냐(배치), 예제 하나의 특성 전체에 걸쳐 구하느냐(레이어)입니다. 그래서 레이어 정규화는 배치 크기와 무관하고 학습 · 추론 계산이 같습니다.
  3. 추론할 때 model.eval()을 빼먹으면 어떤 층이 문제를 일으키나요?
    • 답: 드롭아웃(계속 뉴런을 끔)과 배치 정규화(이동 평균 대신 현재 배치 통계를 씀)입니다.

용어 정리

용어쉬운 뜻
기울기 폭발(exploding gradient)역전파 기울기가 층마다 커져 학습이 튀는 현상
fan-in · fan-out뉴런에 들어오는 입력 수 · 층에서 나가는 출력 수
Xavier(Glorot) 초기화분산 2/(nin+nout)2/(n_{\text{in}} + n_{\text{out}})로 가중치를 뽑는 초기화
He(Kaiming) 초기화ReLU용, 분산 2/nin2/n_{\text{in}}로 뽑는 초기화
대칭 문제(symmetry)같은 값으로 초기화하면 뉴런들이 똑같이 학습되는 문제
배치 정규화(batch normalization)배치 안 예제들로 특성마다 평균 0 · 분산 1로 맞추는 층
레이어 정규화(layer normalization)예제 하나의 특성 전체로 정규화하는 층
드롭아웃(dropout)학습 때 뉴런을 확률 pp로 끄는 규제
역드롭아웃(inverted dropout)학습 때 남은 값을 1/(1−p)1/(1-p)배 키워 추론 때 손대지 않는 방식
데이터 증강(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번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 D2L(CC BY-SA 4.0)