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

[스터디/밑시딥3] 제 2고지 자연스러운 코드로_24. 복잡한 함수의 미분

by LENA-cfg 2023. 8. 30.

이번 단계에서 다루는 함수는 최적화 문제에서 자주 사용되는 테스트 함수입니다.

위키백과의 'Test functions for optimization' 페이지에 있는 3개의 함수를 선택하여 실제 미분합니다.

 

24.1 Sphere 함수

Sphere 함수를 수식으로 표현하면 z = x**2+y**2입니다. 

단순히 두 개의 입력 변수를 제곱하여 더하는 함수입니다.

 

이 함수를 가지고 미분을 계산합니다. 

if '__file__' in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import numpy as np
from dezero import Variable


def sphere(x, y):
    z = x ** 2 + y ** 2
    return z

x = Variable(np.array(1.0))
y = Variable(np.array(1.0))
z = sphere(x, y)
z.backward()
print(x.grad, y.grad)

x, y의 각각의 미분값은 ∂z/∂x = 2x,  ∂z/∂y = 2y가 되므로 (x, y) = (1.0, 1.0)의 미분 결과는 (2.0, 2.0)입니다. 

 

24.2 matyas 함수

matyas 함수의 수식은 z = 0.26(x**2 + y**2) - 0.48xy이며, DeZero로는 아래 처럼 구현할 수 있습니다.

if '__file__' in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import numpy as np
from dezero import Variable


def matyas(x, y):
    z = 0.26 * (x ** 2 + y ** 2) - 0.48 * x * y
    return z

x = Variable(np.array(1.0))
y = Variable(np.array(1.0))
z = matyas(x, y)
z.backward()
print(x.grad, y.grad)

 

24.3 Goldstein-Price 함수

Goldstein-Price 함수를 수식으로 표현하면 위의 그림처럼 되고 꽤 복잡해 보이지만 

코드 구현은 생각보다 쉽게 구현할 수 있었습니다.

if '__file__' in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import numpy as np
from dezero import Variable


def goldstein(x, y):
    z = (1 + (x + y + 1)**2 * (19 - 14*x + 3*x**2 - 14*y + 6*x*y + 3*y**2)) * \
        (30 + (2*x - 3*y)**2 * (18 - 32*x + 12*x**2 + 48*y - 36*x*y + 27*y**2))
    return z


x = Variable(np.array(1.0))
y = Variable(np.array(1.0))
z = goldstein(x, y)
z.backward()
print(x.grad, y.grad)

goldstein 함수를 미분해보면 아래의 값이 나옵니다.