import torch
import numpy as np
x = torch.tensor(5.0, requires_grad=True)
x
tensor(5., requires_grad=True)
$x = 5.0$
$y = x^2 => f(x) = x^2$
y = x ** 2
y
tensor(25., grad_fn=<PowBackward0>)
$\frac{dy}{dx} = 2x$
$f'(x=5.0) = 2 * 5.0 = 10$
y.backward()
x.grad
tensor(10.)
x = torch.tensor(5.0, requires_grad=True)
y = torch.tensor(5.0, requires_grad=True)
f = x**2 + y**2
f.backward()
f.grad_fn
<AddBackward0 at 0x1aefc26ad48>
x.grad # partial derivative wrt x at x = 5 and y =5
tensor(10.)
y.grad # partial derivative wrt y at x = 5 and y =5
tensor(10.)
x = torch.tensor(5.0, requires_grad=True)
y = torch.tensor(5.0, requires_grad=True)
f2 = x**2 * y**2
$f2(x, y) = x^2 . y^2$
$\frac{\partial f2}{\partial x} = 2x.y^2$
$\frac{\partial f2}{\partial y} = x^2.2y$
f2.backward()
f2.grad_fn
<MulBackward0 at 0x1aefc470a48>
x.grad
tensor(250.)
from torch.autograd import grad
def nth_derivative(f, wrt, n=2):
for i in range(n):
grads = grad(f, wrt, create_graph=True)[0]
f = grads.sum()
return grads
x = torch.tensor(5.0, requires_grad=True)
$f(x) = x^2 + x^3$
$f'(x) = 2x + 3x^2$
$f''(x) = 2 + 6x$
$f''(x=5) = 2 + 6*5 = 32$
f = x**2 + x**3
# double derivative
nth_derivative(f, x)
tensor(32., grad_fn=<AddBackward0>)