增广拉格朗日法
增广拉格朗日法(augmented Lagrangian method)把约束乘子与约束残差的二次罚项合在一起,通过交替求解变量子问题和更新乘子来处理约束优化。它与只把罚参数不断增大的二次罚函数法有不同的纠偏机制。下面先讨论等式约束,乘子允许为任意实数。
固定罚参数也能逐步满足约束
考虑 ,要求 。原问题只有一个可行点,最优值为 。给定乘子 和罚参数 ,增广拉格朗日函数为 固定乘子求最小点,导数条件给出 。随后把约束偏差反馈给乘子: 取 ,依次得到 、、。乘子越来越负,使下一次子问题对偏小的 施加更强的纠偏。
把两步合并,得到 。最优乘子为 ,因此 这完整证明了本例以收缩因子 趋向可行最优点,罚参数无须趋于无穷。
一般仿射等式与驻点关系
设 ,、,目标 可微。定义 乘子法先取全局子问题解 ,再更新 。假设子问题有解,其一阶条件直接化成 更新乘子后,拉格朗日驻点关系恰好满足;尚未消除的是可行性残差 。若 凸,且残差为零,上式与凸函数一阶不等式一起证明当前点全局最优:对任意可行 ,有 。[1]
精确子问题可被近似求解代替,但此时驻点式也出现内层误差;其容限和外层残差需共同控制。一般非凸模型中的局部子问题解,不能自动提供上述凸全局结论。
罚函数比较、变式与求解成本
若只用 ,固定 时总会得到 ,重复求同一子问题并不会进一步缩小偏差。要让其误差趋零,需要让 ;增广法则保留并更新了线性项。
变式把目标改为 ,要求 ,其中 。此时 ,最优乘子 ,乘子误差每步乘以 。例如 、初乘子零,第一点为 ,新乘子为 ,第二点为 ,最终趋于三。这与主例共用同一个推导。
增广项并不无条件使任意目标有界。例如二维目标 、约束 ,只给 加二次罚项无法限制 ,子问题仍无下界。对非线性等式 ,可将残差换为 ,但罚项可能非凸,内层求解和收敛条件必须重新分析。
下例只用标准库,输入正曲率、目标约束值、正罚参数、初乘子及步数,返回变量、乘子、可行性残差和驻点残差,不改写输入。每步时间与工作空间为常数,历史占 。一般二次目标的子问题要处理 ,稠密分解成本约为 ,固定罚参数时可复用分解;过大参数也可能使数值条件变差。
def augmented_scalar(c=1.0, a=1.0, rho=1.0, multiplier=0.0, count=3):
if c <= 0 or rho <= 0 or count < 0:
raise ValueError("positive curvature and penalty required")
lam, trace = float(multiplier), []
for k in range(1,count+1):
x = (rho*a-lam)/(c+rho)
residual = x-a
lam += rho*residual
trace.append((k,x,lam,residual,c*x+lam))
return trace
for row in augmented_scalar():
print(row)
print("variant", augmented_scalar(c=2,a=3,rho=2,count=2))
assert all(abs(row[-1]) < 1e-12 for row in augmented_scalar())
主例输出可行性残差为 -0.5,-0.25,-0.125,驻点残差均为零。前几步的原目标低于 ,因为它们尚不可行,这些数值不能当作原问题已取得的可行上界。
参考文献
- ↑ Boyd et al. (2011), Distributed Optimization and Statistical Learning via the Alternating Direction Method of Multipliers,§2.3。