Mecanismo gráfico computacional y gráfico dinámico
Directorio de artículos
Mecanismo gráfico computacional y gráfico dinámico
Gráfico de cálculo
1. ¿Qué es un gráfico de cálculo? |
¿Qué es un gráfico computacional?
2. Gráfico de cálculo y derivación de gradiente. |
Use el código para verificar el ejemplo de la imagen de arriba:
import torch
w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
a = torch.add(w, x) # retain_grad()
b = torch.add(w, 1)
y = torch.mul(a, b)
y.backward()
print(w.grad)
AFUERA:
tensor([5.])
3. Nodos de hoja |
¿Qué es un nodo hoja?
- Respuesta : Los nodos creados por los usuarios se denominan nodos hoja , como X y W.
- is_leaf : Indica si el tensor es un nodo hoja.
Utilice el código para comprobar cuáles de los gráficos de cálculo anteriores son nodos hoja:
import torch
w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
a = torch.add(w, x) # retain_grad()
# a.retain_grad() # 执行 retain_grad()会保留非叶子节点的梯度
b = torch.add(w, 1)
y = torch.mul(a, b)
y.backward()
# print(w.grad)
# 查看叶子结点
print("w是is_leaf ? : {}\nx是is_leaf ? : {}\na是is_leaf ? : {}\nb是is_leaf ? : {}\ny是is_leaf ? : {}\n".format(w.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf))
# 查看梯度
print("\nw gradient = {}\nx gradient = {}\na gradient = {}\nb gradient = {}\n y gradient = {}\n".format(w.grad, x.grad, a.grad, b.grad, y.grad))
AFUERA:
w是is_leaf ? : True
x是is_leaf ? : True
a是is_leaf ? : False
b是is_leaf ? : False
y是is_leaf ? : False
w gradient = tensor([5.])
x gradient = tensor([2.])
a gradient = None
b gradient = None
y gradient = None
A partir de los resultados del código anterior de calcular el gradiente de cada nodo, podemos obtener el papel de los nodos hoja:
- Ahorra espacio en la memoria , ¿por qué dices eso?
- A partir de los resultados del código anterior, se puede ver que solo los gradientes de los nodos hoja (w y x) se guardan en el espacio de memoria, por lo que se pueden generar, y los derivados de los nodos no hoja (a, b , y) se borran, por lo que la salida es Ninguno .
Si desea mantener el gradiente de los nodos que no son hojas: use retain_grad() para mantener
retain_grad() # 执行 retain_grad()会保留非叶子节点的梯度
grad_fn: registra el método utilizado para crear el tensor
import torch
w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
a = torch.add(w, x) # retain_grad()
a.retain_grad() # 执行 retain_grad()会保留非叶子节点的梯度
b = torch.add(w, 1)
y = torch.mul(a, b)
y.backward()
# print(w.grad)
# 查看叶子结点
# print("w是is_leaf ? : {}\nx是is_leaf ? : {}\na是is_leaf ? : {}\nb是is_leaf ? : {}\ny是is_leaf ? : {}\n".format(w.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf))
# 查看梯度
# print("\nw gradient = {}\nx gradient = {}\na gradient = {}\nb gradient = {}\ny gradient = {}\n".format(w.grad, x.grad, a.grad, b.grad, y.grad))
# 查看 grad_fn
print("w的grad_fn: {}\nx的grad_fn: {}\na的grad_fn: {}\nb的grad_fn: {}\ny的grad_fn: {}\n".format(w.grad_fn, x.grad_fn, a.grad_fn, b.grad_fn, y.grad_fn))
AFUERA:
w的grad_fn: None
x的grad_fn: None
a的grad_fn: <AddBackward0 object at 0x00000188C0B7BC50>
b的grad_fn: <AddBackward0 object at 0x00000188C0B7BC88>
y的grad_fn: <MulBackward0 object at 0x00000188C0D215C0>
Del resultado del código anterior, podemos saber que: grad_fn: guarda la operación de cada nodo. como
a的grad_fn: <AddBackward0 object at 0x00000188C0B7BC50>
a: Se obtiene por suma y se almacena en la dirección 0x00000188C0B7BC50 .
Gráficos dinámicos vs gráficos estáticos
Mapa estático: Si nos apuntamos a un equipo de viaje, nuestra ruta de recorrido es fija. Es decir, primero determinamos la ruta de viaje general y luego jugamos, lo que se llama estático.
Imagen dinámica: si compramos nuestros propios boletos aéreos, primero iremos a Singapur, luego a la provincia de Taiwán y luego a la ciudad de Japón, pero cuando lleguemos a Singapur, alguien recomienda ir primero a la ciudad de Japón, por lo que decidimos cambiar. la ruta e ir primero al condado de Tokio, ciudad de Japón. , que es dinámico, podemos ajustar el modelo en cualquier momento.