경사하강법

suhan cho·2023년 1월 2일
0

미분

  • 미분은 변수이 움직임에 따른 함수값이 변화를 측정하기 위한 도구로 최적화에서 제일 많이 사용하는 기법
  • sympy.diff로 미분 가능
import sympy as sym
from sympy.abc import x

sym.diff(sym.poly(x**2 + 2*x + 3), x)

미분의 사용

  • (x,f(x)) 에서의 접선의 기울기로 구한다
  • h를 0으로 보내게 되면 접선의 기울기가 구해진다


  • 미분값을 더해주면 증가
  • 미분값이 음수라 빼면 감소
  • 현재 방향에서 어느방향으로 가야지 증가,감소하는지 알수 있다.
    • 함수를 증가시키고 싶으면 미분값을 더하고
    • 감소시키고 싶으면 미분값을 뺀다

  • 극값에 도달하면 미분값이 0이 되어 더이상 업데이트 안 된다
input : gradient, init, lr, eps, Output: var
# gradient: 미분을 계산하는 함수, init: 시작점, lr: 학습률, eps: 알고리즘 종료조건

var = init
grad = gradient(var)
while(abs(grad) > eps) : 
	var = var - lr * grad # 경사하강법의 속도를 lr로 조절
    grad = gradient(var)

변수가 벡터일 때

  • 벡터가 입력인 다변수 함수인 경우 편미분을 사용
    • n차원공간의 점이기에 +, -로 할 수 없으므로 편미분을 사용하여 한다.
import sympy as sym
from sympy.abc import x, y

sym.diff(sym.poly(x**2 + 2*x*y + 3) * sym.cos(x + 2*y), x)
  • ei는 i번째 값에만 영향 나머지는 영향을 안 준다.(단위벡터)
    • i번째에서의 변화율만 계산할 수 있다.

  • 각 변수 별로 편미분을 계산한 gradient벡터를 이용하여 경사하강/경사상승법을 사용 가능
  • nabla를 -> gradient 벡터를 표현(다차원에서 사용하는 것)

gradient 벡터

  • 어떤점으로 가도 -▽f로 가게되면 극소점으로 이동한다
input : gradient, init, lr, eps, Output: var
# gradient: 미분을 계산하는 함수, init: 시작점, lr: 학습률, eps: 알고리즘 종료조건

var = init
grad = gradient(var)
# 경사하강법이 벡터로 사용되기에 절댓값이 아닌 노름으로 계산된다
while(norm(grad) > eps) : 
	var = var - lr * grad # 경사하강법의 속도를 lr로 조절
    grad = gradient(var)
profile
안녕하세요

0개의 댓글