2022. 1. 22. 16:15ㆍAbout Me/AI Tech
경사하강법은 현재 지점에서의 미분을 계산해야 하므로, 미지수가 있는 식을 표현하거나 미분값을 계산할 수 있어야 한다.
Python에는 수학의 미지수 등의 기호를 사용하게 해주는 SymPy library가 있다.
문제 1. 이차함수의 최소값 찾기
알고리즘을 설명하자면 다음과 같다.
- 2차 함수식이 주어질 때, 시작점을 지정한다.
- 해당 시작점에서의 기울기 값을 계산하여, 현재 지점을 update하면서 최저점을 찾아나간다.
여기서 기울기 값이 양수라면 x값을 작게하고, 음수라면 x값을 크게해야 최저점으로 갈 수 있다.
특정 지점에서 기울기(미분) 값을 계산하는 방법은 다음과 같다.
1. sympy.diff()로 x에 대해 미분한 함수식(도함수)를 구한다.
2. 미분에 대한 정의를 토대로,
h를 0에 가장 가까운 작은 상수값으로 지정하여 f(x+h) - f(x)) / h 를 계산한다.
import numpy as np
import sympy as sym
from sympy.abc import x
from sympy.plotting import plot
def func(val): # 함수 식
fun = sym.poly(x**2 + 2*x + 3)
return fun.subs(x, val), fun
def func_gradient(fun, val): # 도함수 식
_, function = func(val)
diff = sym.diff(function, x)
return diff.subs(x, val), diff
def gradient_descent(fun, init_point, lr_rate=1e-2, epsilon=1e-5):
cnt = 0
val = init_point
diff, _ = func_gradient(fun, val)
# 함수의 최소점(optimal point) 근처로 충분히 가까이 올 때까지 loop
while np.abs(diff) > epsilon:
val = val - lr_rate * diff
diff, _ = func_gradient(fun, val)
cnt += 1
print("함수: {}\n연산횟수: {}\n최소점: ({}, {})".format(fun(val)[1], cnt, val, fun(val)[0]))
gradient_descent(fun = func, init_point = 3)
문제 2. 선형함수의 식 찾기
알고리즘을 설명하자면 다음과 같다.
- 가중치와 절편을 초기화해둔다.
- 선형함수 해답과 예측값의 차이 값들의 평균으로 가중치와 절편을 update해나간다.
여기서 선형함수 해답과 예측값의 차이의 제곱의 평균을 error값으로 볼 수 있다.
선형함수 식을 찾기 위해 데이터로 학습하는 방법은 다음과 같다.
- 주어진 모든 데이터를 사용하면서 학습한다. error값 추이를 확인하면 완만한 곡선으로 수렴한다.
- 랜덤한 일부의 데이터를 사용하면서 학습한다. error값 추이를 확인하면 삐쭉빼쭉하지만 빠르게 수렴한다.
참고 :
https://imomelet.tistory.com/107
https://imomelet.tistory.com/105
'About Me > AI Tech' 카테고리의 다른 글
[Week 2- Day 2] 회고 (0) | 2022.01.25 |
---|---|
[Week 2- Day 1] 회고 (0) | 2022.01.24 |
[Week 1- Day 5] 회고 (0) | 2022.01.21 |
[Week 1- Day 4] 회고 (0) | 2022.01.21 |
[Week 1- Day 3] 회고 (0) | 2022.01.21 |