참고 도서


머신러닝을 위한 파이썬 한 조각(박성호, 2020)

정의


수치 해석학에서 수치 미분은 함수의 미분 값을 컴퓨터를 이용하여 근사치로 계산하는 방법을 뜻한다.

손으로 미분 값을 계산하기 힘들 때 컴퓨터의 도움을 받아 근사 값을 계산할 수 있다.

미분계수의 정의


미분계수 $f’(a)$는 $x=a$에서의 접선의 기울기를 나타낸다.

$f’(a) = \lim_{b \rightarrow a}{\frac{f(b)-f(a)}{b-a}}$

$b-a=h$라 하면 $b=a+h$가 되고 $b \rightarrow a$일 때 $h \rightarrow 0$이므로 다음과 같이 표현할 수 있다.

$f’(a) = \lim_{h \rightarrow 0}{\frac{f(a+h)-f(a)}{h}}$

전향 차분과 중심 차분


전향 차분

$f’(x)=\lim_{\Delta x \to 0}{\frac{f(x+\Delta x)-f(x)}{\Delta x}}$

중심 차분

$f’(x) = \lim_{\Delta x \to 0}{\frac{f(x+\Delta x) - f(x-\Delta x)}{2\Delta x}}$

근사치 설정


$\Delta x$의 값은 사용하고자 하는 언어에서 언더플로우가 발생하지 않는 적당한 선에서 결정한다.

1
dx = 1e-5 #(10^-5)

변수가 1개인 함수의 수치 미분


1
2
3
4
5
6
7
8
9
10
11
import numpy as np

def simple_derivate(f, x):
dx = 1e-5
return (f(x+dx)-f(x-dx))/(2*dx)

def f(x): # x^2
return x ** 2

ret_val = simple_derivate(f, 3.0)
print(ret_val)
1
6.000000000039306

편미분 (입력 변수가 2개 이상인 다변수 함수)


$f(x,y) = x^2 + xy + y^2$를 미분한다는 것은

특정 변수를 제외한 나머지 변수를 상수 취급하여 미분을 진행한다.

$\frac{\partial{f(x, y)}}{\partial{x}} = 2x + y$

$\frac{\partial{f(x, y)}}{\partial{y}} = x+2y$

곡면
접선의 기울기

$\frac{\partial{z}}{\partial{x}}{(1,1) = 3}$은 $y=1$ 일 때 곡면의 절단면에서 접선의 기울기이다.

다변수 함수에 대한 수치 미분 코드


$f’(1.0, 2.0)$을 계산하기 위해서는

$\to y=2.0$ 을 상수로 대입하여 $\frac{\partial{f(x, 2.0)}}{\partial{x}}$ 수행

$\to x = 1.0$ 을 상수로 대입하여 $\frac{\partial{f(1.0, y)}}{\partial{y}}$ 수행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def derivative(f, x):
dx = 1e-5
grad = np.zeros_like(x)

it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])

while not it.finished:
idx = it.multi_index

tmp_val = x[idx]

x[idx] = tmp_val + dx
fx1 = f(x)

x[idx] = tmp_val - dx
fx2 = f(x)

grad[idx] = (fx1 - fx2) / (2 * dx)

x[idx] = tmp_val
it.iternext()

return grad

def f2(W):
x, y = W
return (x ** 2 + x * y + y ** 2) # x^2 + xy + y^2

ret_val = derivative(f2, np.array([1.0, 2.0]))
print(ret_val)
1
[4. 5.]