머신러닝 & 딥러닝/기초 이론

[머신러닝/딥러닝 기초] 13. 편미분과 편미분의 기울기

by seokii 2022. 2. 18.
728x90
반응형

미분과 수치 미분

https://seokii.tistory.com/85

 

[머신러닝/딥러닝 기초] 12. 미분과 수치미분

정확도 대신 손실 함수를 사용하는 이유 https://seokii.tistory.com/83 [머신러닝/딥러닝 기초] 11. 정확도 대신 손실 함수를 사용하는 이유 손실 함수에 대하여 https://seokii.tistory.com/81 [머신러닝/딥러닝..

seokii.tistory.com

지난 글에서 미분과 수치 미분에 대해서 정리했습니다.

이번 글에서는 편미분에 대해 정리해보도록 하겠습니다.

 

편미분

$$ f(x_{0}, x_{1}) = x^{2}_{0} + x^{2}_{1} $$

위와 같이 인수들의 제곱 합을 계산하는 식이 있습니다.

하지만 이전의 미분을 다루었던 글에서와는 다르게 변수가 2개라는 점이 차이입니다.

파이썬 코드로 식을 나타내는 것은 다음과 같습니다.

def function(x):
    return x[0]**2 + x[1]**2

이 함수를 그래프로 그린다면 다음과 같습니다.

그렇다면, 이 식을 미분해보도록 하겠습니다.

변수가 여럿인 함수에 대해 미분하는 것을 편미분이라고 합니다.

이 편미분은 식으로 \(\dfrac{\partial f}{\partial x_{0}}\) 혹은 \(\dfrac{\partial f}{\partial x_{0}}\)처럼 표기합니다.

 

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

def function(x0):
    return x0*x0 + 4.0**2.0

print(diff(function, 3.0))

\(x_{0}=3, x_{1}=4\)일 때, \(x_{0}\)에 대한 편미분 구하기

결과 : 6.00000000000378

 

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

def function(x0):
    return x0*x0 + 4.0**2.0

print(diff(function, 3.0))

\(x_{0}=3, x_{1}=4\)일 때, \(x_{1}\)에 대한 편미분 구하기

결과 : 7.999999999999119

 

편미분은 위와 같이 변수가 하나인 미분과 마찬가지로 특정 장소의 기울기를 구합니다.

단 여러 변수 중 목표 변수 하나에 초점을 맞춰 다른 변수는 값을 고정합니다.

위의 코드에서는 목표 변수를 제외한 나머지를 특정 값에 고정하기 위해서 함수를 정의해 수치 미분 함수를 적용해 편미분을 구한 방법입니다.

 

기울기

그렇다면 \(x_{0}\)와 \(x_{1}\)의 편미분을 동시에 계산하고자 할 때는 어떻게 해야 할까요?

양쪽의 편미분을 묶어서 계산한다면, \((\dfrac{\partial f}{\partial x_{0}}\), \(\dfrac{\partial f}{\partial x_{0}})\) 처럼 모든 변수의 편미분을 벡터로 정리한 것을 기울기라고 합니다. 

기울기는 다음과 같이 구현할 수 있습니다.

import numpy as np

def function(x):
    return x[0]**2 + x[1]**2

def gradient(f,x):
    h = 1e-4
    grad = np.zeros_like(x)

    for idx in range(x.size):
        tmp_val = x[idx]
        x[idx] = tmp_val + h
        fxh1 = f(x)

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

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

print(gradient(function, np.array([3.0, 4.0])))
print(gradient(function, np.array([0.0, 2.0])))
print(gradient(function, np.array([3.0, 0.0])))

결과 : 

[6. 8.]

[0. 4.]

[6. 0.]

수치 미분의 동작 형태와 거의 동일합니다.넘파이 배열의 각 원소에 대해 수치 미분을 구하고 기울기를 계산하는 코드입니다.각각 (3, 4), (0, 2), (3, 0)에서의 기울기를 구한 결과입니다.

기울기를 나타낸 그림을 그리면 위와 같습니다.

그림은 방향을 가진 벡터(화살표)로 그려집니다.

여기서 기울기는 함수의 가장 낮은 장소(최솟값)를 가리킵니다. 또한, 멀어질수록 화살표의 크기가 커지는 점도 확인할 수 있습니다.

기울기가 가리키는 쪽은 각 장소에서 함수의 출력 값을 가장 크게 줄이는 방향을 뜻합니다.

 

다음 글에서는 앞선 미분, 현재 글의 편미분의 개념을 확장해 경사법에 대해 정리하도록 하겠습니다.

 

 

728x90
반응형

댓글