gradient descent

경사법

경사하강법

$$ x_{i+1} = x_i - \alpha {\operatorname{dy}\over\operatorname{dx}} $$

구현

$$ f(x) = x_2 - 2x $$ 최솟 값 구하기

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def my_func(x):  # 최솟값을 구하는 함수
    return x**2 - 2*x

def grad_func(x):  # 도함수
    return 2*x - 2

def grad_update(a=0.1,epoch=20):

    x = 4.0  # x에 초깃값을 설정
    record_x = []  # x의 기록
    record_y = []  # y의 기록
    for i in range(epoch):  # epoch회 x를 갱신한다
        y = my_func(x)
        record_x.append(x)
        record_y.append(y)
        x -= a * grad_func(x)  # (식1)

    x_f = np.linspace(-2, 4)  # 표시 범위
    y_f = my_func(x_f)  

    plt.plot(x_f, y_f, linestyle="dashed")  # 함수를 점선으로 표시
    plt.plot(record_x, record_y, 'ro')  # x와 y의 기록을 표시

    plt.title(f'({a}, {epoch})')
    plt.xlabel("x", size=14)
    plt.ylabel("y", size=14)
    plt.grid()

    plt.show()

학습률에 따른