防止梯度下降停止太远,从当地的最低限度

2024-10-17 08:18:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Python中实现一个算法,使用gradient descent方法来寻找二维函数的最近最小值。它以一个精度区间eps作为输入,当给定迭代的初始点和新发现点之间的距离小于eps时停止。该阶段的代码如下所示:

while(slow_steps <= 4):
        lbd_current = lbd(x_current)
        x_previous = x_current.copy()
        grad = normalized_gradient(f_multi, x_previous)
        x_current = [x_previous[i] + lbd_current * grad[i] for i in range(len(x_previous))]
        x_list.append(x_current.copy())
        iteration += 1
        if(distance(x_previous, x_current) <= eps):
            slow_steps += 1

然而,我在算法的初始版本中遇到了一个问题:根据函数的不同,它经常陷入诸如this one之类的“低谷”

到目前为止,我已经尝试添加第二步来遍历山谷:如果算法检测到下降速度很慢,而不是立即结束,它将获取最新和第三到最新迭代中找到的点,并在这些点之间的直线上找到最近的低点,这条直线有望与山谷的方向对齐

        if(distance(x_previous, x_current) <= eps * 10 and canyon_steps >= 3):
            x_canyon = x_list[len(x_list) - 2]
            vector_canyon = [x_current[i] - x_canyon[i] for i in range(len(x_canyon))]
            lbd_current = lbd_canyon()
            x_current = [x_canyon[i] + vector_canyon[i] * lbd_current for i in range(len(x_canyon))]
            if(distance(x_previous, x_current) > eps):
                canyon_steps = 0
                slow_steps = 0
        if(distance(x_previous, x_current) <= eps * 10):
            canyon_steps += 1

这个算法适用于我尝试过的大多数起始位置,但对于其他位置,如this one,如果精度较低,则会失败,否则似乎需要很长时间才能完成。我如何确保算法以尽可能好的机会到达局部最小值


Tags: in算法forlenifrangeepscurrent