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][source]¶
将通过小有限差分计算得到的梯度与相对于
inputs
中的张量(浮点型或复数类型)的解析梯度进行比较。数值梯度与解析梯度之间的检查使用
allclose()
.对于我们用于优化的复杂函数,大多数情况下不存在雅可比矩阵的概念。相反,gradcheck 验证 Wirtinger 导数和共轭 Wirtinger 导数的数值和解析值是否一致。由于梯度计算是在假设整体函数具有实值输出的情况下进行的,因此我们对具有复值输出的函数采取特殊处理方式。对于这些函数,gradcheck 应用于两个实值函数,分别对应于取复数输出的实部,以及取复数输出的虚部。更多详情,请参阅复数的 Autograd。
注意
默认值是为
input
双精度设计的。如果input
的精度较低,例如FloatTensor
,则此检查可能会失败。注意
Gradcheck 在非可微点进行评估时可能会失败,因为通过有限差分法计算出的数值梯度可能与解析梯度不同(不一定是因为任一计算是错误的)。更多背景信息,请参阅非可微函数的梯度。
警告
如果
input
中存在任何检查过的张量有重叠的内存,即不同的索引指向相同的内存地址(例如,来自torch.Tensor.expand()
),则此检查可能会失败,因为在这些索引处通过点扰动计算的数值梯度将改变共享相同内存地址的所有其他索引的值。- 参数:
func(函数)- 一个 Python 函数,它接受 Tensor 输入并返回 Tensor 或 Tensor 的元组
inputs(Tensor 或 Tensor 的元组)- 函数的输入
eps(可选的 float)- 有限差分的扰动
绝对容差(float,可选)- 绝对容差
相对容差(float,可选)- 相对容差
raise_exception(bool,可选)- 指示是否在检查失败时引发异常。异常提供了关于失败确切性质的更多信息。这在调试 gradchecks 时很有帮助。
nondet_tol(float,可选)- 非确定性容差。当通过微分运行相同的输入时,结果必须完全匹配(默认值,0.0)或在此容差范围内。
check_undefined_grad (bool, 可选) – 如果
True
,检查是否支持将未定义的输出梯度视为零并处理,对于Tensor
个输出。check_batched_grad (bool, 可选) – 如果
True
,检查是否可以使用原型 vmap 支持计算批梯度。默认为 False。check_batched_forward_grad (bool, 可选) – 如果
True
,检查是否可以使用前向 AD 和原型 vmap 支持计算批前向梯度。默认为False
。check_forward_ad (bool, 可选) – 如果
True
,检查使用前向模式 AD 计算的梯度是否与数值梯度匹配。默认为False
。check_backward_ad (bool, 可选) – 如果
False
,则不执行任何依赖于反向模式 AD 的检查。默认为True
。fast_mode (bool, 可选) – 快速模式目前仅针对 R 到 R 的函数实现。如果输入和输出都不是复数,则运行不再计算整个雅可比矩阵的快速 gradcheck 实现;否则,我们将回退到慢速实现。
masked (bool, 可选) – 如果
True
,则忽略稀疏张量中未指定元素的反向梯度。默认为False
。
- 返回值:
True
如果所有差异都满足 allclose 条件- 返回类型: