if __name__ == '__main__': # Nesterov 클래스의 인스턴스 생성 nesterov = Nesterov(lr=0.1) params = {'x': -7., 'y': 2.} gradients = {'x': 0.0, 'y': 0.0} # 학습하면서 파라미터(x,y)들이 업데이트되는 내용을 저장하기 위한 리스트 x_history = [] y_history = [] for i in range(30): x_history.append(params['x']) y_history.append(params['y']) gradients['x'], gradients['y'] = fn_derivative( params['x'], params['y']) # ax,ay 리턴 => gradients nesterov.update(params, gradients) print(f"({params['x'], params['y']})") x = np.linspace(-10, 10, 2000) y = np.linspace(-5, 5, 1000) X, Y = np.meshgrid(x, y) Z = fn(X, Y) mask = Z > 8 Z[mask] = 0 plt.contour(X, Y, Z, 10) plt.xlabel('x') plt.ylabel('y') plt.title('Nesterov')
np.sqrt(self.h[key] + epsilon)) * gradients[key] # 계속 이 부분에서 dict/float 이 아니라 계산이 안되는 에러가 발생했는데, self.h값에도 [key]를 줘서 element-wise 곱셈을 했다 # 컴퓨터가 계산해주는 실수 계산은 정확한 계산이 없다. 어짜피 근사값을 계산하는 것 이므로, 아주 작은 값(epsilon) 정도는 더해줘도 상관 없다 if __name__ == '__main__': adagrad = AdaGrad(lr=1.5) params = {'x': -7.0, 'y': 2.0} # parameter 초기값 gradients = {'x': 0.0, 'y': 0.0} #gradient의 초기값 x_history = [] y_history = [] for i in range(30): x_history.append(params['x']) y_history.append(params['y']) gradients['x'], gradients['y'] = fn_derivative(params['x'], params['y']) adagrad.update(params, gradients) # 파라미터 갱신 과정 출력 print(f"({params['x']}, {params['y']})") x = np.linspace(-10, 10, 2000) y = np.linspace(-5, 5, 1000) X, Y = np.meshgrid(x, y) Z = fn(X, Y) mask = Z > 7 Z[mask] = 0 plt.contour(X, Y, Z, 10) plt.title('ADA Gradient') plt.xlabel('x')
# 신경망에서 찾고자 하는 파라미터의 초깃값 params = dict() params['x'], params['y'] = init_position[0], init_position[1] # 각 파라미터에 대한 gradient gradients = dict() gradients['x'], gradients['y'] = 0, 0 # 각 파라미터 갱신 값들을 저장할 리스트 x_history = [] y_history = [] for i in range(30): x_history.append(params['x']) y_history.append(params['y']) gradients['x'], gradients['y'] = fn_derivative( params['x'], params['y'] ) #fn_derivative returns a tuple of (x에 대한 편미분, y에 대한 편미분) # module01의 fn(x,y)을 사용 # 최초에 (-7, 2)을 넣고, x와 y에 대한 편미분을 각각 해주면서 새로운 gradients를 구한다 # (-7,2) -> (0.7, 4) ... 이런식으로 param x와 y가 갱신된다 # X = X - lr * af/ax, Y = Y - lr * af/ay sgd.update(params, gradients) # print(x_history) # print(y_history) # 값들이 0에 가까워진다 # (x,y) 다시 출력 for x, y in zip(x_history, y_history): print(f'({x}, {y})') # 최솟값(0,0)을 찾아가는 중,,, # f(x,y)함수를 동고선으로 표현