본문 바로가기
Python/python 응용: 수학 및 과학

함수의 경사도(gradient) 구하기

by 철이88 2023. 4. 18.
반응형

이번에는 함수의 경사도를 수치적으로 계산하는 python 코드를 만들어 보겠습니다. 이 코드에서는 수치 미분을 위해 중앙 차분 (미분값을 구하는 x의 전후의 차분, 즉 x − h와 x + h)을 이용합니다. 

 

1. gradient 함수 만들기

먼저 만들어진 python 코드를 보겠습니다.

import numpy as np

def numerical_gradient(f, x):
    h = 1e-4 #차분(difference)의 크기
    grad = np.zeros_like(x) 

    for idx in range(x.size):
        tmp_value = x[idx] #계산을 위한 임시값
        
        x[idx] = tmp_value + h
        fxh1 = f(x)

        x[idx] = tmp_value - h
        fxh2 = f(x)

        grad[idx] = (fxh1 -fxh2) / (2*h)
        x[idx] = tmp_value
    
    return grad

이 코드는 주어진 함수 f(x)에 대한 수치적인 gradient를 계산하는 함수입니다.

먼저 수치적 gradient를 계산하기 위해 h(변화량)를 0.0001로 설정합니다.

그리고 np.zeros_like()은 x와 같은 형태를 가지고 0으로 채워진 배열(grad)을 만듭니다.

그다음, x의 각 차원에 대해 순서대로 반복하며 수치적 gradient를 계산합니다. 

여기서 idx는 현재 처리 중인 차원의 인덱스를 나타냅니다.

tmp_value 변수에 현재 처리 중인 차원의 값을 저장하고, x[idx] 값에 h를 더한 다음, f(x)를 호출하여 그 차원에서의 f(x)의 변화량을 계산합니다. 이것을 fxh1에 저장합니다.

다음으로, x[idx] 값에 h를 뺀 다음, f(x)를 호출하여 그 차원에서의 f(x)의 변화량을 계산합니다. 이것을 fxh2에 저장합니다.

그다음, (fxh1 - fxh2) / (2*h)로 수치적 gradient를 계산합니다. 이 값을 grad[idx]에 저장합니다.

마지막으로, tmp_value에 저장된 값으로 x[idx] 값을 복원합니다.

 

이렇게 모든 차원에서 수치적 gradient를 계산한 후, grad 배열을 반환합니다.

 

2. 예시 함수 만들기

이제 gradient를 구하고자 하는 함수를 더해 보겠습니다.

위 코드에 연결해서 아래의 코드를 작성합니다.

def function_1(x):
    return np.sqrt(np.sum(x**2))

print(numerical_gradient(function_1, np.array([1.0, 2.0])))

여기서는 함수 f(x) = $\sqrt{x_{1}^{2} + x_{2}^{2} + ...}$를 정의하였습니다.

그리고 이 함수의 x = [1.0, 2.0]의 gradient를 출력하도록 하였습니다. 

코드의 결과는 다음과 같습니다.

[0.4472136  0.89442719]

 

반응형

댓글