가중치 초기화의 문제를 해결하기 위해 나온 방법 중 하나인 Xavier 초기화 방법은 현재 일반적인 딥러닝 프레임워크들이 표준적으로 이용하고 있다.
Xavier 초기화 방법은 앞 레이어의 노드가 n개일 때 표준 편차가 1 / \sqrt{n}인 분포를 사용하는 것이다. 즉 표준 정규 분포를 입력 개수의 제곱근으로 나누어주면 된다.
따라서 Xavier 초기화 방법을 사용하면 앞 레이어의 노드가 많을수록 다음 레이어의 노드의 초깃값으로 사용하는 가중치가 좁게 퍼진다.
import numpy as np
from visual import *
np.random.seed(100)
def sigmoid(x):
result = 1 / (1 + np.exp(-x))
return result
def relu(x):
result = np.maximum(0,x)
return result
'''
1. 입력 데이터를 정의하세요.
2. 가중치 초깃값 설정 부분을 왼쪽 설명에 맞게 바꿔보세요.
Numpy의 연산 메서드를 사용할 수 있습니다.
3. sigmoid와 relu를 통과할 값인 'a_sig', 'a_relu'를 정의하세요.
'''
def main():
x_sig = np.random.randn(1000,100)
x_relu = np.random.randn(1000,100)
node_num = 100
hidden_layer_size = 5
activations_sig = {}
activations_relu = {}
for i in range(hidden_layer_size):
if i != 0:
x_sig = activations_sig[i-1]
x_relu = activations_relu[i-1]
w_sig = np.random.randn(100,100) * (1 / np.sqrt(node_num))
w_relu = np.random.randn(100,100) * (1 / np.sqrt(node_num))
a_sig = np.dot(x_sig, w_sig)
a_relu = np.dot(x_relu, w_relu)
z_sig = sigmoid(a_sig)
z_relu = relu(a_relu)
activations_sig[i] = z_sig
activations_relu[i] = z_relu
Visual(activations_sig, activations_relu)
return activations_sig, activations_relu
if __name__ == "__main__":
main()
출처: 앨리스 교육
반응형