julia coding story

[Deep Learning from Scratch] 신경망 학습(2) - 수치 미분 본문

소프트웨어/Deep Learning (딥러닝)

[Deep Learning from Scratch] 신경망 학습(2) - 수치 미분

julia-biolat 2023. 1. 9. 02:44
728x90

미분

미분 수식

▶ 나쁜 구현 예시

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

- 개선점

1) h에다가 작은 값을 넣으려고  h = 1e-50로 설정하였는데, 여기에서 반올림 오차(rounding error)발생함 -> 1e-4정도로 이용

2) 미분은 (x + h)와 x 사이의 기울기에 해당함, 엄밀히는 일치하지 않음, 이는 h를 무한히 0으로 좁히는 것이 불가능해 새익는 한계임 -> 중심(중앙) 차분을 계산함

 

▶ 개선한 코드

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

 

수치미분

- 수치 미분 : 아주 작은 차분으로 미분하는 것

- 해석적 : 수식을 전개해 미분하근 것

 

수치 미분 예시

# coding: utf-8
import numpy as np
import matplotlib.pylab as plt


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


def function_1(x):
    return 0.01*x**2 + 0.1*x 


def tangent_line(f, x):
    d = numerical_diff(f, x)
    print(d)
    y = f(x) - d*x
    return lambda t: d*t + y
     
x = np.arange(0.0, 20.0, 0.1)
y = function_1(x)
plt.xlabel("x")
plt.ylabel("f(x)")

tf = tangent_line(function_1, 5)
y2 = tf(x)

plt.plot(x, y, label = "function_1")
plt.plot(x, y2, label = "gradient")
plt.legend()
plt.show()

print(numerical_diff(function_1,5))	#1.9999999999908982e-09
print(numerical_diff(function_1,10))	#2.999999999986347e-09

편미분

: 변수가 여럿인 함수를 미분하는 것

편미분 예시

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

문제1. x0 = 3, x1 = 4일 때, x0에 대한 편미분을 구하는 코드

왜 밑에 꺼 처럼 안됨?????????/개얼택

import numpy as np
import matplotlib.pylab as plt


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

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

x = [3.0,4.0]
numerical_diff(function2(x), x[0])

문제2. x0 = 3, x1 = 4일 때, x1에 대한 편미분을 구하는 코드