본문 바로가기
[ 딥러닝 ]

가중치 초기화 (Weight Initialization)

by 불주먹고양이 2023. 5. 31.

신경망 학습의 목적은 손실함수 값을 줄이는 것인데, 이는 파라미터의 최적화를 통해서 이뤄진다.

그렇다면 가중치 파라미터의 초기값은 어떻게 설정해두어야 할까?

 

1. 가중치 초기값이 중요한 이유

가중치 초기값을 어떻게 설정하는지에 따라서 학습이 잘 될 수도, 그렇지 않을 수도 있다.

 

출처 : https://medium.com/coinmonks/loss-optimization-in-scientific-python-d1efbbe87171

같은 손실함수여도 가중치 초기값을 어떻게 설정하는지에 따라서 minimum이 달라진다.

 

 

 

2. 가중치는 적당히 작아야 한다.

가중치가 크면 오버피팅이 일어날 가능성이 높다.

가중치의 개수가 많으면 오버피팅이 일어날 것이라고 생각했는데, 그것도 맞지만 크기 자체도 너무 크면 과적합이 일어난다고 한다.

사실 이 부분에서 이해가 잘 안되어서 chat GPT 한테 물어보았다.

가중치 매개변수의 크기가 작다는 것은, 해당 가중치가 나타낼 수 있는 숫자의 범위가 좁다는 것이고, 그로 인해서 표현할 수 있는 범위를 줄이는 것이다.

 

 

 

3. 가중치 매개변수를 전부 0으로 만들면 어떨까?

이 방법은 매우 올바르지 않은 방법이다. 0으로 초기화하는 것 뿐만 아니라 균일한 값으로 초기화하는 것에 문제가 있는데,

 

모든 은닉층들이 같은 값이나 대칭적인 값을 가지면 모든 노드의 활성화 함수에 같은 값 혹은 대칭적인 값이 입력된다는 것이다. 그러다보면 역전파 과정에서 똑같은 값으로 갱신되기 때문에, 가중치를 여러 개 둘 필요가 없어진다.

즉, 노드의 낭비가 일어난다!

 

따라서 가중치의 대칭적인 구조를 무너뜨리기 위해서 초기값을 무작위적으로 설정하는 것이 필요하다.

 

 

 

4. 가중치 매개변수를 랜덤하게 초기화하면 되는가?

이를 살펴보기 위해서는 은닉층에서 사용하는 활성화 함수인 Sigmoid를 살펴보아야 한다.

 

(1) 평균이 0이고 표준편차가 1인 정규분포를 따르는 가중치 값들로 초기화 했을 때

각 층의 활성화 함수 출력값 결과는 0과 1에 치우쳐져 있는 것을 볼 수 있다.

이렇게 활성화 함수 출력값 결과가 0과 1에 몰려있으면 그 지점에서의 기울기가 0에 가깝다는 뜻이다.

이는 기울기 소실 (Gradient Vanishing) 문제를 야기할 수 있다.

 

 

(2) 평균이 0이고 표준편차가 0.01인 정규분포를 따르는 가중치 값들로 초기화 했을 때

기울기 소실이 될 가능성은 덜해졌지만, 활성화 값들이 0.5에 몰려있다.

이는 가중치 매개변수를 특정한 값으로 설정했을 때와 동일한 결과를 낳는다! 즉, 노드가 낭비된다.

(100개의 노드가 0.5를 출력하거나 1개의 노드가 0.5를 출력하거나 학습에서 동일한 효과이다.)

 

정리해보면,

(1)의 경우에는 기울기 소실의 결과가,

(2)의 경우에는 표현력 제한의 결과가 나타난다.

 

 

 

5. 가중치 초기화는 어떻게 되어야 할까?

활성화 값은 '적당히', '고르게' 분포되어야 한다.

적당히 다양한 데이터가 흘러야지만 활성화 값들이 광범위하게 분포되게 할 수 있고, 또 효율적인 학습이 가능해진다.

 

 

 

6. Xavier Initialization

Sigmoid에서 활성화 값들을 고르게 분포되게 해주는 초기 가중치 값이다.

더 일반적으로 말하자면, 활성화 함수가 선형일 때 사용한다.

예를 들면, sigmoid나 tanh와 같은 함수이다.

 

앞 계층의 노드가 n개라면, 표준편차가 1/sqrt(n) 인 분포를 사용한다.

즉, 앞 계층의 노드 개수가 많을 수록 가중치의 표준편차는 작아진다.

층이 깊어질수록 분포가 일그러지는 모습인데, 그 이유는 Sigmoid 함수가 (0, 0.5) 좌표를 기준으로 대칭이기 때문이다.

이를 해결하기 위해서는 Sigmoid 함수 말고 tanh 함수를 사용하면 된다. tanh 함수는 (0, 0) 좌표를 기준으로 대칭이다.

 

 

 

7. He Initialization

ReLU와 같은 비대칭적 함수에서 사용하는 초기값이다.

 

앞 계층의 노드가 n개라면, 표준편차가 sqrt(2/n) 인 분포를 사용한다.

Xavier보다 더 넓은 영역인데, 그 이유는 ReLU 함수의 음의 영역 값이 0이기 때문이다.

 

참고)

ReLU 함수를 사용할 때, Xavier 초기화를 적용해보면, 입력 데이터가 계층을 통과하면서 분산이 점점 줄어들어 출력이 0이 된다.