torch.autograd.gradcheck.gradcheck#
- torch.autograd.gradcheck.gradcheck(func, inputs, *, eps=1e-06, atol=1e-05, rtol=0.001, raise_exception=True, nondet_tol=0.0, check_undefined_grad=True, check_grad_dtypes=False, check_batched_grad=False, check_batched_forward_grad=False, check_forward_ad=False, check_backward_ad=True, fast_mode=False, masked=None)[source]#
使用有限差分计算出的梯度与 `inputs` 中浮点或复数类型且 `requires_grad=True` 的张量相对于解析梯度的检查。
数值梯度和解析梯度之间的比较使用 `torch.allclose`。
对于大多数用于优化的复杂函数,不存在雅可比矩阵。相反,gradcheck 验证 Wirtinger 和共轭 Wirtinger 导数的数值和解析值是否一致。由于梯度计算假定整体函数具有实值输出,我们以特殊方式处理具有复数输出的函数。对于这些函数,gradcheck 将应用于两个实值函数:第一个函数对应于复数输出的实部,第二个函数对应于复数输出的虚部。有关更多详细信息,请参阅 复数自动微分。
注意
默认值是为双精度 `input` 设计的。如果 `input` 的精度较低,例如 `FloatTensor`,此检查可能会失败。
注意
当在不可微点上评估时,gradcheck 可能会失败,因为通过有限差分计算的数值梯度可能与解析计算的梯度不同(不一定是因为其中一个不正确)。更多上下文请参见 不可微函数的梯度。
警告
如果 `input` 中的任何被检查的张量具有重叠内存,即不同的索引指向相同的内存地址(例如,来自 `torch.Tensor.expand()`),此检查可能会失败,因为在这些索引处通过点扰动计算的数值梯度将更改共享相同内存地址的所有其他索引的值。
- 参数
func (function) – 一个接受 Tensor 输入并返回 Tensor 或 Tensor 元组的 Python 函数。
eps (float, optional) – 有限差分的扰动。
atol (float, optional) – 绝对容差。
rtol (float, optional) – 相对容差。
raise_exception (bool, optional) – 指示如果检查失败是否引发异常。异常会提供有关失败确切性质的更多信息。这在调试 gradchecks 时很有用。
nondet_tol (float, optional) – 非确定性的容差。当在分化中运行相同的输入时,结果必须完全匹配(默认值 0.0)或在此容差范围内。
check_undefined_grad (bool, optional) – 如果为
True
,则检查是否支持未定义的输出梯度,并将其视为零(对于Tensor
输出)。check_batched_grad (bool, optional) – 如果为
True
,则检查是否可以使用原型 vmap 支持计算批次梯度。默认为 False。check_batched_forward_grad (bool, optional) – 如果为
True
,则检查是否可以使用前向 AD 和原型 vmap 支持计算批次前向梯度。默认为False
。check_forward_ad (bool, optional) – 如果设置为
True
,则检查通过前向模式 AD 计算的梯度是否与数值计算的梯度匹配。默认为False
。check_backward_ad (bool, optional) – 如果设置为
False
,则不执行任何依赖于后向模式 AD 实现的检查。默认为True
。fast_mode (bool, optional) – gradcheck 和 gradgradcheck 的快速模式目前仅为 R 到 R 函数实现。如果输入和输出都不是复数,则运行一个更快的 gradcheck 实现,该实现不再计算整个雅可比矩阵;否则,我们将回退到慢速实现。
masked (bool, optional) – 如果设置为
True
,则忽略稀疏张量中未指定元素的梯度。默认为False
。
- 返回
True
如果所有差值都满足 allclose 条件- 返回类型