Differentiation

soominlee·2022년 8월 4일
0

📘 mathematics for AI

목록 보기
3/3

*해당 게시글은 <NAVER boostcourse> 에서 수강한 강의를 바탕으로 정리한 내용입니다.

Differentitation, 미분

변수 값의 변화에 따른 함수 값의 변화를 측정하기 위한 도구

  • simpy.diff() 로 미분을 계산할 수 있음
  • 함수 값을 증가시키려면 변수 값에 미분 값을 더하고, 변수 값에 감소시키려면 미분 값을 빼주면 됨 → 경사하강법, 경사상승법의 원리

경사하강법 알고리즘 (Gradient Descent)

함수 값이 극솟값에 도달하면 움직임을 멈춤

Input
- gradient : 미분 계산 함수
- init : 시작점(초기값)
- lr : 학습률
- eps : 알고리즘 종료조건	#미분값이 정확하게 0이 되는것은 불가능하기 때문
Output
- var 
------------------------------------------------------------------------------
var = init
grad = gradient(var)
while (abs(grad) > eps):
	var = var - lr * grad
    grad = gradient(var)
f(x)=x2+2x+3f(x)=x^2+2x+3 의 최소점을 GD로 찾는 코드 ↓
import sympy as sym
from sympy.abc import x

# define polynominal function
def func(val):
	polynominal = sym.poly(x**2 + 2*x + 3)
    return func.subs(x, val), polynominal

def func_gradient(fun, val):
	_, function = fun(val)
    diff = sym.diff(function, x)
    return diff.sub(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, init_point)
    while np.abs(diff) > epsilon:
    	val = val - lr_rate*diff
        diff = func_gradient(func, val)
        cnt+=1
    
gradient_descent(fun=func, init_point=np.random.unifor(-2,2))
  • 변수가 벡터로 입력되는 다변수 함수인 경우 편미분(partial differentiation)을 사용함
  • 각 변수 별로 편미분을 계산한 'gradient vector'를 사용함
  • 편미분 시 경사하강법 알고리즘은 그대로 적용되며, 절대값 대신 norm을 계산해서 종료 조건을 설정함
Input
- gradient : 미분 계산 함수
- init : 시작점(초기값)
- lr : 학습률
- eps : 알고리즘 종료조건	#미분값이 정확하게 0이 되는것은 불가능하기 때문
Output
- var 
------------------------------------------------------------------------------
var = init
grad = gradient(var)
while (norm(grad) > eps):
	var = var - lr * grad
    grad = gradient(var)
profile
Soominlee

0개의 댓글