通过数值近似计算梯度

问题描述

我正在尝试通过以下定义计算给定函数的梯度:

enter image description here

我正在尝试使用以下代码来做到这一点:

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 (将#修改为@)