반응형
미분(differentiation)
- 변수의 움직임에 따른 함수 값의 변화를 측정하는 도구
- 최적화에서 제일 많이 사용하는 기법
- 파이썬의 sympy를 사용하면 미분을 계산 가능
import sympy as sym
sym.diff(sym.poly(x**2 + 2*x +3), x)
-> 2x + 2
- 함수값을 증가시키고 싶다면 미분값을 더함
- 함수값을 감소시키고 싶다면 미분값을 뺌
- 경사 상승법(gradient ascent): 미분값을 더하면서 함수의 극대값을 구할 때
- 경사 하강법(gradient descent): 미분값을 빼면서 함수의 극소값을 구할 때
- 극 값에 도달하게 되면 움직임이 멈춤
- 편미분: 벡터가 입력인 다변수 함수의 경우 사용되는 미분방법
- 그레디언트 벡터: d차원 벡터를 입력으로 갖는 함수는 편미분을 d개만큼 했을 때 나오는 벡터
- nabla(∇): 그레디언트 벡터를 나타내는 기호
(이미지 출처: boostcourse AI Tech Precourse) - 경사하강법 알고리즘
# gradient: 그레디언트 벡터를 계산하는 함수
# init: 시작점, lr: 학습률, epa: 알고리즘 종료조건(0은 불가능하기때문에 최소 값에대한 조건이 필요함)
var = init
grad = gradient(var)
while(norm(grad) > eps):
var = var - lr*grad
grad = gradient(var)
- 경사하강법 알고리즘 따라 써보기
def eval_(fun, val):
val_x, val_y = val
fun_eval = fun.subs(x, val_x).subs(y, val_y)
return fun_eval
def func_multi(val):
x_,y_ = val
func = sym.poly(x**2 +2*y**2)
return eval_(func, [x_,y_]), func
def func_gradient(fun,val):
x_,y_ = val
_, function = fun(val)
diff_x = sym.diff(function, x)
diff_y = sym.diff(function, y)
grad_vec = np.array([eval_(diff_x, [x_,y_]), eval_(diff_y, [x_, y_])], dtype=float)
return grad_vec, [diff_x, diff_y]
def gradient_descent(fun, init_point, lr_rate=le-2, epsilon=le-5):
cnt = 0
val = init_point
diff, _ = func_gradient(fun,val)
while np.linalg.norm(diff) > epsilon:
val = val - lr_rate*diff
diff, _ = func_gradient(fun, val)
cnt+=1
print(f"함수: {fun(val))[1], 연산횟수: {cnt}, 최소점 {val}, {fun(val)[0]} ")
pt = [np.random.uniform(-2,2), np.random.uniform(-2,2)]
gradient_descent(fun = func_multi, init_point*pt)
반응형
'부스트캠프 AI Tech 2기 > Precourse' 카테고리의 다른 글
Pandas (2) (0) | 2021.07.25 |
---|---|
Pandas (1) (0) | 2021.07.25 |
행렬에 대해서 (0) | 2021.07.21 |
벡터에 대해서 (0) | 2021.07.21 |
Numpy (0) | 2021.07.20 |