scipy.optimize.check_grad的预期输出是梯度与梯度的有限差分近似之间的差异的2-范数。我无法从输出中判断我的梯度是否足够好。是否有某个范围内的值是必须的?什么样的误差是可以接受的?
回答:
你的梯度函数返回一个向量,我们称之为g
,而scipy的数值方法给你提供了一个好的(尽管成本较高)的估计v
。现在你得到的是
||g-v|| = sqrt( SUM_{i=1}^d (g_i - v_i)^2 )
换句话说,这是你的梯度在所有维度上的平方误差的平方根。什么样的误差是可以接受的?这取决于函数和梯度的维度。我认为超过10e-4
的误差总是错误的。尽管回答10e-4
或10e-10
是否可以接受取决于你的具体应用——简单随机优化的要求与解决某些复杂数值模拟的精确方法的要求不同,前者有时只需要每个维度的符号而不是数值。