torch.autograd.grad的使用及内部原理理解 📅 发布时间:2026/8/25 12:50:08 👁 浏览次数: 1.使用方法torch.autograd.grad如何使用torch.autograd.grad(outputs,# 需要求导的目目标张量如 Q 值必须是标量或向量。inputs,# 需要对其求导的源张量如动作 a可以是任意形状grad_outputsNone,# 关键当 outputs 是向量时需要提供外部梯度链式法则的初始值retain_graphNone,# 是否保留计算图以供后续反向传播。默认 False调用后释放图create_graphFalse# 是否构建高阶导数图用于二阶梯度。默认 False)其中如果是标量如总损失则grad_outputs可省略默认为 1.0如果是向量如多个 Q 值组成的张量则必须通过grad_outputs指定每个输出分量的权重系数以完成向量-雅可比乘积VJP计算。2. 通过例子理解假如Yf(X)Y f(X)Yf(X)形状Y[N,K]Y[N, K]Y[N,K]和X[N,M]X[N, M]X[N,M]torch.autograd.grad(outputsY,inputsX,grad_outputstorch.ones_like(Y))[0]在使用torch.autograd.grad函数求梯度时我的理解函数里填outputsY,inputsX,grad_outputstorch.ones_like(Y)从函数外部的理解其中grad_outputstorch.ones_like(Y)代表对Y中每个元素求偏导后的加权。最后得到的结果是Y中每行对X对应的行的元素求偏导再根据grad_outputs求加权和得到的矩阵形状是[N,M][N, M][N,M].从函数内部的理解函数里面的具体流程grad_outputs代表对Y中每个元素的加权。然后把Y每行的每个元素对X对应的行的分量分别求偏导Y和X全部展开对应求导得到一个形状是[N∗K,N∗M][N*K, N*M][N∗K,N∗M]的雅可比矩阵 J块对角矩阵。grad_outputstorch.ones_like(Y)和输出形状一样[N,K][N, K][N,K]经过内部展开成[N∗K,1][N*K, 1][N∗K,1]也就是vvv代表对Y中所有元素对X求偏导之后的加权系数实际上计算vT⋅Jv^{T} · JvT⋅J得到的是形状为[1,N∗M][1, N*M][1,N∗M]的雅可比向量积JVP再由内部 reshape 变换成和输入XXX一样的形状[N,M][N, M][N,M]。总结经过这个函数XXX和YYY的梯度并没有改变而是输出了一个YYY对XXX求导的矩阵是一个“无副作用的梯度查询器”绝不污染任何变量的.grad属性。