신경망의 성능은 가중치(weight)를 어떻게 초기화하느냐에 크게 좌우된다. 2006년 힌튼 교수가 딥 러닝의 성능을 개선하기 위한 4가지 핵심 요소 중 하나로 가중치 초기화를 언급했을 정도로 이 문제는 중요하다. 올바른 가중치 초기화 방법을 이해하기 위해 주요 개념들을 살펴보자.
가중치 초기화는 신경망 학습의 시작점을 결정한다. 적절한 초기화는 코스트를 효과적으로 줄이는 방향으로 학습을 유도하지만, 잘못된 초기화는 학습이 전혀 다른 방향으로 진행되어 성능이 크게 저하될 수 있다.
일반적으로 바이어스(bias)는 큰 영향을 미치지 않기 때문에 0으로 초기화하고, 가중치의 초기화에 집중하는 것이 일반적이다.
모든 가중치를 0이나 동일한 값으로 초기화하면 모든 뉴런이 같은 계산을 수행하게 된다. 이로 인해:
각 층의 모든 뉴런이 동일한 값을 출력
모든 가중치에 대한 그래디언트가 같아짐
학습이 끝나도 모든 뉴런이 동일한 특징(feature)만 감지
결국 깊은 신경망의 장점을 완전히 상실
실질적으로 이는 신경망을 선형 모델처럼 만들어 복잡한 패턴을 학습할 수 없게 한다.
가중치를 랜덤하게 초기화할 때도 분산(표준편차)을 적절히 설정해야 한다:
1) 표준편차가 너무 큰 경우(예: 1.0):
가중치 합(weighted sum)이 너무 커짐
활성화 함수(시그모이드)의 출력이 0 또는 1에 가까워짐
그래디언트 소실 문제 발생
2) 표준편차가 너무 작은 경우(예: 0.005):
가중치 합이 0에 가까워짐
모든 뉴런의 출력이 0.5에 집중됨
뉴런들이 다양한 특징을 감지하지 못함
이상적인 초기화는 각 층의 뉴런들이 적절히 분산된 출력을 갖게 하여 다양한 특징을 감지할 수 있도록 한다. 주요 방법들은 다음과 같다:
Xavier Glorot이 제안한 방법으로, 시그모이드나 하이퍼볼릭 탄젠트 같은 활성화 함수에 적합하다.
1) 정규분포(Normal) 사용 시:
표준편차 = √(2/(n_in + n_out))
n_in: 입력 뉴런 수, n_out: 출력 뉴런 수
2) 균등분포(Uniform) 사용 시:
범위 = [-√(6/(n_in + n_out)), √(6/(n_in + n_out))]
이 방법은 순전파와 역전파 모두 적절한 분산을 유지하도록 설계되었다.
ReLU 활성화 함수에 더 적합한 방법으로, Kaiming He가 제안했다.
1) 정규분포 사용 시:
표준편차 = √(2/n_in)
2) 균등분포 사용 시:
범위 = [-√(6/n_in), √(6/n_in)]
Yann LeCun이 제안한 방법으로, 다른 방법들의 기초가 되었다.
1) 정규분포 사용 시:
표준편차 = √(1/n_in)
2) 균등분포 사용 시:
범위 = [-√(3/n_in), √(3/n_in)]
Xavier 초기화가 어떻게 도출되었는지 살펴보면:
1. 각 층의 활성화 값들과 그래디언트 값들의 분산을 일정하게 유지하는 것이 목표
2. 순전파 시 활성화 값들의 분산이 층간에 유지되어야 함
3. 역전파 시 그래디언트 값들의 분산이 층간에 유지되어야 함
이를 위한 조건을 수학적으로 풀면:
순전파 조건: n_in * Var(W) = 1
역전파 조건: n_out * Var(W) = 1
이 두 조건을 동시에 만족시키기 위해 두 식을 더하면:
(n_in + n_out) * Var(W) = 2
따라서:
Var(W) = 2/(n_in + n_out)
정규분포의 경우 표준편차는 분산의 제곱근이므로:
σ = √(2/(n_in + n_out))
시그모이드/탄젠트 활성화 함수를 사용할 때는 Xavier/Glorot 초기화
ReLU 활성화 함수를 사용할 때는 He 초기화
가중치 초기화를 통해 각 층의 뉴런 출력이 적절히 분산되도록 하는 것이 핵심
초기화 방법은 모델 구조와 활성화 함수에 따라 달라질 수 있으므로, 필요에 따라 다른 방법을 시도해볼 것
올바른 가중치 초기화는 딥 러닝 모델의 성능과 학습 효율성을 크게 향상시키는 기본이자 필수적인 요소이다.