앞전에서 가중치의 초기 값을 어떻게 주느냐에 따라서 결과가 달라지는 것을 보았다. 이는 적절한 가중치를 줌으로써 data의 분포가 골고루 분포되게 하는 것이 핵심이다. 초기값에 따라 결과가…
ReLU function을 사용할 때의 초깃값 앞서 본 것처럼 Xavier 초깃값은 sigmoid, tanh 같은 activation function의 미분(기울기)가 높은 구간 주변 , 즉 대칭을 이루는 중앙 부분에 …
가중치의 초깃값 중 Xavier – 초깃값에 대해 앞서 우리는 data의 distribution이 gradient vanishing 문제와 표현력을 제한하는 문제에 대해 알아보았다. 이를 통해 data의 distribution이 광범위하게 골고루…
개요 ( 생각열기 ) : 머신러닝은 어떻게 오게된 것인가? linear regression 통계학적으로 접근해보자면 우리는 어떤 현상들이라던지, 문제들에 대해 예측을 하고 싶어한다. 예를 들어 위의 linear…
발생하는 문제 우리는 신경망을 학습시킬 때 제대로 학습이 이루어지지 않거나(under fitting) 혹은 이루어진 후에 실생활에 잘 들어먹지 않을 때가 발생한다. (over fitting) under fitting은 …
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# coding: utf-8 import numpy as np import matplotlib.pyplot as plt def sigmoid(x): return 1 / (1 + np.exp(-x)) def ReLU(x): return np.maximum(0, x) def tanh(x): return np.tanh(x) input_data = np.random.randn(1000, 100) # 1000개의 데이터 node_num = 100 # 각 은닉층의 노드(뉴런) 수 hidden_layer_size = 5 # 은닉층이 5개 activations = {} # 이곳에 활성화 결과를 저장 x = input_data for i in range(hidden_layer_size): if i != 0: x = activations[i-1] # 초깃값을 다양하게 바꿔가며 실험해보자! w = np.random.randn(node_num, node_num) * 1 #w = np.random.randn(node_num, node_num) * 0.01 #w = np.random.randn(node_num, node_num) * np.sqrt(1.0 / node_num) #w = np.random.randn(node_num, node_num) * np.sqrt(2.0 / node_num) #w = np.zeros((node_num,node_num)) #w = np.ones((node_num,node_num)) #w = np.full((node_num,node_num), 5) a = np.dot(x, w) # 활성화 함수도 바꿔가며 실험해보자! z = sigmoid(a) # z = ReLU(a) # z = tanh(a) activations[i] = z # 히스토그램 그리기 for i, a in activations.items(): plt.subplot(1, len(activations), i+1) plt.title(str(i+1) + "-layer") if i != 0: plt.yticks([], []) # plt.xlim(0.1, 1) # plt.ylim(0, 7000) plt.hist(a.flatten(), 30, range=(0, 1)) plt.show() |
위의 코드는 가중치 값들의 여러가지 초기화방법과 활성화 함수 3가지를 가지고 신경망 학습을 할 때 이런 초기화 값들에 의해 데이터의 분포가 어떻게 이뤄지는지 그래프로 보여주는…
가중치의 초깃값 overfitting 이란 ? 신경망 학습에서 training data set에서는 높은 정확도를 보이는데 test data set에서는 그만큼의 정확도 보다 낮은 정확도를 가지는 현상으로, 보통 훈련…
MNIST 데이터셋으로 본 Adam, SGD, AdaGrad, Momentum 네가지 학습을 비교해본 것이다. 학습률과 신경망의 구조 등에 따라 결과가 달라진다는 점 주의. SGD보다 다른 세 기법이 빠르게…
AdaGrad 신경망 학습에서 학습을 할 때, 학습률을 너무 작게 주면 거의 움직이지 않고, 크게 주면 발산해버리는 문제가 발생한다. 얼만큼 학습률을 주어야 적절한 학습을 할 수…
Momentum : 운동량 물리와 관계가 있는 idea로
|
1 2 3 4 5 6 7 8 |
v ← αv - η * ∂L/∂W W ← W + v W : 갱신할 가중치 매개변수 ∂L/∂W : W에 대한 손실 함수의 기울기 η : 학습률 v : 속도. 기울기 방향으로 힘을 받아 물체가 가속되는 것을 나타냄 α : 마찰/저항에 해당(0.9) |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Momentum: def __init__(self,lr=0.01, momentum=0.9): self.lr = lr self.momentum = momentum self.v = None def update(self,params,grads): if self.v is None: self.v = {} for key, val in params.items(): self.v[key] = np.zeros_like(val) for key in params.keys(): self.v[key] = self.momentum * self.v[key] - self.lr * grads[key] params[key] += self.v[key] |
mometum을 모듈화한 코드다.
|
1 2 3 4 5 |
d = {1:'apple', 2 :'banana',3:'mango', 4:'fafa'} print(d) print(type(d)) for key,val in d.items(): print("key:"+str(key)+"val:"+str(val)) |
참고로 items 라는 함수는 dictionary 에서 key와 value 값을 쌍으로…