问题描述
我正在尝试通过以下定义计算给定函数的梯度:
我正在尝试使用以下代码来做到这一点:
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 (将#修改为@)