-
Gradient_descent(경사 하강법)머신러닝(MACHINE LEARNING)/간단하게 이론(Theory...) 2021. 4. 22. 01:12반응형
경사 하강법 ( Gradient descent)은 1차 근삿값 발견용 최적화 알고리즘 이다. 기본 개념은 함수의 기울기 (경사)를 구하고 경사의 절댓값이 낮은 쪽으로 계속 이동시켜 극값 에 이를 때까지 반복시키는 것이다. -네이버 백과사전-
사전적 의미는 위와 같지만, 좀 더 쉽게 말하자면, 2차방정식에서 배울때, 미분값이 0 인 지점을 구하면, 극소 또는 극대가 되는 점인 걸 상기시켜서, 극값(극소, 극대) 에 가기 위하여, 기울기에 해당하는 변화율을 계속 적용시키는 것이다.
장점은 구현하기 쉽지만, Learning_rate을 직접 설정해주어야 하는 단점과, 출발지점이 올바르지 않을 경우, 이또한 극소 극대가 잘 안구해진다는 단점이 있다.
Code 구현을 살펴보자
1. X 와 X^2 에 해당하는 그래프 PLOT
In [1]:import numpy as np import matplotlib.pyplot as plt
In [2]:x = np.arange(-10,10,1) f_x = x**2 plt.plot(x,f_x) plt.show()
2. Derivative 구현
In [6]:x_new = 10 derivative = [] y = [] learning_rate = 0.1 for i in range(100): # 여기서 derivative 는 x^2 을 미분한 값 2*x 에 해당하는 변화율을 빼서 계속 최신화 # 마찬가지로 y 값도 최신화 old_value = x_new derivative.append(old_value-learning_rate*2*old_value) x_new = old_value-learning_rate*2*old_value y.append(x_new**2)
In [8]:plt.plot(x,f_x) plt.scatter(derivative,y) plt.show()
In [38]:def sin_function(x): return x*np.sin(x**2)+1 # sin_function(x) 를 미분한 값 def derivitive_f(x): return np.sin(x**2) + 2*(x**2) * np.cos(x**2)
In [39]:x = np.arange(-3,3,0.001) f_x = sin_function(x)
In [40]:plt.plot(x,f_x) plt.show()
In [41]:derivitive_f(3)
Out[41]:-15.988226228682427
3. 출발지점에 따른 단점 비교
In [45]: (learning_rate 가 너무 작아 극소점을 찾지 못한다.)x_new = 1 derivative = [] y = [] learng_rate= 0.01 for i in range(10000): old_value = x_new x_new = old_value - learng_rate * derivitive_f(old_value) derivative.append(x_new) y.append(sin_function(x_new)) plt.plot(x, f_x) plt.scatter(derivative, y) plt.show()
In [46]:x_new = 2.5 derivative = [] y = [] learng_rate= 0.01 for i in range(10000): old_value = x_new x_new = old_value - learng_rate * derivitive_f(old_value) derivative.append(x_new) y.append(sin_function(x_new)) plt.plot(x, f_x) plt.scatter(derivative, y) plt.show()
반응형'머신러닝(MACHINE LEARNING) > 간단하게 이론(Theory...)' 카테고리의 다른 글
Decision Tree 에서의 ID3 알고리즘 (0) 2021.04.25 간단한 LinearRegression 으로 Boston_price 예측 (1) 2021.04.22 Gradient_descent 으로 구현한 Linear_Regression (0) 2021.04.22 Train_Test_Split & Holdout Sampling (0) 2021.04.22 Normal Equation(정규방정식) (0) 2021.04.19