线搜索
线搜索(line search)是在优化的当前点和搜索方向已经确定以后,沿该方向选择步长的过程。方向解决往哪里走,线搜索解决走多远。它常出现在梯度法、拟牛顿法和约束优化的全局化步骤中;沿一条射线取得最优,也只解决了当前一维子问题。
把多变量移动写成一维函数
设 可微,当前点为 ,非零方向为 。令 ,其中 ,并要求所考虑的点属于定义域。导数为 。当 时,p为下降方向,足够小的正步长使目标下降。
例如 、当前点零、方向一,得到 。导数 在二处为零,二阶导数为二,因此精确线搜索取 。把方向改成二,精确步长便变为一,最终移动仍是二;步长参数本身不是位移长度。
一般正定二次函数 , 实对称正定、,沿方向展开为 。若 ,正分母保证 这证明了该特殊模型中的精确公式。一般函数的射线下确界未必达到,例如 始终下降,却没有有限最小步长。
足够下降与曲率条件
实际算法常只寻找满足条件的步长。Armijo 条件用 要求 右侧要求至少取得线性预测下降的一部分。只取极小步长往往也能满足,却可能进展缓慢。弱 Wolfe 曲率条件再要求 ,其中 ,使斜率不再过于负。强 Wolfe 则要求 ,进一步控制越过谷底后的正斜率。[1]
在主例中选 。Armijo 化为 ,即 ;弱曲率化为 ,即 。故两者共同允许整个 ,无需每次精确找到二。强 Wolfe 在本例也允许同一区间。
曲率条件还解释了 BFGS 更新的正曲率。令 、,则 因此“目标下降”与“取得合适曲率信息”是两种不同要求。回溯线搜索通常只检验 Armijo,不能自动当作完整 Wolfe 搜索。
变式与可运行的一维求解
变式从 沿 搜索,目标为 ,精确步长为 。位移为负一,终点仍是二。若在原点沿负方向搜索,则初始方向导数为正,不符合上述下降前提;缩小步长也无法使这个凸平方目标下降。
下例专用于平方目标,输入当前标量、下降方向和候选步长列表,返回精确步长及各候选的目标、Armijo/Wolfe判定,不改写输入。只用标准库,检查 个候选需 时间和输出空间;一般问题的成本主要来自每个目标和梯度评价。
def square_line_search(x=0.0, direction=1.0, candidates=(.25,1,2,3,4)):
slope = 2*(x-2)*direction
if slope >= 0:
raise ValueError("a descent direction is required")
exact = (2-x)/direction
rows = []
for a in candidates:
if a <= 0:
raise ValueError("positive trial step required")
f = (x+a*direction-2)**2
derivative = 2*(x+a*direction-2)*direction
armijo = f <= (x-2)**2+.25*a*slope
wolfe = armijo and derivative >= .5*slope
rows.append((a,f,armijo,wolfe))
return exact,rows
exact,rows = square_line_search()
print("exact",exact)
for row in rows:
print(row)
assert square_line_search(3,-2)[0] == 0.5
预算或容限使搜索停止时,应报告其接受条件;“线搜索成功”不等于整个多变量问题已达到最优。
参考文献
- ↑ Boyd and Vandenberghe, Convex Optimization,§9.2精确及非精确线搜索;Liu and Nocedal, On the limited memory BFGS method for large scale optimization,式2.4—2.5的Wolfe条件。