본문 바로가기
Deep Learning/밑바닥부터 시작하는 딥러닝

수치 미분

by 대소기 2022. 1. 25.

 

수치 미분

* 미분은 순간 변화량을 구하는 것과 같다. h를 0에 한없이 가깝게 할 때의 y값의 변화량을 뜻한다.

* 만약 위 수식을 쓰여있는 대로 구현하면 아래와 같을 것이다.

# 나쁜 구현의 예
def numerical_diff(f, x):
	h = 10e-50
    return (f(x + h) - f(x)) / h

 

* 위 코드는 2 가지 면에서 문제가 있다.

 

1) 컴퓨터는 부동소수점 표현을 정확히 하지 못한다. 이는 부동소수점을 그 값 그대로 계산하지 않고 근사값을 통해 계산하기 때문인데 나중에 기회가 된다면 CS 정리에 올려보도록 하겠다. python에서도 위와 같이 너무 작은 소수가 들어오면 0으로 반올림해버리는 문제가 있다. 때문에 위의 코드에서 h를 $10^{-4}$ 정도로 설정해줘야 한다. 

 

2) 위 수식은 h가 0에 한 없이 가까워질 경우를 가정한다. 하지만, 실제로 우리는 h를 0에 한없이 가까운 값으로 설정할 수가 없다. 때문에 $10^{-4}$와 같이 h가 0에 한없이 가까울 때와 비교했을 때 훨씬 큰 값을 사용하게 되는데, 이 때문에 해석적으로 미분한 결과인 기울기와 실제로 우리가 근사적으로 구할 수 있는, 수치적으로 구한 기울기는 차이가 발생한다. 

 

중심 차분

* 0과 한없이 가까운 h를 사용할 수 없기 때문에 필연적으로 발생하는 이 오차를 줄이기 위해 (x+h)와 (x-h)일 때의 함수 f의 차분을 계산하는 방법을 사용하기도 하는데, 이를 중심 차분 혹은 중앙 차분이라고 한다. 중심 차분 방법을 적용해 위 코드를 바꿔보자.

 

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

 

편미분

 

$f(x_0, x_1) = x^2_0 + x^2_1$

 

def function_2(x):
   return x[0]**2 + x[1]**2
   # 또는 return np.sum(x**2)

 

* 위와 같이 변수가 2개인 식을 graph로 구현하면 아래와 같다. 

* 변수가 2개이기 때문에 미분할 변수를 정한 뒤 나머지 변수를 고정시키고(상수값으로 보고) 변수별로 미분한다.

* 아래는 $x_0=3, x_1=4$ 일 때, 각 변수별 편미분값을 구하는 코드이다.

 

def function_tmp1(x0):
	return x0*x0 + 4.0**2.0
    
numerical_diff(function_tmp1, 3.0)
>> 6.00000000000378
def function_tmp2(x1):
	return 3.0**2.0 + x1*x1
    
numerical_diff(function_tmp2, 4.0)
>> 7.9999999999999919

 

기울기(Gradient)

* 변수 별 편미분값을 벡터로 정리한 것을 기울기라고 한다. 기울기를 구하기 위해 이번에는 변수별로 따로 편미분을 시행하지 않고 한꺼번에 시행해보자.

def numerical_gradient(f,x):
    h = 1e-4 				#0.0001
    grad = np.zeros_like(x) 		#x와 shape이 같은 배열을 생성
    
    for idx in range(x.size):
        tmp_val =x[idx]
        
        #f(x+h)계산
        x[idx] = tmp_val + h
        fxh1 = f(x)
        
        #f(x-h)계산
        x[idx] = tmp_val - h
        fxh2 = f(x)
        
        grad[idx] = (fxh1 - fxh2)/(2*h)
        x[idx] = tmp_val 			#값 복원
        
    return grad
    
numerical_gradient(function_2, np.array([3.0,4.0]))
>> array([6., 8.])

* 위 함수를 통해 (3, 4)의 기울기는 (6, 8)인 것을 알 수 있다.

* 위 그림은 각 변수 조합별 기울기에 마이너스를 붙인 벡터를 나타낸 그림이다. 각 기울기에 마이너스를 붙인 벡터는 가장 기울기가 낮은 점을 가리키는 것 처럼 보인다. 또한 기울기가 가장 낮은 지점으로부터 멀어질 수록 기울기 벡터의 크기가 커지는 것을 볼 수 있다.

 

 

'Deep Learning > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

Backpropagation  (0) 2022.01.27
경사하강법(Gradient Descent method)  (0) 2022.01.25
손실 함수  (0) 2022.01.25
신경망  (0) 2021.11.23
퍼셉트론  (0) 2021.11.17