pytorch中backward参数含义
1.标量与矢量问题
- backward参数是否必须取决于因变量的个数,从数据中表现为标量和矢量;
例如标量时 y = 一 个 明 确 的 值 y=一个明确的值 y=一个明确的值 矢量时 y = [ y 1 , y 2 ] y=[y1,y2] y=[y1,y2]
2.backward 参数计算公式
- 当因变量公式不是一个标量时,需要显式添加一个参数进行计算,以pytorch文档示例说明:
import torch
a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)
Q = 3*a**3 - b**2
- 例如求解公式 Q = 3 a 3 − b 2 Q = 3a^3 - b^2 Q=3a3−b2,此时Q是一个矢量,即2*1的向量,那么就需要显式添加参数去计算 ∂ Q ∂ a = 9 a 2 \frac{\partial Q}{\partial a} = 9a^2 ∂a∂Q=9a2 ∂ Q ∂ b = − 2 b \frac{\partial Q}{\partial b} = -2b ∂b∂Q=−2b
external_grad = torch.tensor([1., 1.])
Q.backward(gradient=external_grad)
-
可以看到backward参数为[1,1],具体计算的含义,我们把Q公式拆分为标量形式即:
Q 1 = 3 a 1 3 − b 1 2 Q_1 = 3a_1^3 - b_1^2 Q1=3a13−b12
Q 2 = 3 a 2 3 − b 2 2 Q_2 = 3a_2^3 - b_2^2 Q2=3a23−b22- 雅可比公式形式
∂ Q ∂ a = [ ∂ Q 1 ∂ a 1 ∂ Q 1 ∂ a 2 ∂ Q 2 ∂ a 1 ∂ Q 2 ∂ a 2 ] \frac{\partial Q}{\partial a} =\left[ \begin{matrix} \frac{\partial Q_1}{\partial a_1} & \frac{\partial Q_1}{\partial a_2} \\ \\ \frac{\partial Q_2}{\partial a_1}& \frac{\partial Q_2}{\partial a_2} \end{matrix} \right] ∂a∂Q=⎣⎡∂a1∂Q1∂a1∂Q2∂a2∂Q1∂a2∂Q2⎦⎤
∂ Q ∂ b = [ ∂ Q 1 ∂ b 1 ∂ Q 1 ∂ b 2 ∂ Q 2 ∂ b 1 ∂ Q 2 ∂ b 2 ] \frac{\partial Q}{\partial b} =\left[ \begin{matrix} \frac{\partial Q_1}{\partial b_1} & \frac{\partial Q_1}{\partial b_2} \\ \\ \frac{\partial Q_2}{\partial b_1}& \frac{\partial Q_2}{\partial b_2} \end{matrix} \right] ∂b∂Q=⎣⎡∂b1∂Q1∂b1∂Q2∂b2∂Q1∂b2∂Q2⎦⎤
- 雅可比公式形式
-
backward参数为[1,1],计算公式为
[ ∂ Q 1 ∂ a 1 ∂ Q 2 ∂ a 1 ∂ Q 1 ∂ a 2 ∂ Q 2 ∂ a 2 ] ∗ [ 1 1 ] = [ 36 , 81 ] \left[ \begin{matrix} \frac{\partial Q_1}{\partial a_1} & \frac{\partial Q_2}{\partial a_1} \\ \\ \frac{\partial Q_1}{\partial a_2}& \frac{\partial Q_2}{\partial a_2} \end{matrix} \right]* \left[ \begin{matrix} 1 \\1 \end{matrix} \right]=[36,81] ⎣⎡∂a1∂Q1∂a2∂Q1∂a1∂Q2∂a2∂Q2⎦⎤∗[11]=[36,81]
[ ∂ Q 1 ∂ b 1 ∂ Q 2 ∂ b 1 ∂ Q 1 ∂ b 2 ∂ Q 2 ∂ b 2 ] ∗ [ 1 1 ] = [ − 12 , − 8 ] \left[ \begin{matrix} \frac{\partial Q_1}{\partial b_1} & \frac{\partial Q_2}{\partial b_1} \\ \\ \frac{\partial Q_1}{\partial b_2}& \frac{\partial Q_2}{\partial b_2} \end{matrix} \right]* \left[ \begin{matrix} 1 \\1 \end{matrix} \right]=[-12,-8] ⎣⎡∂b1∂Q1∂b2∂Q1∂b1∂Q2∂b2∂Q2⎦⎤∗[11]=[−12,−8]
3.autograd
torch.autograd
是计算向量和雅可比公式的乘积的引擎:
- 其中J就是因变量与自变量的雅可比公式,v即backward中的参数;类比于第二节的例子可对应;
- 前向传播得到数值后,利用此形式计算直接后向传播计算出损失函数对应各权值的梯度下降值