본문 바로가기
Study 공부할레나

[스터디/밑시딥3] 제 1고지 미분 자동 계산_4.수치 미분

by LENA-cfg 2023. 8. 12.

4.1 미분이란

- 미분은 변화율을 말함

- 극한으로 짧은 시간(순간)에서의 변화량

** 추가 정리(미분, 도함수, 수치 미분) **

1) 미분(Differentiation)

- 미분은 어떤 함수가 주어진 시점에서 얼마나 변화하는지 측정하는 연산(=미분은 함수의 변화율을 측정하는 연산)

- 함수 f(x)의 미분은 x에 대한 변화율

- f'(x)는 f(x)의 도함수라고 부름

 

2) 도함수(Derivative)

- 도함수는 특정한 점에서 함수의 미분값을 나타냄

- 그래프 상에서, 도함수는 주어진 점에서의 접선의 기울기

- 즉, f'(x)는 점 x에서 함수 f(x)의 미분값 또는 도함수라고 함

 

3) 수치 미분(Numerical Differentiation)

- 수치 미분은 미분 값을 근사적으로 계산하는 방법

- 미세한 차이를 이용하여 함수의 변화량을 구하는 방법

- 해석적 미분(기호 미분)이 복잡하거나 불가능할 때, 수치적으로 미분값을 근사하는데 사용

- 간단한 형태의 수치 미분은 전방 차분을 사용함

 

(추가) 딥러닝에서 미분은 네트워크의 가중치를 업데이트하는데 사용되는 경사(gradient)를 계산하기 위해 필요함

즉, 비용 함수의 최솟값을 찾기 위해 경사 하강법 같은 알고리즘에 사용됨

But, 실제 딥러닝 학습 과정에서는 역전파를 사용하여 경사를 계산함

 

4.2 수치 미분 구현

- 컴퓨터는 극한을 취급할 수 없어 h를 극한한 비슷한 값 h = 0.0001(=1e-4)로 대체

- 해당 책에서 구현은 중앙차분을 사용하여 구현

 

1) 전진 차분(Forward Difference)

- 함수의 현재 위치에서 다음 위치와의 차이를 사용하여 미분을 근사함

- h가 매우 작을 때 꽤 정확할 수 있으나, 오차가 포함될 수 있음

 

2) 중앙 차분(Central Difference)

- 함수의 앞과 뒤의 위치에서의 값의 차이를 사용하여 미분을 근사함

- 전진 차분에 비해 일반적으로 더 정확한 근사값을 제공

def numerical_diff(f, x, eps=1e-4):
	x0 = Variable(x.data - eps)
    x1 = Variable(x.data + eps)
    y0 = f(x0)
    y1 = f(x1)
    return (y1.data - y0.data) / (2 * eps)
   
 f = Square()
 x = Variable(np.array(2.0))
 dy = numerical_diff(f, x)
 print(dy)

위의  numerical_diff의 계산을 그대로 따라가봤음

dy는 다시 Variable 변수에 담지않아서 값을 바로 뽑을 수 있고 데이터 타입은  np.float64

4.3 합성 함수의 미분

def f(x):
	A = Square()
    B = Exp()
    C = Square()
    return C(B(A(x)))

x = Variable(np.array(0.5))
dy = numerical_diff(f, x)
print(dy)

위처럼 함수안에 함수 = 합성 함수로 f(x)를 만들어주고

 

합성함수의 연산한 값을 y0 변수에 넣어준 후 y0.data로 메모리에서 값을 꺼내서(y1도 동일) 미분을 구해주면 된다

4.4 수치 미분의 문제점

1) 수치 미분의 결과에는 오차가 포함되어 있음

- 오차가 포함되기 쉬운 이유는 '자릿수 누락' 때문

- 중앙차분 등 차이를 구하는 계산은 주로 크기가 비슷한 값들을 다루므로 계산 결과에서 자릿수 누락이 생겨 유효 자릿수가 줄어들 수 있음

 

2) 많은 계산량

- 변수가 여러개인 계산을 미분할 경우 변수 각각을 미분해야 하기 때문

- 그래서 등장한 것이 '역전파'

- 역전파는 복잡한 알고리즘이라서 구현하면서 버그가 섞일 수 있음

그래서 역전파를 정확하게 구현했는지 확인하기 위해 수치 미분의 결과를 이용함

(단순히 수치 미분 결과와 역전파의 결과를 비교)