示例#1
0

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')
示例#2
0
                            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')
示例#3
0
    # 신경망에서 찾고자 하는 파라미터의 초깃값
    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)함수를 동고선으로 표현