首页 > 其他 > 详细

[Opt] 拉格朗日乘子法 | ADMM | Basis pursuit

时间:2020-10-24 23:05:04      阅读:70      评论:0      收藏:0      [点我收藏+]

[Opt] 拉格朗日乘子法 | ADMM | Basis pursuit

乘子法

本文先简要介绍三个乘子法,它们的收敛条件依次减弱(不做具体介绍),然后应用 ADMM 算法求解 Basis pursuit 问题最后读读 Boyd 给出的代码。

  1. Lagrange Multiplier(拉格朗日乘子法)
  2. Augmented Lagrangian Multiplier(增广拉格朗日乘子法,ALM)
  3. Alternating Direction Method of Multipliers(变方向乘子法,ADMM)

乘子法部分参考文献[1]。


拉格朗日乘子法

考虑如下等式约束的优化问题

技术分享图片

用拉格朗日乘子法求解,先写出拉格朗日函数:

技术分享图片

其中 技术分享图片 是拉格朗日乘子。它的对偶函数为

技术分享图片

对偶问题为

技术分享图片

我们需要的解是

技术分享图片

这里的 技术分享图片 是对偶问题的最优解,下面我们用梯度下降法求解它。迭代公式为

技术分享图片

其中 技术分享图片

①总结拉格朗日乘子法的更新方法如下:

技术分享图片


增广拉格朗日乘子法

用增广拉格朗日乘子法求解,先写出增广拉格朗日函数:

技术分享图片

②类似拉格朗日乘子法,增广拉格朗日乘子法的更新方法如下:

技术分享图片


ADMM

ADMM 问题形式(with 技术分享图片 convex)

技术分享图片

它的增广拉格朗日函数为

技术分享图片

③ADMM 的更新方法如下:

技术分享图片


Basis pursuit

优化目标:

技术分享图片

写成 ADMM 的形式

技术分享图片

其中 技术分享图片 表示指示函数,相关的内容我在 [Opt] 近端最小化算法 有写过。那么它的增广拉格朗日函数为

技术分享图片

第一步:更新 技术分享图片 :

技术分享图片

我们记 技术分享图片 。上述问题为 技术分享图片 在仿射集上的投影问题,求解参考[4],具体原理等内容我在 [ML] 深入线性回归 提到过。

它的解为 技术分享图片 。

第二步:更新 技术分享图片 :

技术分享图片

上面这个问题我在 [Opt] Proximal Gradient 及 Lasso 问题 中详细讨论过了。它的解析解是

技术分享图片

第三步,更新乘子 技术分享图片

技术分享图片

因此我们只要按如下等价地更新 技术分享图片 即可

技术分享图片

④ 总结 Basis pursuit 更新方法如下:

技术分享图片技术分享图片

MATLAB 代码

运行结果

左实线:目标函数值迭代更新变化曲线

右上实线:primal residual 技术分享图片

右上虚线:primal feasibility tolerance

右下实线:dual residual 技术分享图片

右下虚线:dual feasibility tolerance

技术分享图片

MATLAB 中在命令行窗口输入如下指令获取 basis_pursuit 函数

grabcode("http://web.stanford.edu/~boyd/papers/admm/basis_pursuit/basis_pursuit.html")

输入以下指令获取 Basis pursuit example 测试代码

grabcode("http://web.stanford.edu/~boyd/papers/admm/basis_pursuit/basis_pursuit_example.html")

basis_pursuit.m

function [z, history] = basis_pursuit(A, b, rho, alpha)
% basis_pursuit  Solve basis pursuit via ADMM
%
% [x, history] = basis_pursuit(A, b, rho, alpha)
% 
% Solves the following problem via ADMM:
% 
%   minimize     ||x||_1
%   subject to   Ax = b
%
% The solution is returned in the vector x.
%
% history is a structure that contains the objective value, the primal and 
% dual residual norms, and the tolerances for the primal and dual residual 
% norms at each iteration.
% 
% rho is the augmented Lagrangian parameter. 
%
% alpha is the over-relaxation parameter (typical values for alpha are 
% between 1.0 and 1.8).
%
% More information can be found in the paper linked at:
% http://www.stanford.edu/~boyd/papers/distr_opt_stat_learning_admm.html
%

