如何解决通过数值近似计算梯度
我正在尝试通过以下定义计算给定函数的梯度:
我正在尝试使用以下代码来做到这一点:
def numerical_diff_gradient(func,vector: np.matrix,epsilon):
vec_len = vector.shape[0]
assert vector.shape[1] == 1
assert vec_len > 0
gradient = np.matrix(np.zeros((vec_len,1)),dtype=np.float64)
for i in range(vec_len):
base_vector = np.matrix(np.zeros((vec_len,dtype=np.float64)
base_vector[i,0] = 1
func_plus = func(vector + (epsilon * base_vector))
func_minus = func(vector - (epsilon * base_vector))
gradient[i,0] = ((func_plus - func_minus) / (2 * epsilon))
return gradient
问题是我无法处理非常小的值,因为 epsilon 在 0 到 2e-60 之间, 因此变量 func_plus 和 func_minus 获得相同的值,结果我得到梯度是零向量。如何表示非常小的值并保持其准确性?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。