머신러닝, 딥러닝에 필요한 기초 수학 - 수치미분과 자동미분(2)

TS2·2021년 8월 6일
0

요약 : 앞으론 파이썬으로 미분할거면 파이토치로 하세요

import torch

x = torch.tensor([1.0], requires_grad=True)
y = torch.tensor([2.0], requires_grad=True)
f_xy = (x**2 + 2*x) * torch.log(y)

df = torch.autograd.grad(f_xy, (x, y), retain_graph=True)
print(df)

1. 파이토치

파이토치(pyTorch)란 딥러닝 모델을 구현하기 위한 라이브러리.
Numpy를 대체가능. GPU사용

1) 텐서(Tensor)

다차원배열과 동의어. Numpy의 ndarray(다차원 배열. N-Dimension Array)의 파이토치 버전

파이토치에서 미분하려면 자료를 꼭 텐서 자료형에 담아야 함.

import numpy as np
import torch

np.random.seed(0)

x = np.random.rand(6).reshape(2, 3)

x_tensor = torch.tensor(x)
x_from_numpy = torch.from_numpy(x)
x_Tensor = torch.Tensor(x)
x_as_numpy = torch.as_tensor(x)

print(x, x.dtype) ## 원자료형의 타입 float64
print(x_tensor, x_tensor.dtype, x_tensor.requires_grad) ##텐서의 타입 torch.float64
print(x_Tensor, x_Tensor.dtype, x_Tensor.requires_grad) ## torch.float32
print(x_from_numpy, x_from_numpy.dtype, x_from_numpy.requires_grad) # torch.float64
print(x_as_numpy, x_as_numpy.dtype, x_as_numpy.requires_grad) # torch.float64

4가지 텐서 타입 자료 생성방법 중 원자료형의 데이터타입(float)을 유지하는 경우를 사용한다.
torch.tensor(x)와 torch.Tensor(x)을 쓸 것임. 왜냐하면

x[0,0] = 100 ## 첫행열의 값을 100으로 바꾼다

print(x, x.dtype) ## 값이 바뀌어있다
print(x_tensor, x_tensor.dtype, x_tensor.requires_grad) ## 원자료를 보존한다
print(x_Tensor, x_Tensor.dtype, x_Tensor.requires_grad) ## 원자료를 보존한다
print(x_from_numpy, x_from_numpy.dtype, x_from_numpy.requires_grad) # 값이 바뀌어있다.
print(x_as_numpy, x_as_numpy.dtype, x_as_numpy.requires_grad) ## 값이 바뀌어있다.

torch.tensor(x), torch.Tensor(x) 케이스만 원 넘파이어레이와 데이터를 공유하고 있음. 나머지 케이스는 아예 새로 복사해서 텐서를 만들어버림

x_tensor_grad = torch.tensor(x, requires_grad=True)

print(x_tensor_grad, x_tensor_grad.dtype, x_tensor_grad.requires_grad) ## 명시적으로 requires_grad를 True로 세팅해준다

자동미분해주려면, requires_grad를 True로 명시적으로 표시해준다. 그래야 텐서를 독립변수로 입력받는 함수를 해당 텐서로 자동 미분할 수 있다.

2) 자동미분 고고

x = torch.tensor([1.0], requires_grad=True)
y = torch.tensor([2.0], requires_grad=True)
f_xy = (x**2 + 2*x) * torch.log(y)

torch.autograd.backward(f_xy, retain_graph=True)
print(x.grad)
print(y.grad)

df = torch.autograd.grad(f_xy, (x, y), retain_graph=True)
print(df)

torch.autograd.grad() 함수를 쓰자

retain_graph=True는 '계산 그래프' 계산시 계산 그래프(원 함수)를 메모리에서 날리지 않도록 하는 변수. False로 세팅시 한번 미분 후 계산그래프를 삭제해버려서 2회 이상 미분이 불가능

3) 예제

-> 어렵다... 상류층 미분계수, 지역미분계수!

profile
샴푸아닙니다. TSE입니다.

0개의 댓글