밑바닥부터 시작하는 딥러닝 1 - 학습 관련 기술들
신경망은 구조만 만든다고 잘 학습되지 않는다. 출발점이 나쁘거나, 층을 지나며 값이 치우치거나, 훈련 데이터에만 지나치게 맞춰지면 성능이 흔들린다.
6장의 여러 기술은 서로 다른 문제를 다룬다. 초깃값은 출발점을, 배치 정규화는 중간 분포를, 드롭아웃과 가중치 감소는 과대적합을 다룬다.
이번 글에서 잡을 것
- 가중치를 모두 0으로 시작하면 대칭성이 깨지지 않는다.
- Sigmoid/tanh에는 Xavier, ReLU에는 He 초깃값이 자주 쓰인다.
- 배치 정규화는 미니배치 단위로 데이터 분포를 평균 0, 분산 1에 가깝게 맞춘다.
- 가중치 감소와 드롭아웃은 과대적합을 막는 대표적인 방법이다.
- 하이퍼파라미터는 시험 데이터가 아니라 검증 데이터로 조정한다.
초깃값을 모두 0으로 하면 안 되는 이유
모든 가중치가 같은 값에서 시작하면 역전파 때도 같은 방식으로 갱신된다. 그러면 여러 뉴런을 둔 의미가 줄어든다. 그래서 가중치는 작은 난수로 시작해 대칭을 깨야 한다.
모두 0
모든 뉴런이 비슷하게 움직여 역할이 나뉘지 않는다.
작은 난수
뉴런마다 다른 출발점을 가져 역할이 갈라질 수 있다.
좋은 초깃값
활성화값이 너무 몰리거나 사라지지 않게 돕는다.
Xavier와 He 초깃값
| 활성화 함수 | 추천 초깃값 | 이유 |
|---|---|---|
| Sigmoid/tanh | Xavier | 앞 층 노드 수를 고려해 분포를 적절히 유지 |
| ReLU | He | 음수 영역이 0이 되므로 더 넓은 분포가 필요 |
배치 정규화는 분포를 다듬는다
배치 정규화는 각 층의 활성화값이 지나치게 치우치지 않도록 미니배치 단위로 평균과 분산을 맞춘다. 이후 감마와 베타로 확대와 이동을 다시 학습한다.
책의 범위
배치 정규화의 역전파 유도는 복잡해서 책에서는 상세 구현보다 원리와 효과를 중심으로 다룬다.
과대적합을 막는 방법
| 방법 | 어떻게 막는가 | 읽는 기준 |
|---|---|---|
| 가중치 감소 | 큰 가중치에 페널티를 준다 | 모델이 과하게 날카로워지는 것을 누름 |
| 드롭아웃 | 훈련 중 뉴런 일부를 무작위로 끈다 | 특정 뉴런 의존을 줄이고 앙상블 효과 |
| 검증 데이터 | 하이퍼파라미터 평가에 사용한다 | 시험 데이터 오염 방지 |
하이퍼파라미터는 어떻게 찾나
학습률, 배치 크기, 가중치 감소 계수 같은 하이퍼파라미터는 사람이 정해야 한다. 시험 데이터로 계속 맞추면 시험 데이터에 과대적합되므로, 훈련 데이터 일부를 검증 데이터로 떼어 평가한다.
탐색 범위는 보통 로그 스케일로 넓게 잡고, 무작위 샘플링으로 여러 값을 시험한 뒤 좋은 구간을 좁혀간다.
이 글은 6장 후반부의 지도다
초깃값, 배치 정규화, 드롭아웃, 하이퍼파라미터 탐색은 각각 깊게 들어가면 한 편짜리 주제다. 그래서 이 글은 전체 지도를 먼저 잡고, 뒤의 10a~10c에서 세부를 나누어 보는 구조로 읽는 것이 좋다.
| 주제 | 이 글에서 하는 일 | 심화 글 |
|---|---|---|
| 초깃값 | 왜 시작 분포가 중요한지 | 10a |
| BatchNorm | 왜 중간 분포를 맞추는지 | 10b |
| Dropout/검증 | 왜 과대적합을 막고 검증 데이터를 분리하는지 | 10c |
공식으로 최소한의 기준 잡기
이 편의 개념들은 이름이 많아서 흐릿해지기 쉽다. 최소한 아래 기준만 잡아도 각 기술이 어디에 끼어드는지 보인다.
| 기술 | 짧은 식/기준 | 어디에 끼어드나 |
|---|---|---|
| Xavier | 표준편차 약 `1/sqrt(n)` | 가중치 초기화 |
| He | 표준편차 약 `sqrt(2/n)` | ReLU 계열 초기화 |
| BatchNorm | `(x-평균)/sqrt(분산+ε)` | 층 사이 데이터 분포 조정 |
| Weight Decay | 손실에 가중치 크기 페널티 추가 | 과대적합 억제 |
| Dropout | 훈련 때 일부 뉴런 비활성화 | 특정 뉴런 의존 억제 |
BatchNorm 숫자 예시
배치 정규화는 말로만 들으면 추상적이지만, 작은 배열 하나로 보면 평균을 빼고 표준편차로 나누는 작업이다.
import numpy as np
x = np.array([1.0, 2.0, 3.0])
mean = np.mean(x)
var = np.var(x)
normalized = (x - mean) / np.sqrt(var + 1e-7)
print(mean)
print(round(var, 3))
print(np.round(normalized, 3))
예상 출력
2.0
0.667
[-1.225 0. 1.225]
초깃값이 나쁘면 어떤 일이 생기나
시그모이드 함수는 입력이 너무 크거나 작으면 출력이 0이나 1 근처로 붙는다. 이 구간에서는 기울기가 작아져 역전파 신호가 약해질 수 있다. 반대로 모든 값이 0.5 근처에 몰리면 여러 뉴런이 비슷한 값만 내어 표현력이 줄어든다.
| 활성화값 분포 | 문제 | 결과 |
|---|---|---|
| 0과 1 근처로 몰림 | 기울기 소실 | 앞 층으로 학습 신호가 약해짐 |
| 0.5 근처로 몰림 | 표현력 제한 | 여러 뉴런을 둔 의미가 줄어듦 |
| 적당히 퍼짐 | 학습 안정 | 층마다 다양한 표현 가능 |
드롭아웃의 훈련/시험 차이
드롭아웃은 훈련할 때만 뉴런 일부를 무작위로 끈다. 시험할 때는 모든 뉴런을 사용하되, 훈련 때 살아남은 비율을 고려해 출력 크기를 맞춘다.
| 단계 | 동작 | 이유 |
|---|---|---|
| 훈련 | 뉴런 일부를 무작위로 끔 | 특정 뉴런 의존 방지 |
| 시험 | 모든 뉴런 사용 | 안정적인 예측 |
| 스케일 조정 | 살아남은 비율 반영 | 훈련/시험 출력 크기 차이 완화 |
검증 데이터는 시험 데이터가 아니다
하이퍼파라미터를 시험 데이터로 계속 맞추면, 시험 데이터도 사실상 학습에 사용한 셈이 된다. 그래서 훈련 데이터 일부를 검증 데이터로 떼어 하이퍼파라미터 조정에 사용한다.
스스로 점검
- 가중치를 모두 0으로 시작하면 안 되는 이유를 설명할 수 있는가?
- Xavier와 He 초깃값의 사용 기준을 말할 수 있는가?
- 배치 정규화와 드롭아웃이 해결하려는 문제가 어떻게 다른지 설명할 수 있는가?
- 검증 데이터와 시험 데이터의 역할 차이를 설명할 수 있는가?
이번 글에서 기억할 것
- 가중치를 모두 0으로 시작하면 대칭성이 깨지지 않는다.
- Sigmoid/tanh에는 Xavier, ReLU에는 He 초깃값이 자주 쓰인다.
- 배치 정규화는 미니배치 단위로 데이터 분포를 평균 0, 분산 1에 가깝게 맞춘다.
- 가중치 감소와 드롭아웃은 과대적합을 막는 대표적인 방법이다.
- 하이퍼파라미터는 시험 데이터가 아니라 검증 데이터로 조정한다.
다음 글로 이어지는 질문
이 시리즈의 다음 확장 주제는 7장의 합성곱 신경망(CNN)이다. 이미지 데이터를 다룰 때 완전연결 계층이 왜 부족한지부터 다시 시작하면 된다.
한 줄 정리: 좋은 신경망 학습은 모델 구조뿐 아니라 출발점, 중간 분포, 과대적합 관리, 하이퍼파라미터 탐색까지 함께 다루는 일이다.