기계학습/밑바닥딥러닝3 오독오독 씹기

Chapter 2. 자연스러운 코드로(step 23~24)/복잡한 함수 미분

H_erb Salt 2021. 1. 21. 09:13
ch2)step_23-24

23. 패키지로 정리

  • 모듈: 모듈은 파이썬 파일. 특히 다른 파이썬 프로그램에서 임포트 하여 사용하는 것을 가정하고 만들어진 파이썬 파일을 모듈이라고 함
  • 패키지: 여러 모듈을 묶은 것. 패키지를 만들려면 디렉터리를 만들고 그 안에 모듈(파이썬 파일)을 추가함
  • 라이브러리: 여러 패키지를 묶은 것. 그래서 하나 이상의 디렉터리로 구성됨. 때로는 패키지를 가리켜 라이브러리라고 함

23.1 파일 구성~ 23.2 코어 클래스로 옮기기

In [1]:
import numpy as np
from dezero.core_simple import Variable

x = Variable(np.array(1.0))
print(x)
variable(1.0)

23.3 연산자 오버로드

  • setup_variable은 Variable의 연산자들을 오버로드 해주는 함수. 이 함수를 호출하면 Variable의 연산자들이 설정됨. dezero/init.py 파일에서 설정함.
  • init.py 모듈을 임포트할 때 가장 먼저 실행되는 파일.

...

23.5 dezero 임포트

In [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

x = Variable(np.array(1.0))
y = (x+3)**2
y.backward()

print(y)
print(x.grad)
variable(16.0)
8.0
  • 우선 if '__file__' in globals(): 라는 문장에서 file이라는 전역 변수가 정의되어 있는지 확인함.
  • 터미널에서 python 명령으로 실행한다면 file 변수가 정의되어 있음. 이 경우 현재 파일이 위치한 디렉터리의 부모 디렉터리를 모듈 검색 경로에 추가함.
  • 이로써 파이썬 명령어를 어디든 실행하든 dezero 디렉터리의 파일들은 제대로 임포트할 수 있게됨

24. 복잡한 함수의 미분

  • DeZero는 이제 대표적인 연산자들(+, -, -, /, **)을 지원함. 따라서 평소 파이썬 프로그래밍을 하듯 코딩가능함. 이 혜택은 복잡한 수식을 코딩할 때 피부로 와닿음
  • 이번 단계에서 다루는 함수들은 최적화 문제에서 자주 사용되는 테스트 함수. 최적화 문제의 테스트 함수란 다양한 최적화 기법이 '얼마나 좋은가'를 평가하는 데 사용되는 함수를 뜻함.

24.1 Sphere 함수

  • Sphere 함수를 수식으로 표현하면 $z=x^2+y^2$. 우리가 할 일은 그 미분을 계산하는 것
  • (x, y) = (1.0, 1.0)인 경우를 미분
In [3]:
import numpy as np
from dezero import Variable

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

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

24.2 matyas 함수

  • $z=0.26(x^2 + y^2)-0.48xy$
    • 차원이 x, y, z뿐인 3차원 공간에서의 Sphere 함수.
In [4]:
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)
0.040000000000000036 0.040000000000000036

24.3 Goldstein-Price 함수

  • $f(x, y) = [1+(x+y+1)^2(19-14x+3x^2-14y+6xy+3y^2)][30+(2x-3y)^2(18-32x+12x^2+48y-36xy+27y^2)]$
In [5]:
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)
-5376.0 8064.0
  • 이제 복잡한 계산도 가능함(엄밀히 말하면 복잡한 계산 그래프라도 올바르게 역전파가 가능함)
  • 다음 단계에서부터 더 고급 계산도 처리할 수 있도록 DeZero를 확장해감
In [ ]: