You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中如何对X维度而非Y维度求和雅可比矩阵?

高效实现方案

你需要的雅可比沿X维度求和的需求,可以通过前向模式自动微分实现,仅需一次类前向计算,开销和普通推理接近,无需构造全雅可比,也无需循环遍历Y的元素,完全适配大输入输出规模的神经网络场景。

实现原理

我们的目标是对Y中每个元素y_k,计算所有X元素对y_k的偏导之和,等价于计算雅可比矩阵J(Y,X)与全1的X形向量的乘积J·v。
前向模式自动微分原生支持雅可比-向量乘积运算,输入方向向量形状与X一致,输出结果形状与Y完全一致,正好匹配需求。

代码示例

import torch

# 示例输入
X = torch.eye(2)
X.requires_grad_()

# 你的前向计算逻辑,替换为你自己的模型前向即可
def forward(x):
    return torch.sum(x*x, dim=0)

# 前向模式梯度计算
v = torch.ones_like(X)
with torch.autograd.forward_ad.dual_level():
    # 构造对偶张量:输入+方向向量
    X_dual = torch.autograd.forward_ad.make_dual(X, v)
    Y_dual = forward(X_dual)
    # 提取切向量,即为所需结果
    res = torch.autograd.forward_ad.unpack_dual(Y_dual).tangent

print(res)
# 输出:tensor([2., 2.]),与预期完全一致

兼容老版本PyTorch的备选方案

如果你的PyTorch版本低于1.11(不支持前向自动微分),可以使用标量扰动+批量化反向梯度的方案,仅当Y的元素规模较小时适用:

import torch

X = torch.eye(2)
X.requires_grad_()
Y = torch.sum(X*X, dim=0)

t = torch.tensor(0., requires_grad=True)
X_t = X + t
Y_t = torch.sum(X_t * X_t, dim=0)

# 批量化计算每个Y元素对t的梯度
grad_outputs = torch.eye(Y_t.numel(), device=Y_t.device)
batch_grads = torch.autograd.grad(Y_t, t, grad_outputs=grad_outputs, is_grads_batched=True)[0]
res = batch_grads.reshape(Y_t.shape)
print(res)
# 输出:tensor([2., 2.])

内容的提问来源于stack exchange,提问作者Jonas De Schouwer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:48:02