미분

미분이란?

미분은 '특정 순간'의 변화량을 의미한다.
예를 들어 마라톤 선수가 10분 동안 2km 달렸을 때, 속도는 0.2 [km/분]으로 계산할 수 있다.
즉 1분에 0.2km만큼의 속도(변화)로 뛰었다고 해석할 수 있는 것이다.

미분의 수식은 아래와 같다.

 df(x)dx\displaystyle\ df(x)\over \displaystyle dx

위에서 보인 식의 의미는 x의 '작은 변화'가 함수 f(x)f(x)를 얼마나 변화시키는지를 의미한다.

수치 미분

파이썬으로 위의 식을 구현하면 아래와 같다.

def numerical_diff(f, x):
	h = 10e-50
	return (f(x+h) - f(x)) / h

numerical_diff는 함수 f와 인수 x를 인자로 받는다.
h를 가능한 0으로 무한히 가깝게 구현하기 위해 10e-50이라는 작은 값을 이용했다. 하지만 이와 같은 방식은 반올림 오차(rounding error)를 일으킨다.
반올림 오차는 작은 값(소수점 8자리 이하)이 생략되어 최종 계산 결과에 오차가 생기게 한다.

np.float32(1e-50) >> 0.0

즉 위와 같이 너무 작은 값을 이용하면 컴퓨터로 계산하는데 문제가 된다. 이를 위한 해결책은 2가지가 있다.

  1. 일반적으로 h값을 10410^{-4} 로 사용하면 좋은 결과를 얻는다고 알려져있다.
  2. 중심 차분 (=중앙 차분)을 사용한다.
  • 차분: 임의의 두 점에서의 함수 값들의 차이

진정한 미분은 x위치에서의 함수의 기울기 즉, 접선을 의미하지만
우리가 구하는 미분은 (x+h)와 x 사이의 기울기를 나타낸다.
따라서 진정한 미분과 구현 값은 엄밀히 일치하지 않는다. 이러한 차이는 h를 무한히 0으로 좁히는 것이 불가능하기 때문에 생기는 한계이다. 이와 같은 오차를 줄이기 위해 x를 중심으로 전후의 차분을 계산한다는 의미에서 중심 차분을 사용한다

중심 차분의 구현은 아래와 같다.

def numerical_diff(f, x):
	h = 1e-4
    	return (f(x+h) - f(x-h)) / (2*h)

해석적 미분, 수치 미분

  • 해석적 미분: 수식을 전개해 미분하는 것, 오차를 포함하지 않는 '진정한 미분'값을 구해줌
    ex. y=x2y=x^2
  • 수치 미분: 해석적 미분을 '근사치'로 계산하는 방법

편미분

변수가 여럿인 함수에 대한 미분을 편미분이라고 한다.
수식으로는 δfδx0\delta{f} \over \delta{x_0}

편미분은 변수가 하나인 미분과 마찬가지로 특정 장소의 기울기를 구한다. 단, 여러 변수 중에서 목표 변수 하나에 초점을 맞추고, 다른 변수는 값을 고정한다.

가령 (x0,x1)(x_0, x_1)

def numerical_gradient(f, x):
	h = 1e-4 # 0.0001
    grad = np.zeros_like(x)
    
    for i in range(x.size):
    	tmp_val = x[i]
        x[i] = tmp_val + h
        fxh1 = f(x)
        
        x[i] = tmp_val - h
        fxh2 = f(x)
        
        grad[i] = (fxh1 - fxh2) / (2*h)
        x[i] = tmp_val
        
     return grad

참고

좋은 웹페이지 즐겨찾기