를 pytorch 코드로 나타내려 한다.
스칼라 함수 는 로 표현될 때
에 대한 의 변화도는 이다
라고 할 때 이며 이므로
라고 할 때 이며 이다.
에 대해서 backward()
를 호출하면
x1=2, x2=3인 상황을 가정하여 x, y를 코드로 구현하여 각 편미분 공식에 대입한 결과와 자동 미분 결과를 확인하니 값이 일치함을 확인할 수 있다.
import torch
x1 = torch.tensor([2.], requires_grad=True)
x2 = torch.tensor([3.], requires_grad=True)
y1 = 3*x1**3 + 2*x2**4
y1.backward()
print(x1.grad, x2.grad) ## tensor([36.]) tensor([216.])
###
x1 = 2
x2 = 3
y1x1 = 9*x1**2
y1x2 = 8*x2**3
print(y1x1, y1x2) ## (36, 216)
다음으로 에 대한 의 변화도를 알아보자
에 대한 의 변화도인 이기에
에 대한 의 변화도의 Transpose는 다음과 같다
에 대해서 backward()
를 실행한 결과 값이 일치함을 확인하였다
x1 = torch.tensor([2.], requires_grad=True)
x2 = torch.tensor([3.], requires_grad=True)
y1 = 3*x1**3 + 2*x2**4
y2 = 2*x1**2 + x2**3
l = 2*y1 + 3*y2
l.backward()
print(x1.grad, x2.grad) ## tensor([96.]) tensor([513.])
print(y1.retain_grad(), y2.retain_grad()) ## None None
print(l.retain_grad()) ## None
####
lx1 = 18*x1**2 + 12*x1
lx2 = 16*x2**3 + 9*x2**2
print(lx1, lx2) ## tensor([96.], grad_fn=<AddBackward0>) tensor([513.], grad_fn=<AddBackward0>)
하나 눈 여겨 볼 점으로 y1, y2, l에 gradient 값을 retain_grad()를 이용하여 가져온다.
이는 pytorch에서 backward의 결과값을 leaf-node의 것만 기록해두기 때문이다.
Reference