pytorch 反向梯度計算問題
計算如下
\begin{array}{l}{x_{1}=w_{1} * \text { input }} \\ {x_{2}=w_{2} * x_{1}} \\ {x_{3}=w_{3} * x_{2}}\end{array}
其中$w_{1}$,$w_{2}$,$w_{3}$是權重參數,是需要梯度的。在初始化時,三個值分別為1,0,1。
程序代碼如下:
import torch import torch.nn as nn input_data = torch.randn(1) weight1 = torch.ones(1,requires_grad=True) weight2= torch.zeros(1,requires_grad=True) weight3 = torch.ones(1,requires_grad=True) x_1 = weight1 * input_data x_2 = weight2 * x_1 x_3 = weight3 * x_2 one = torch.ones(1) x_3 = x_3 * one x_3.backward() print("x1:{},x2{},x3{},weight1_gard:{},weight2_gard:{},weight3_gard:{}".format(x_1,x_2,x_3, weight1.grad,weight2.grad,weight3.grad))
運行時,隨機產生的Input_data為1.688,三個權重的梯度值分別為0,1.688,0。
梯度的計算公式如下:
\begin{equation}
\frac{\partial x_{3}}{\partial w_{3}}=x_{2}
\end{equation}
\begin{equation}
\frac{\partial x_{3}}{\partial x_{2}}=w_{3}
\end{equation}
\begin{equation}
\frac{\partial x_{3}}{\partial w_{2}}=\frac{\partial x_{3}}{\partial x_{2}} \frac{\partial x_{2}}{\partial w_{2}}=w_{3} * x_{1}
\begin{equation}
\frac{\partial x_{3}}{\partial x_{1}}=\frac{\partial x_{3}}{\partial x_{2}} \frac{\partial x_{2}}{\partial x_{1}}=w_{3} * w_{2}
\end{equation}
\begin{equation}
\frac{\partial x_{3}}{\partial w_{1}}=\frac{\partial x_{3}}{\partial x_{1}} \frac{\partial x_{1}}{\partial w_{1}}=w_{3} * w_{2} * input
\end{equation}
由此可以看出一個問題是,權重數據為0,不代表其梯度也會等於0,權重數據不為0,不代表其梯度就不會為0.
在進行一些模型修改的時候常常會將一些卷積核置為零,但是如果這些卷積核仍然requires_grad=True,那麽在反向梯度傳播的時候這些卷積核還是有可能會更新改變值的。
pytorch 反向梯度計算問題