1. Autograd : 자동 미분
PyTorch의 모든 신경망의 핵심은 autograd
패키지입니다. 먼저이 패키지를 간략하게 소개 한 다음 첫 번째 신경망을 훈련 시키겠습니다.
autograd
이 패키지는 텐서의 모든 작업에 대해 자동 차별화를 제공합니다. 런타임에 정의 된 프레임 워크로, 코드 실행 방식에 따라 역 전파가 정의되며 각 반복이 다를 수 있습니다.
다음으로이 패키지를보기 위해 몇 가지 간단한 예제를 사용합니다.
텐서
torch.Tensor
패키지의 핵심 클래스입니다. 속성 .requires_grad
을 True로 설정하면 모든 작업을 추적하기 시작합니다. 계산이 완료되면 .backward()
모든 그라디언트를 호출 하여 자동으로 계산할 수 있습니다 . 이 텐서의 기울기는 .grad
속성에 누적됩니다 .
텐서가 기록을 추적하지 못하도록하려면을 호출 .detach()
하여 계산 기록에서 분리하고 향후 계산이 추적되지 않도록 할 수 있습니다.
추적 기록 (및 메모리 사용)을 방지하기 위해 torch.no_grad ()를 사용하여 코드 블록을 래핑 할 수도 있습니다. 모델에 requires_grad = True
학습 가능한 매개 변수 가있을 수 있지만 그래디언트가 필요하지 않기 때문에 모델을 평가할 때 특히 유용 할 수 있습니다 .
autograd implementation-Function에 매우 중요한 또 다른 클래스가 있습니다.
Tensor와 Function은 서로 연결되어 비순환 그래프를 구성하여 완전한 계산 프로세스를 구성합니다. 각 텐서는 보유 .grad_fn
(사용자가 의해 생성 텐서 제외 생성 텐서의 기능을 의미 속성 grad_fn
됩니다 None
).
미분을 계산하려면 Tensor에서 호출 할 수 있습니다 .backward()
. Tensor가 스칼라 (즉, 하나의 요소 데이터가 포함됨) 인 backward()
경우 매개 변수 를 지정할 필요가 없지만 더 많은 요소가있는 경우 일치하는 모양의 텐서 인 그라디언트 매개 변수를 지정해야합니다.
import torch
텐서를 만들고 requires_grad = True
계산을 추적하도록 설정
x = torch.ones(2, 2, requires_grad=True)
print(x)
输出:
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
텐서에 대한 작업을 수행합니다.
y = x + 2
print(y)
输出:
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward0>)
y는 작업에 의해 생성되므로 grad_fn이 있고 x는 사용자가 생성하므로 grad_fn은 None입니다.
print(y.grad_fn)
print(x.grad_fn)
输出:
<AddBackward0 object at 0x000001E020B794A8>
None
y에서 작업 수행
z = y * y * 3
out = z.mean()
print(z, out)
输出:
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward1>)
.requires_grad_(...)
기존 Tensor의 requires_grad
로고를 제자리에서 변경합니다 . 지정하지 않으면 입력 플래그의 기본값은 False입니다.
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
输出:
False
True
<SumBackward0 object at 0x000001E020B79FD0>
그라디언트
지금의이 수행 할 수 다시 전파, out.backward()
실행하는 것과 동일out.backward(torch.tensor(1.))
out.backward()
out의 기울기 d (out) / dx를 x로 출력합니다.
print(x.grad)
输出:
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
이제 야 코비 벡터 곱의 예를 살펴 보겠습니다.
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
输出:
tensor([ 384.5854, -13.6405, -1049.2870], grad_fn=<MulBackward0>)
이제이 경우 y는 더 이상 스칼라가 아닙니다. torch.autograd
완전한 야 코비 행렬식을 직접 계산할 수는 없지만 야 코비 벡터 곱만 원할 경우 벡터를 매개 변수로 뒤로 전달하기 만하면됩니다.
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
输出:
tensor([5.1200e+01, 5.1200e+02, 5.1200e-02])
torch.no_grad () 코드를 사용하고 텐서에서 .requires_grad = True를 사용하여 추적 기록 사용을 중지 할 수도 있습니다.
print(x.requires_grad)
print((x ** 2).requires_grad)
with torch.no_grad():
print((x ** 2).requires_grad)
输出:
True
True
False