미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구
최적화에서 제일 많이 사용하는 기법
미분은 변화율의 극한(limit)으로 정의
$f'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h}$
예시$f'(x) = 2x + 2$미분을 손으로 계산하려면 일일이 $h \rightarrow 0$ 극한을 계산해야 한다
$\frac{f(x+h) - f(x)}{h} = 2x + 2 + h$
$f(x) = x^2 + 2x + 3$
최근에는, 미분을 손으로 직접 계산하는 대신 컴퓨터가 계산해준다!
sympy.diff - symbolic python
import sympy as sym
from sympy.abc import x
# poly - 다항함수
# x로 미분하겠다는 뜻
sym.diff(sym.poly(x**2 + 2*x + 3), x)
# Poly(2𝑥+2,𝑥,𝑑𝑜𝑚𝑎𝑖𝑛=ℤ)
그림으로 이해하는 미분
미분은 함수 $f$의 주어진 점 $(x, f(x))$에서의 접선의 기울기를 구한다
한 점에서 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가하는지 / 감소하는지 알 수 있다
미분값이 음수일 때 미분값을 더하면 증가, 빼면 감소
미분값이 양수일 때 미분값을 더하면 증가, 빼면 감소
즉, 증가시키고 싶으면 미분값을더하고 감소시키고 싶으면 미분값을 뺀다
미분의 쓰임
미분값을 더하면 경사상승법(gradient ascent)이라 하며 함수의 극대값의 위치 구할 때 사용
목적함수를 최대화할 때 사용
미분값을 빼면 경사하강법(gradient descent)이라 하며 함수의 극소값의 위치를 구할 때 사용
목적함수를 최소화할 때 사용
경사상승/경사하강 방법은 극값에 도달하면 움직임을 멈춘다
극값에서는 미분값이 0이므로, 더 이상 업데이트 안된다
그러므로 목적함수 최적화가 자동으로 끝난다
경사하강법 : 알고리즘
Input: gradient, init, lr, eps, Output: var
# gradient: 미분을 계산하는 함수
# init: 시작점, lr: 학습률, eps: 알고리즘 종료조건
# lr는 update 속도를 조절한다, 조심해서 제어해야한다
# 컴퓨터 계산 때, 미분값이 정확히 0이 되기 불가능하므로
# eps보다 작을 때 종료하는 조건 필요하다
var = init
while(abs(grad) > eps):
var = var - lr * grad # 미분값을 주어진 변수에서 빼준다
grad = gradient(var)
var = var - lr * grad 이 부분이 $x - \lambda f'(x)$을 계산하는 부분
각 점 $(x, y, z)$ 공간에서 $f(x, y)$ 표면을 따라 $- \nabla f$ 벡터를 그리면 아래와 같이 그려진다
극소점으로 향하는 화살표들의 움직임
함수 $f(x, y)$의 등고선(contour) 해석
gradient vector $\nabla f(x, y)$는 각 점 $(x, y)$에서 가장 빨리 증가하는 방향으로 흐르게 된다
$- \nabla f$는 $\nabla (-f)$와 같고, 이는 각 점에서 가장 빨리 감소하게 되는 방향과 같다
경사하강법 : 알고리즘
Input: gradient, init, lr, eps, Output: var
# gradient: 그레디언트 벡터를 계산하는 함수
# init: 시작점, lr: 학습률, eps: 알고리즘 종료조건
# 벡터는 절대값 대신 norm을 계산해 종료조건 설정
var = init
grad = gradient(var)
while(norm(grad) > eps):
var = var - lr * grad
grad = gradient(var)