Optimization 如何独立于Optim.jl使用Julia中的Linesearches.jl模块?
我有一个L-BFGS的实现,我想从LineSearches.jl调用行搜索来进行比较。但是,文档非常稀少,只关注Optim.jl上下文中Linesearches.jl的使用。我找不到任何单独使用LineSearchs.jl的示例 我创建了一个示例,介绍了如何在中使用带有a的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
LineSearches
算法
请注意,该示例当前需要LineSearchsmaster
,但不久将在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)