가중치 초기화 문제는 활성화 함수의 입력값이 너무 커지거나 작아지지 않게 만들어주려는 것이 핵심이다.
초기화 설정 문제 해결을 위한 Naive한 방법으론 평균이 0, 표준 편차가 1인 표준 정규 분포를 이용해 초기화하는 방법과 평균이 0, 표준 편차가 0.01인 정규분포로 초기화하는 방법이 있다.
이번 실습에서는 각 방법으로 가중치를 초기화 해보고, 각 경우에 활성화 결괏값들의 분포가 어떻게 변화하는지 확인해자. 실습을 마치고 나면 왜 Naive한 방식으로 가중치를 초기화 해서는 안되는지 알 수 있다.
표준 정규 분포(평균이 0, 표준 편차가 1인 정규 분포)를 따르는 무작위 데이터를 만들기 위한 함수/라이브러리
- x = np.random.randn(50,20)
: 표준 정규 분포를 따르는 무작위 데이터는 위와 같이 만들 수 있다. 예시는 20개의 노드를 가진 모델에 들어갈 50개의 데이터이고, 데이터의 shape은 (50,20)으로, 배열(array) 형태이다.
import numpy as np
from visual import *
np.random.seed(100)
def sigmoid(x):
result = 1 / (1 + np.exp(-x))
return result
'''
1. 입력 데이터를 정의하세요.
2. 가중치를 정의하세요.
3. sigmoid를 통과할 값인 'a_1', 'a_2'를 정의하세요.
'''
def main():
x_1 = np.random.randn(1000,100)
x_2 = np.random.randn(1000,100)
node_num = 100
hidden_layer_size = 5
activations_1 = {}
activations_2 = {}
for i in range(hidden_layer_size):
if i != 0:
x_1 = activations_1[i-1]
x_2 = activations_2[i-1]
w_1 = np.random.randn(100,100)
w_2 = np.random.randn(100,100) * 0.01
a_1 = np.dot(x_1, w_1)
a_2 = np.dot(x_2, w_2)
z_1 = sigmoid(a_1)
z_2 = sigmoid(a_2)
activations_1[i] = z_1
activations_2[i] = z_2
Visual(activations_1,activations_2)
return activations_1, activations_2
if __name__ == "__main__":
main()
출처: 앨리스 교육
반응형