본문 바로가기
Data Science/문과생도 이해하는 딥러닝

문과생도 이해하는 딥러닝 (9) - 신경망 초기 가중치 설정

by 싸코 2018. 1. 7.


2017/09/27 - 문과생도 이해하는 딥러닝 (1) - 퍼셉트론 Perceptron

2017/10/18 - 문과생도 이해하는 딥러닝 (2) - 신경망 Neural Network

2017/10/25 - 문과생도 이해하는 딥러닝 (3) - 오차 역전파, 경사하강법

2017/12/24 - 문과생도 이해하는 딥러닝 (4) - 신경망구현, 활성화함수, 배치

2017/12/26 - 문과생도 이해하는 딥러닝 (5) - 신경망 학습 실습

2018/01/05 - 문과생도 이해하는 딥러닝 (6) - 오차역전파법 실습 1

2018/01/05 - 문과생도 이해하는 딥러닝 (7) - 오차역전파법 실습 2

2018/01/07 - 문과생도 이해하는 딥러닝 (8) - 신경망 학습 최적화




이전 포스팅에서는 최적화 기법들을 살펴보면서 최적의 가중치 매개변수를 찾기 위해 어떤 것들을 사용하는지 알아보았다. 확률적 경사하강법 이외에도 다양한 방법으로 적절한 기울기 값을 구하고 손실함수가 낮아지는 방향으로 계산(또는 학습)하는 방법들이 있으며 자신의 문제에 따라 적합한 방법을 사용하는 것이 좋다.


최적화 만큼 초기 신경망의 가중치 값을 어떻게 설정하느냐도 상당히 중요한 문제이다. 초기값을 무엇으로 하느냐에 따라서 학습의 성패가 결정나기도 한다.



신경망 초기 가중치 설정

문과생도 이해하는 딥러닝 (9)


가중치 초깃값을 0으로 하면?

가중치의 초기값을 0으로 default를 주고 시작하면 올바른 학습을 기대하기 어렵다. 오차역전파에서 가중치의 값이 똑같이 갱신되기 때문이다. 가중치가 각각 영향이 있어야 하는데 고르게 되어버리는 상황이 발생하면 각각의 노드를 만든 의미를 잃어버리게 된다. 그래서 다른 샘플 코드나 예제를 보면 np.random.randn()을 사용하여 무작위로 가중치를 설정하는 것을 볼 수 있다.


1. Sigmoid 가중치 초깃값 설정 : Xavier

표준편차가 1

활성화함수가 시그모이드 함수인 경우 활성화 값이 0과 1에 주로 분포되어 있다. 이는 시그모이드 함수의 미분 값이 0에 가까워지도록 한다. 따라서 역전파의 기울기 값은 점점 작아지다가 사라지는 Gradient Vanishing 문제가 발생하며 층이 깊어질수록 기울기는 더 사라진다.



표준편차가 0.01

기울기가 사라지는 문제는 발생하지 않았으나 0.5 주변으로 값이 여전히 치우쳐있기 때문에 뉴런을 다수 사용한 이점이 없다. 뉴런 100개가 똑같은 값을 출력한다면 100개가 다 필요한 이유가 없다.




Xavier 초기값

Xavier Glorot & Yoshua Bengio의 논문에서 권장하는 가중치 초기값.

앞 층의 입력 노두 수에 더하여 다음 계층의 출력 노드 수를 함께 고려하여 초기값을 설정하는 방법

아래 그래프를 보면 앞의 두 방식보다 고르게 분포되어 학습이 효율적으로 이루어질 수 있음을 엿볼 수 있다. 시그모이드 함수를 사용했음에도 표현력의 문제가 발생하지 않는다.

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.random.randn(1000, 100)
node_num= 100
hidden_layer_size = 5
activations ={}

for i in range(hidden_layer_size):
    if i != 0:
        x = activations[i-1]
        
    w = np.random.randn(node_num, node_num) / np.sqrt(node_num)
    
    a = np.dot(x, w)
    z = sigmoid(a)
    activations[i] = z
    
fig = plt.figure(figsize=(10,2))
for i, a in activations.items():
    plt.subplot(1, len(activations), i+1)
    plt.title(str(i+1) + "-layer")
    plt.yticks([],[])
    plt.hist(a.flatten(), 30, range=(0,1))
plt.show()



2. ReLU 가중치 초깃값 설정 : He

He 초깃값은 ReLU에 특화된 초깃값이다.

계층의 노드가 n개 일 때 표준편차  인 정규분포를 사용


ReLU는 음의 영역은 0을 출력하는 활성화함수로 정규분포 표준편차를 사용하거나 Xavier를 사용할 경우 Hidden Layer의 계층이 깊어질수록 가중치의 값이 0으로 수렴하여 가중치가 사라지는 Gradient Vanishing 문제가 발생한다.



3. 활성화함수 별 가중치 초기값 설정 방식에 따른 활성화값 분포 비교

Sigmoid 함수 - Std 0.01, Xavier, He



ReLU 함수 - Std 0.01, Xavier, He


ReLU함수에서 가중치 초기값 설정 방식에 따른 가중치 분포를 확인하면, He가 가장 고르게 나타나는 것을 확인할 수 있다.
표준편차를 0.01로 한 경우 층이깊어질수록 가중치가 0으로 사라진 것을 볼 수 있으며, Xavier 역시 초반 

Tanh 함수 - Std 0.01, Xavier, He




4. 예제: MNIST 데이터셋으로 가중치 초깃값 비교


ReLU를 활성화함수로 했을 때 초기 가중치 설정에 따른 결과는 위와 같다. 표준정규분포 0.01로 했을 때 학습이 전혀이루어지고 있지 않음을 알 수 있다. 이는 앞에서 보았던 기울기가 0에 가까워져 발생하는 현상이다. 순전파에서 전파할 때 0에 가까웠기 때문에 역전파 시에도 기울기(미분의 값)가 작아져 가중치가 거의 갱신되지 않는 것이다.

위 그래프를 보면 He 초기값을 사용했을 때 학습의 진도가 가장 빨랐음을 알 수 있다. 


댓글