微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过数值近似计算梯度

如何解决通过数值近似计算梯度

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

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 举报,一经查实,本站将立刻删除。