t_start = tic;

%% Global constants and defaults

QUIET    = 0;
MAX_ITER = 1000;
ABSTOL   = 1e-4; % 绝对误差容限
RELTOL   = 1e-2; % 相对误差容限

%% Data preprocessing

[~, n] = size(A);

%% ADMM solver

x = zeros(n,1);
z = zeros(n,1);
u = zeros(n,1);

if ~QUIET
    fprintf(‘%3s\t%10s\t%10s\t%10s\t%10s\t%10s\n‘, ‘iter‘, ...
      ‘r norm‘, ‘eps pri‘, ‘s norm‘, ‘eps dual‘, ‘objective‘);
end

% precompute static variables for x-update (projection on to Ax=b)
AAt = A*A;
P = eye(n) - A* (AAt \ A);
q = A* (AAt \ b);

for k = 1:MAX_ITER
    % x-update
    x = P*(z - u) + q;

    % z-update with relaxation
    zold = z;
    x_hat = alpha*x + (1 - alpha)*zold; % 带松弛的更新方法
    z = shrinkage(x_hat + u, 1/rho);

    u = u + (x_hat - z);

    % diagnostics, reporting, termination checks
    history.objval(k)  = objective(A, b, x);

    history.r_norm(k)  = norm(x - z); % primal residual
    history.s_norm(k)  = norm(-rho*(z - zold)); % dual residual
    
    history.eps_pri(k) = sqrt(n)*ABSTOL + RELTOL*max(norm(x), norm(-z)); % primal feasibility tolerance
    history.eps_dual(k)= sqrt(n)*ABSTOL + RELTOL*norm(rho*u); %  dual feasibility tolerance

    if ~QUIET
        fprintf(‘%3d\t%10.4f\t%10.4f\t%10.4f\t%10.4f\t%10.2f\n‘, k, ...
            history.r_norm(k), history.eps_pri(k), ...
            history.s_norm(k), history.eps_dual(k), history.objval(k));
    end

    if (history.r_norm(k) < history.eps_pri(k) && ...
       history.s_norm(k) < history.eps_dual(k))
         break;
    end
end

if ~QUIET
    toc(t_start);
end

end

function obj = objective(A, b, x)
    obj = norm(x,1);
end

function y = shrinkage(a, kappa)
    y = max(0, a-kappa) - max(0, -a-kappa);
end

 

run.m

% Basis pursuit example

%% Generate problem data
rand(‘seed‘, 0);
randn(‘seed‘, 0);

n = 30; 
m = 10;
A = randn(m,n);

x = sprandn(n, 1, 0.1*n);
b = A*x;

xtrue = x;

%% Solve problem

[x, history] = basis_pursuit(A, b, 1.0, 1.0);

%% Reporting
K = length(history.objval);                                                                                                        

h = figure;
plot(1:K, history.objval, ‘k‘, ‘MarkerSize‘, 10, ‘LineWidth‘, 2); 
ylabel(‘f(x^k) + g(z^k)‘); xlabel(‘iter (k)‘);

g = figure;
subplot(2,1,1);                                                                                                                    
semilogy(1:K, max(1e-8, history.r_norm), ‘k‘, ...
    1:K, history.eps_pri, ‘k--‘,  ‘LineWidth‘, 2); % 原始问题的残差
ylabel(‘||r||_2‘); 

subplot(2,1,2);                                                                                                                    
semilogy(1:K, max(1e-8, history.s_norm), ‘k‘, ...
    1:K, history.eps_dual, ‘k--‘, ‘LineWidth‘, 2);   % 对偶问题的n

ylabel(‘||s||_2‘); xlabel(‘iter (k)‘); 

参考文献

[1] ADMM talk

[2] Boyd ADMM

[3] Bertsekas D P, Scientific A. Convex optimization algorithms[M]. Belmont: Athena Scientific, 2015. p286.

[4] Projection of onto the affine set

编辑于 03-14

[Opt] 拉格朗日乘子法 | ADMM | Basis pursuit

原文:https://www.cnblogs.com/cx2016/p/13869966.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!