머신러닝, 딥러닝에 필요한 기초 수학 - 수치미분과 자동미분(2)
요약 : 앞으론 파이썬으로 미분할거면 파이토치로 하세요
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) 예제
-> 어렵다... 상류층 미분계수, 지역미분계수!
Author And Source
이 문제에 관하여(머신러닝, 딥러닝에 필요한 기초 수학 - 수치미분과 자동미분(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@maniac1565/머신러닝-딥러닝에-필요한-기초-수학-수치미분과-자동미분2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)