Optimization 如何独立于Optim.jl使用Julia中的Linesearches.jl模块?

Optimization 如何独立于Optim.jl使用Julia中的Linesearches.jl模块?,optimization,julia,numerical-methods,Optimization,Julia,Numerical Methods,我有一个L-BFGS的实现,我想从LineSearches.jl调用行搜索来进行比较。但是,文档非常稀少,只关注Optim.jl上下文中Linesearches.jl的使用。我找不到任何单独使用LineSearchs.jl的示例 我创建了一个示例,介绍了如何在中使用带有a的LineSearches算法 请注意,该示例当前需要LineSearchsmaster,但不久将在v6.0.0中提供 以下是完整的示例,以防链接中断:(编辑::使用简化流程的新示例代码进行更新。) 使用不带Optim/NLso

我有一个L-BFGS的实现,我想从LineSearches.jl调用行搜索来进行比较。但是,文档非常稀少,只关注Optim.jl上下文中Linesearches.jl的使用。我找不到任何单独使用LineSearchs.jl的示例

我创建了一个示例,介绍了如何在中使用带有a的
LineSearches
算法

请注意,该示例当前需要LineSearchs
master
,但不久将在
v6.0.0
中提供

以下是完整的示例,以防链接中断:(编辑::使用简化流程的新示例代码进行更新。)

使用不带Optim/NLsolve的LineSearchs 假设我们已经写了一个梯度下降优化算法,但想 实验不同的线搜索算法。 该算法实现如下

function gdoptimize(f, g!, fg!, x0::AbstractArray{T}, linesearch,
                    maxiter::Int = 10000,
                    g_rtol::T = sqrt(eps(T)), g_atol::T = eps(T)) where T <: Number
    x = copy(x0)
    gvec = similar(x)
    g!(gvec, x)
    fx = f(x)

    gnorm = norm(gvec)
    gtol = max(g_rtol*gnorm, g_atol)

    # Univariate line search functions
    ϕ(α) = f(x .+ α.*s)
    function dϕ(α)
        g!(gvec, x .+ α.*s)
        return vecdot(gvec, s)
    end
    function ϕdϕ(α)
        phi = fg!(gvec, x .+ α.*s)
        dphi = vecdot(gvec, s)
        return (phi, dphi)
    end

    s = similar(gvec) # Step direction

    iter = 0
    while iter < maxiter && gnorm > gtol
        iter += 1
        s .= -gvec

        dϕ_0 = dot(s, gvec)
        α, fx = linesearch(ϕ, dϕ, ϕdϕ, 1.0, fx, dϕ_0)

        @. x = x + α*s
        g!(gvec, x)
        gnorm = norm(gvec)
    end

    return (fx, x, iter)
end
我们现在可以使用
gdoptimize
BackTracking
来优化Rosenbrock函数 从给定的初始条件
x0

x0 = [-1., 1.0]

using LineSearches
ls = BackTracking(order=3)
fx_bt3, x_bt3, iter_bt3 = gdoptimize(f, g!, fg!, x0, ls)
有趣的是,
StrongWolfe
行搜索在一次迭代中收敛,而 所有其他算法都需要数千次迭代。 由于初始条件的特殊选择,这只是运气

ls = StrongWolfe()
fx_sw, x_sw, iter_sw = gdoptimize(f, g!, fg!, x0, ls)

我们目前正在努力使其不那么以Optim/NLsolve为中心。请在此处提供更多代码,如果您希望我向您展示如何在LineSearches.jl上打开问题或访问Optim.jl gitter频道。
ls = StrongWolfe()
fx_sw, x_sw, iter_sw = gdoptimize(f, g!, fg!, x0, ls)