경사하강법 (gradient descent)

이상해씨·2023년 11월 17일

미분

  • 미분(differentation) : 변수의 움직임에 따른 함수의 변화값을 측정할 수 있는 도구

  • 최적화에서 사용

  • 변화율의 극한(limit)

  • 파이썬에서 sympy.diff로 계산할 수 있음

  • 딥러닝에서도 미분 계산을 사용

import sympy as sym
from sympy.abc import x

# 다항함수 x**2 +2*x+3를 x로 미분하는 코드
sym.diff(sym.ploy(x**2 +2*x+3),x)

ploy(2*x + 2, domain ='zz')

미분의 기울기 (미분값)

  • 미분은 함수가 특정 점에서 접선의 기울기를 구한다.
    = 기울기를 알면, 함수값이 증가, 감소하는 방향을 알 수 있다.
  • 미분값이 양수 일 경우, 증가시키고 싶으면 미분값을 더하고, 감소시키고 싶으면 미분값을 뺀다.
  • 미분값이 음수일 경우, 증가시키고 싶으면 왼쪽으로 값을 이동, 오른쪽으로 이동하면 감소
  • 미분값이 음수, 양수인 것과 상관없이, 빼주면 미분값이 감소, 더하면 미분값 증가
  • 극값에서는 미분값이 0이라서 더이상 최적화가 이뤄지지 않음. 더이상 빼거나 더할 수 없음

경사상승법(gradient ascent)

  • 미분값을 더하여 함수를 극대화하는 것을 경사상승법이라고 함
  • 함수의 극대값의 위치를 구할 때 사용 (함수 최대화)

경사하강법(gredient descent)

  • 미분값을 빼주어 함수의 극솟값의 위치를 구함 (함수 최소화)
"""
init: 시작점
lr: 학습률
eps: 알고리즘 종료조건
"""

var =init 
grad= gredient(var)

# 미분값이 정확히 0이되는 것은 불가함으로 eps보다 작을 때 종료하는 조건 설정
while(abs(grad)>eps):
	# 미분값을 구해, 알고리즘의 속도 조절, 
	var=var -lr *grad
    # 미분값을 계산
    grad= gradient(var)

변수가 여러개일 경우! : 그레디언트 벡터(grediant vector)

  • 편미분(partial differentation) : 벡터가 input인 다변수 함수 일 경우 사용
  • 그레디언트 벡터를 이용하여 경사하강/ 경사상승법에 사용
  • 그레디언트 벡터 (grediant vector) : 각 변수별로 편미분을 계산한 결과
  • 가장 빨리 감소하게 되는 방향
import sympy as sym
from sympy.abc import x,y 

# 다항함수 x**2 +2*x+3를 x로 미분하는 코드
sym.diff(sym.ploy(x**2 +2*x*y+3)+sym.cos(x+2*y),x)

2*x + 2*y - sin(x+2*y)
profile
공부에는 끝이 없다

0개의 댓글