Numerical Differentiation

$f(x) = x^2$ 을 미분해서 $f'(x) = 2x$로 구하는 것을 '해석적 해' 혹은 '해석적으로 미분한다'라고 함.
이와 달리 수치 미분은 실제 미분 공식($\Delta$ 사용해서 표현하는 것)에 맞게 '근사치'로 함수의 미분값을 구하는 것임.
수치미분에서는 오차를 최소화 하기 위해 미분 공식처럼 x+h와 x사이의 함수 f의 차분을 계산하지 않고, x-h와 x+h사이의 차분을 계산함.
파이썬으로 구현해 보면,
def numerical_diff(f, x):
    h = 1e-4 # 0.0001
    return (f(x+h) - f(x-h)) / (2*h)
위와 같음. 이를 경사하강법에 응용하기 위해 전미분이 되는(넘파이 배열 x에 대해 각 x에 대한 기울기를 구하는) 함수를 구현하면,
import numpy as np
def numerical_gradient(f, x):
    h = 1e-4 # 0.0001
    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] = float(tmp_val) + h
        fxh1 = f(x) # f(x+h)
        
        x[idx] = tmp_val - h 
        fxh2 = f(x) # f(x-h)
        grad[idx] = (fxh1 - fxh2) / (2*h)
        
        x[idx] = tmp_val # 값 복원
        it.iternext()   
        
    return grad
위와 같이 구현 가능함.

댓글

이 블로그의 인기 게시물

Loss Function

Backpropagation

SGD = Stochastic Gradient Descent