牛顿法梯度下降算法中的 TypeError 和 ValueError 回溯

Posted

技术标签:

【中文标题】牛顿法梯度下降算法中的 TypeError 和 ValueError 回溯【英文标题】:TypeError and ValueError in algorithm for Newton's Method to gradient descent with backtracking 【发布时间】:2021-01-21 01:47:55 【问题描述】:

我正在尝试将牛顿法应用于具有回溯的梯度下降算法。

梯度下降算法:

带有回溯算法的梯度下降:

牛顿法:

    import numpy as np
from scipy import optimize as opt

def newton_gd_backtracking(w,itmax,tol):
    # You may set bounds of "learnrate"
    max_learnrate =0.1
    min_learnrate =0.001

    for i in range(itmax):
        grad = opt.rosen_der(w)
        grad2 = (np.linalg.norm(grad))**2
        hess = opt.rosen_hess(w)

        # you have to decide "learnrate"
        learnrate = max_learnrate
        while True:
            f0 = opt.rosen(w)
            f1 = opt.rosen(w - learnrate * grad)
            if f1 <= (f0 - (learnrate/2)*grad2):
                break
            else:
                learnrate /=2;
            if learnrate< min_learnrate:
                learnrate = min_learnrate; break

        # now, Newton's method
        deltaw = - learnrate * np.linalg.inv(hess) * grad 
        w = w + deltaw

        if np.linalg.norm(deltaw) < tol:
            break

    return w, i, learnrate


# You can call the above function, by adding main

if __name__=="__main__":
    w0 = np.array([0,0])
    
    itmax = 10000; tol = 1.e-5

    w, i, learnrate = newton_gd_backtracking(w0,itmax,tol)
    print('Weight: ', w)
    print('Iterations: ', i)
    print('Learning Rate: ', learnrate)

运行程序后,我收到以下错误消息:

TypeError:只有 size-1 的数组可以转换为 Python 标量

上述异常是以下异常的直接原因:

Traceback(最近一次调用最后一次):

文件“c:/Users/Desfios 5/Desktop/Python/homework submit/Deyeon/GD_BT_Newton/Main_Newton_GD_Backtracking.py”,第 43 行,在 w, i, 学习率 = newton_gd_backtracking(w0,itmax,tol)

文件“c:/Users/Desfios 5/Desktop/Python/homework submit/Deyeon/GD_BT_Newton/Main_Newton_GD_Backtracking.py”,第 12 行,在 newton_gd_backtracking hess = opt.rosen_hess(w)

文件“C:\Users\Desfios 5\AppData\Roaming\Python\Python38\site-packages\scipy\optimize\optimize.py”,第 373 行,在 rosen_hess 对角线[0] = 1200 * x[0]**2 - 400 * x1 + 2

ValueError: 使用序列设置数组元素。

当我在没有 Hessian 的情况下运行它时,作为带有回溯的正常梯度下降,代码运行良好。这是我用于带有回溯的正常梯度下降的代码:

    import numpy as np
from scipy import optimize as opt

def gd_backtracking(w,itmax,tol):
    # You may set bounds of "learnrate"
    max_learnrate =0.1
    min_learnrate =0.001

    for i in range(itmax):
        grad = opt.rosen_der(w)
        grad2 = (np.linalg.norm(grad))**2

        # you have to decide "learnrate"
        learnrate = max_learnrate
        while True:
            f0 = opt.rosen(w)
            f1 = opt.rosen(w - learnrate * grad)
            if f1 <= (f0 - (learnrate/2)*grad2):
                break
            else:
                learnrate /=2;
            if learnrate< min_learnrate:
                learnrate = min_learnrate; break

        # now, march
        deltaw = - learnrate * grad
        w = w + deltaw

        if np.linalg.norm(deltaw) < tol:
            break

    return w, i, learnrate


# You can call the above function, by adding main

if __name__=="__main__":
    w0 = np.array([0,0])
    
    itmax = 10000; tol = 1.e-5

    w, i, learnrate = gd_backtracking(w0,itmax,tol)
    print('Weight: ', w)
    print('Iterations: ', i)
    print('Learning Rate: ', learnrate)

粗麻布矩阵有什么我不知道的吗?据我了解,opt.rosen_hess 应该像 opt.rosen_der 一样为我们生成一维数组。也许我以错误的方式使用 opt.rose_hess 。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

在一遍又一遍地完成我的工作之后,我意识到我的错误。在 newton_gd_backtesting 下,我将逆粗麻布和梯度相乘。这些不是标量,所以我应该做点积。一旦我使用了点积,我就得到了想要的结果。

【讨论】:

以上是关于牛顿法梯度下降算法中的 TypeError 和 ValueError 回溯的主要内容,如果未能解决你的问题,请参考以下文章

『科学计算_理论』优化算法:梯度下降法&牛顿法

机器学习中梯度下降法和牛顿法的比较

最小二乘法+牛顿法+拟牛顿法+梯度下降法+梯度上升法+共轭梯度法

机器学习采用 EM 算法求解的模型有哪些,为什么不用牛顿法或梯度下降法?(面试回答)

梯度下降之模拟退火梯度下降之学习计划牛顿法拟牛顿法共轭梯度法

最优化问题(牛顿法和梯度下降法)