87. 가중치 초기화 (Weight Initialization)
⚠️ 이 문서는 딥러닝 모델 학습을 막 시작할 때, 신경망의 뇌세포들을 연결하는 수백만 개의 연결선(가중치, Weight)에 '처음 어떤 숫자(초깃값)'를 부여할 것인가의 문제로, 이 첫 단추를 잘못 끼우면 기울기가 소실되거나 폭발하여 학습이 아예 멈춰버리는 치명적 참사를 막기 위한 Xavier 및 He 초기화 기법을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 백지상태의 인공지능에게 훈련용 첫 모의고사를 풀리기 전, 아무 값이나 막 던져주거나(랜덤) 모두 0으로 채워놓으면 역전파(Backpropagation) 시 치명적인 수학적 모순에 빠진다. 이를 막기 위해 과학적으로 정밀하게 계산된 난수를 뿌리는 작업이다.
- 가치: 적절한 가중치 초기화는 데이터가 수백 개의 은닉층(Layer)을 통과하더라도 신호(활성화 값)가 죽거나 미쳐 날뛰지 않고 골고루 퍼지게 만들어, 기울기 소실(Vanishing Gradient) 현상을 1차적으로 방어하고 모델이 깊어져도 안정적인 학습을 보장한다.
- 기술 체계: Sigmoid나 Tanh 함수를 쓸 때는 노드의 개수에 맞춰 분산을 조절하는 사비에르(Xavier/Glorot) 초기화를 쓰고, 최신 트렌드인 ReLU 함수를 쓸 때는 그 절반이 0으로 죽어버리는 특성을 보정해 주는 He 초기화를 쓰는 것이 불문율(국룰)이다.
Ⅰ. 0 초기화의 저주와 무작위 초기화의 폭발
초깃값은 아무렇게나 주면 안 된다. 잘못 주면 바보가 되거나 미쳐버린다.
- 가중치를 모두 0으로 초기화하면? (Symmetry 현상):
- 모든 가중치($W$)를 0으로 주고 시작하면 왠지 깔끔할 것 같다. 하지만 최악의 짓이다.
- 순전파 때 모든 뉴런이 똑같은 값(0)을 다음 층으로 넘겨주고, 역전파 때도 모든 가중치가 완벽하게 똑같은 크기(기울기)로 무한히 업데이트되는 '대칭성(Symmetry)'에 갇혀버린다. 결국 수백 개의 뉴런을 둔 의미가 없이 1개의 뉴런처럼 똑같이 행동하는 바보가 된다.
- 크거나 작은 랜덤 값 초기화의 재앙:
- 가중치들을 작게($0.01$ 곱하기 랜덤) 주면? 층(Layer)을 지날 때마다 신호가 점점 작아져서 결국 뒤쪽 층에는 0에 수렴하는 값만 전달된다. (기울기 소실)
- 가중치들을 크게(큰 표준편차 랜덤) 주면? 층을 지날 때마다 숫자가 눈덩이처럼 커져서 결괏값이 무한대로 터져버린다. (기울기 폭발)
📢 섹션 요약 비유: 군대에 신병 100명이 왔는데 모두한테 똑같은 교범(0 초기화)만 달달 외우게 하면, 전쟁 났을 때 100명이 똑같은 행동만 하다가 전멸합니다(대칭성). 반대로 아무렇게나 엉터리로 작전을 짜주면(랜덤 초기화), 총 한 번 못 쏴보고 겁먹어 얼어붙거나(기울기 소실) 미쳐서 아군에게 수류탄을 던지며 폭주(기울기 폭발)하게 됩니다. 각자 적절히 흩어져 다양한 생각을 하도록 초기 훈련을 잘 시키는 것이 중요합니다.
Ⅱ. 사비에르 (Xavier / Glorot) 초기화의 균형
이전 층의 노드 수가 많으면 초깃값을 작게 쪼개어 준다.
- 기본 철학 (분산 유지):
- 2010년 자비에 글로롯(Xavier Glorot)이 제안한 기법. 핵심은 "입력으로 들어오는 신호의 데이터 크기(분산)와, 출력으로 나가는 신호의 크기(분산)가 층을 지나도 똑같이 일정하게 유지되어야 한다"는 것이다.
- 수학적 보정 (노드 수의 루트로 나누기):
- 앞 층에서 내게 신호를 쏴주는 뉴런(노드)이 100개라면, 100개의 값이 더해져서 내게 오므로 값이 확 커질 위험이 있다.
- 그래서 가중치의 난수(Random)를 생성할 때, $\frac{1}{\sqrt{n_{in}}}$ (앞 층의 노드 개수 루트값)만큼 곱해서(나누어서) 팩폭을 줄여버린다.
- (경우에 따라 앞 층 노드 수와 뒤 층 노드 수를 더해서 루트를 씌우기도 함)
- 적합한 활성화 함수 (Sigmoid, Tanh):
- Xavier 초기화는 0을 기준으로 대칭적인 S자 모양을 그리는 Sigmoid나 Tanh 함수를 썼을 때, 신호가 0이나 1로 쏠리지 않고 예쁜 종 모양(정규분포)으로 끝까지 잘 전달되는 마법을 보여주었다.
📢 섹션 요약 비유: 파티에 10명(노드 10개)이 음료수를 부어 큰 통(다음 층)을 채울 때와 100명(노드 100개)이 부을 때는 기준이 달라야 합니다. 100명이 부을 때는 컵의 크기(가중치 초깃값)를 $\frac{1}{10}$로 아주 작게 강제로 줄여버려야(루트 연산) 큰 통이 넘쳐서 터지는 것(분산 폭발)을 막을 수 있는 과학적 계량법입니다.
Ⅲ. He 초기화 (Kaiming He) - ReLU 전용 무기
시대가 바뀌어 ReLU를 쓰자 사비에르도 한계를 드러냈다.
- Xavier와 ReLU의 불협화음:
- 딥러닝 트렌드가 Sigmoid를 버리고 ReLU(음수는 무조건 0으로 차단) 함수로 넘어가면서 문제가 터졌다.
- Xavier 초깃값을 넣고 ReLU를 통과시키면, 음수 값 절반이 0으로 죽어버리기 때문에 신호의 전체 크기(분산)가 반토막이 나버린다. 층이 100개 깊어지면 결국 신호가 0으로 다 소멸해 버리는(기울기 소실) 현상이 다시 발생했다.
- He 초기화 (2배의 펌핑):
- 카이밍 허(Kaiming He)는 "ReLU가 음수를 반토막 내니까, 처음 가중치를 줄 때 분산을 Xavier보다 딱 2배 더 크게 주면 밸런스가 맞지 않겠나?"라는 심플하고 천재적인 제안을 했다.
- 난수를 생성할 때 $\sqrt{\frac{2}{n_{in}}}$ 를 곱해준다 (Xavier보다 $\sqrt{2}$배 크다).
- 최신 딥러닝의 절대 룰 (Rule of Thumb):
- 이 2배 펌핑 덕분에 깊은 CNN(ResNet 등) 아키텍처에서 ReLU를 쓸 때 신호가 끝까지 살아남게 되었다.
- 결론 공식:
Sigmoid/Tanh를 쓸 때는 Xavier 초기화를 써라. ReLU(또는 그 변형)를 쓸 때는 He 초기화를 써라.이것은 바꿀 수 없는 딥러닝의 진리다.
📢 섹션 요약 비유: ReLU라는 깐깐한 문지기는 나쁜 말(음수)을 하는 사람을 절반이나 쫓아내 버립니다(신호 반토막). 그래서 사비에르(Xavier)가 보낸 병사들은 문을 거치며 숫자가 확 줄어 전멸해 버렸습니다. 허(He) 장군은 애초에 파견할 때부터 "저 문지기가 반을 죽일 테니, 처음부터 병력을 2배(루트 2배)로 왕창 많이 보내라!"라고 지시하여 도착지에 항상 일정한 병력을 유지시키는 지독한 맞춤형 전략가입니다.