autograd es una parte importante de Pytorch, el producto vector-jacobiano es la clave
Tome la función de valor vectorial tridimensional como ejemplo:
Según el mecanismo Tensor, Elemento-Sabio, en realidad significa:
La derivada de Y a X no es 2X sino una matriz jacobiana (porque X e Y son vectores, no números reales unidimensionales):
Entre ellos , se trata de la función, no solo de x1, la particularidad aquí es causada por el mecanismo de operación Element-Wise, la misma razón y2, y3
La derivada (tasa de cambio ) de d (Y) para cada componente es la derivada parcial de cada función de componente , y = 1,2,3
La acumulación de v a lo largo de una determinada dirección. En general, la dirección predeterminada de v es .
También puede pasar en diferentes direcciones, que es el gradiente externo de alimentación fácil reclamado en documentos oficiales.
Aquí, puede entenderse como: la proyección del vector derivado parcial en la dirección v ;
Puede entenderse como: una función de cada componente de la derivada parcial de los pesos .
v Una vez determinados, los pesos para cada uno están determinados y son los mismos.
Experimenta con:
Jacobio implícito simple
>>> x = torch.randn(3, requires_grad = True)
>>> x
tensor([-0.9238, 0.4353, -1.3626], requires_grad=True)
>>> y = x**2
>>> y.backward(torch.ones(3))
>>> x.grad
tensor([-1.8476, 0.8706, -2.7252])
>>> x
tensor([-0.9238, 0.4353, -1.3626], requires_grad=True)
>>>
Visualización de dos simples de verificación jacobiana
>>> x1=torch.tensor(1, requires_grad=True, dtype = torch.float)
>>> x2=torch.tensor(2, requires_grad=True, dtype = torch.float)
>>> x3=torch.tensor(3, requires_grad=True, dtype = torch.float)
>>> y=torch.randn(3) # produce a random vector for vector function define
>>> y[0]=x1**2+2*x2+x3 # define each vector function
>>> y[1]=x1+x2**3+x3**2
>>> y[2]=2*x1+x2**2+x3**3
>>> y.backward(torch.ones(3))
>>> x1.grad
tensor(5.)
>>> x2.grad
tensor(18.)
>>> x3.grad
tensor(34.)
La matriz jacobiana en el código anterior es:
Las funciones del componente son:
Dirección de proyección:
Los resultados del código y el análisis se confirman
Tres --- proyección a diferentes direcciones
Análisis previo:
Verificación de código:
>>> x1=torch.tensor(1, requires_grad=True, dtype = torch.float)
>>> x2=torch.tensor(2, requires_grad=True, dtype = torch.float)
>>> x3=torch.tensor(3, requires_grad=True, dtype = torch.float)
>>> y=torch.randn(3)
>>> y[0]=x1**2+2*x2+x3
>>> y[1]=x1+x2**3+x3**2
>>> y[2]=2*x1+x2**2+x3**3
>>> v=torch.tensor([3,2,1],dtype=torch.float)
>>> y.backward(v)
>>> x1.grad
tensor(10.)
>>> x2.grad
tensor(34.)
>>> x3.grad
tensor(42.)
Cumplimiento total