优化分析
优化
所谓优化,讲的就是如何求解目标函数在约束条件下的最优解。机器学习、人工智能中的绝大部分问题,到最后基本都会归结为求解优化问题,因此学习优化理论是非常有必要的。
这里只是一个非常简单的一个基础,感觉看完了也不会有太大的感触,让我一起来分析分析吧。
分析
交替迭代乘子算法(ADMM或交替方向乘子算法)
用于解决凸优化问题,什么是凸优化问题呢?
- 凸优化“ 是指一种比较特殊的优化,是指求取最小值的目标函数为凸函数的一类优化问题。其中,目标函数为凸函数且定义域为凸集的优化问题称为无约束凸优化问题。而目标函数和不等式约束函数均为凸函数,等式约束函数为仿射函数,并且定义域为凸集的优化问题为约束优化问题
那什么是凸函数呢?
首先,我们知道什么是凸集
- 一个集合 称为凸集,若对任意的两个点 ,连接他们的两个点都在集合 内。 即,一般可见的集合都是凸集,例如单位球体。
- 例如下图(为非凸集)
- 下图为凸集
凸函数就是一个定义在某个向量空间的凸子集C(区间)上的实值函数。
他的意义又是什么呢?
- 可以看上面二个图就可知,如果从a点到b点,非凸集,需要绕路,进行复杂的运算,而凸集只需要二点一线即可,简单方便。
接着,让我们回到正题,什么是ADMM?
它适用于求解分布式凸优化问题,通过分解协调将大的全局问题分解为多个较小、容易求解的局部子问题,并通过协调子问题的解而得到大的全局问题的解。若优化问题可以表示为:
其中s.t. 指 subject to,受限制于。
其中, x∈Rs,z∈Rn,A∈Rp∗s,B∈Rp∗n,c∈Rp , 且f, g 分别可以将x, z映射至R。可以从ADMM的名字看出,通过引入新变量,然后交叉变换方向来交替优化,即引入 y∈RP , 求解如下的目标函数:
优化过程具有可分解性,通过如下的迭代公式更新求解:
其中增广拉格朗日参数 ρ>0 。
其中,乘子算法指一种使用增广拉格朗日函数的对偶上升方法,而交替迭代指的是x,z交替更新。
具体的看这里凸优化:ADMM(Alternating Direction Method of Multipliers)交替方向乘子算法
那么如何保证ADMM算法的收敛性?
首先,什么是收敛性?
- 数学分析的基本概念之一,它与“有确定的(或有限的)极限”同义,“收敛于……”相当于说“极限是……(确定的点或有限的数)”。
如果想保证收敛性,需要有以下二个假设条件:
关于对偶问题,探索带有不等式约束的极值问题求解入戏a:
$$ h_i(w) = 0, i = 1, 2, \dots, l
对应的一般化拉格朗日公式为:
这里的 αi 和 βi 都是拉格朗日乘子。
可以看出,所谓的分析就是将其原理简单的剖析,将公式什么的列出来,完了分析他的一些问题,并进行解决。
梯度下降法
用来求函数的极小值,一阶最优化算法。
对于数据集 {xi,yi}mi=1 , 输入与输出之间的模型为 y=hθ(x) , 通过如下的优化目标函数求解参数:
通过初始化参数 θ(0) , 然后通过上述目标函数关于参数的偏导数,求出梯度下降量(沿方向):
更新直至损失函数满足一定的约束条件:
将求得的 θ(k) 代入至损失函数中,对于 J(θ(k)) , 若满足 |J(θ(k+1))−J(θ(k))|⩽ε , 则退出。
例如 求解f=2*(x-2)^2+(y-4)^2的极小值点
- 输入:
%%%%%%%%%%%%%%% 梯度下降法求函数极小值 %%%%%%%%%%%%%%%%%%
% 函数:f(x,y)=(x-2)^2+(y-4)^2
% 目的:求极小值和对应的极小值点坐标
% 方法:梯度下降法
% 理论:
% 方向导数:偏导数反应的是函数沿坐标轴方向的变化率,但许多物理现象告诉我们,只考虑函数沿坐标轴方向的变化率是不够的,有必要研究函数沿任一指定方向的变化率。
% 函数f(x,y)在点P0(x0,y0)可微分,那么函数在改点沿任一方向l的方向导数存在,其值为:f'x(x0,y0)*cos(α)+f'y(x0,y0)*cos(β),其中,cos(α),cos(β)是方向l
% 的方向余弦。
% 梯 度:是与方向导数有关联的另一个概念,梯度是一个向量,表示为:f'x(x0,y0)*i+f'y(x0,y0)*j。
% 关 系:
% f'x(x0,y0)*cos(α)+f'y(x0,y0)*cos(β)
% =grad f(x0,y0)*el
% =|grad f(x0,y0)|*cos(θ),其中el=(cos(α),cos(β))是与方向l同方向的单位向量。
% 变化率:函数沿某个方向的变化率指的是函数值沿这个方向变化的快慢。
% θ=0,el与梯度同向,函数增加最快,函数在这个方向的方向导数达到最大值,这个最大值就是梯度的模;
% θ=π,el与梯度反向,函数减少最快,函数在这个方向的方向导数达到最小值;
% θ=π/2,el与梯度方向正交,函数变化率为零;
%%
clear
clc
syms x y b
f=2*(x-2)^2+(y-4)^2; %求解函数的极小值点
Grad=[diff(f,x),diff(f,y)]; %求梯度
eps=1e-3;
v=[x,y];
v0=[0,0];
Grad0=subs(Grad,v,v0);%求V0的梯度值
M=norm(Grad0);%梯度的模,方向导数
n=0;
%%
while n<=100
d=-Grad0;%寻优搜索方向
fval=subs(f,v,v0);%函数值
%%
%%%%%%%%%%%%%%%%%%%%%%%求出最优步长,然后确定下一刻的坐标点%%%%%%%%%%%%%%%%%%%%%%%
%设步长变量为b,将v0=v0+b*d带入函数,求导,令导数等于零,解出最佳步长b1,此为一维寻优。得到下一刻坐标点v0=v0+b1*d
ft=subs(f,v,v0+b*d);%将步长变量带入函数
dft=diff(ft);%求导
b1=solve(dft);%得到该方向的最优步长
v0=v0+b1*d; %得到下一刻坐标点
%%
Grad0=subs(Grad,v,v0);%求下一刻梯度
M=norm(Grad0);%求方向导数大小,即梯度的模
n=n+1;
end
v0=double(v0);
fval=double(subs(f,v,v0));
disp(v0) %最优解
disp(fval) %f在v0处的最优值
- 输出:
2 4
0