最优化问题——无约束优化方法
在只前的文章中,我们关注的是非线性规划问题,以及对应步长因子的搜索方法。在非线性规划问题中,其基本形式包括目标函数和约束条件两个部分,并且约束条件确定了可行域等等重要的部分。但是今天,我们开始关注与不存在约束的无约束优化问题。
1 无约束优化问题的引入
1.1 无约束优化意义
实际的优化问题一般都有很多的约束,那么为什么还需要研究无约束的最优化方法呢?首先,我们从一个例子开始,相信大家在看到我的这篇文章之前,对于机器学习中的SVM算法已经有了一定的了解,对于SVM的求解,同样也是包含目标函数和约束条件两个部分,然后,我们通过拉格朗日乘子法将约束条件和目标函数进行了组合,然后采用了KKT条件对于组合之后的目标函数式进行了求解。(有兴趣的读者可以具体了解一下SVM算法)
一般来说,很多的有约束问题,都可以通过拉格朗日乘子法来将有约束的问题转换成无约束的问题来进行求解。与此同时,我们在有约束的问题求救中,大多数都是先确定一个方向,然后按照方向最小化来进行推进,这种线搜索的方式实际上就是无约束或者简单约束的最小化的问题。
最后,有几种无约束的最优化方法可以很自然的推广到有约束的问题的求解上面去。
为了更好的理解无约束优化方法,下面我们来回顾一下我们之前介绍的线搜索的基本方法。
1.2 线搜索方法回顾——黄金分割法
注意,这里我们只给出一般的计算公式,具体细节可以参考我之前的关于先搜索的文章。
1.3 线搜索方法回顾——斐波那契
1.3 线搜索方法回顾——Dichotomous
1.4 线搜索方法回顾——无导数线性搜索总结
1.5 线搜索方法回顾—利用导数信息
1.5 线搜索方法回顾——牛顿法
1.5 线搜索方法回顾——非精确搜索算法
2 坐标轮换法
在回顾了关于线性搜索的相关算法之后,我们从不使用导师的思路开始,下面我们来介绍无约束优化的第一个算法——坐标轮换法。
2.1 基本思路
坐标轮换法的基本思路很简单,在搜索方向上采用的是以坐标轴作为基本的搜索方向,沿着 d 1 , d 2 , . . . , d n d_1,d_2,...,d_n d1,d2,...,dn进行搜索,其中 d j d_j dj是除了第j个位置为1,其他位置为0的向量。此时只是去改变第j个向量,而其他的向量不变。同时,我们只是去调节该方向对应的变量的最优值。下面我们举一个简单的例子来里了解一下这种思路:
给定优化目标函数为:
m
i
n
(
x
1
−
2
)
4
+
(
x
1
−
2
∗
x
2
)
2
min(x_1-2)^4+(x_1-2*x_2)^2
min(x1−2)4+(x1−2∗x2)2
同时我们给定初始点为
(
0
,
3
)
(0,3)
(0,3)
不难发现,方向d一个包括
(
0
,
1
)
,
(
1
,
0
)
(0,1),(1,0)
(0,1),(1,0)两个方向,沿着方向
d
1
,
d
2
d_1,d_2
d1,d2开始搜索,计算过程为:
x
1
1
=
x
0
+
λ
0
(
1
,
0
)
=
>
λ
0
∈
(
3
,
4
)
=
3.13
,
x
1
1
=
(
3.13
,
3.00
)
x_1^1=x_0+λ_0(1,0)=>λ_0∈(3,4)=3.13,x_1^1=(3.13,3.00)
x11=x0+λ0(1,0)=>λ0∈(3,4)=3.13,x11=(3.13,3.00)
注意,
λ
0
λ_0
λ0是是通过上述的一维搜索获得的。具体方法这里不再赘述。
此时,我们先确定的是关于x变量的第一个维度的最优值。
x
2
1
=
x
1
+
λ
1
(
0
,
1
)
=
>
λ
1
=
−
1.414
,
x
2
1
=
(
3.13
,
1.56
)
x_2^1=x_1+λ_1(0,1)=>λ_1=-1.414,x_2^1=(3.13,1.56)
x21=x1+λ1(0,1)=>λ1=−1.414,x21=(3.13,1.56)
此时,我们确定的是关于x变量的第二个维度的最优值。
这样,我们就完成了一轮的迭代。注意,这里我们使用上角标表示变量,下角标表示变量的第几个维度。
上面给出的是一轮的计算过程,其多轮的迭代过程如下表所示:
同时,我们也给出变化寻找最优的变化趋势图:
看到这里,估计由很多读者对于这种方法的基本思路有了一些了解,下面我们就以上面的例子来具体的进行分析一下算法的细节。我们就以上面描述的那一轮迭代开始:
- 如何确定步长因子λ?
对于这个问题,其解决思路很简单,其是就是简单一维搜索,以第一个计算为例,我们已经确定了方向(1,0),此时目标函数就可以转换成 φ ( λ ) φ(λ) φ(λ)的一维搜索问题,通过我们之前介绍的搜索方法就可以确定最优的步长情况。 - 每一次的迭代一共有多少个步骤?
对于每一次的迭代,我们需要按照顺序,在每一个坐标方向上搜索一次,那么每一次的迭代就需要n个步骤(和坐标轴方向的个数一致)。在每一轮迭代中的每一个步骤中,我们所确定的都是变量x中某一个维度的最优值。(个人理解:这更新是一种对于x每个维度一维搜索,每一轮迭代,不考虑对于步长的确定,其实就是由n个一维搜索构成的)。同时需要注意的是每一轮对于x的某一个维度搜索的时候,使用的是前一个维度搜索出来的最优值来作为当前的输入。 举一个例子来说:
假设我们初始给定的点为 x 1 = ( x 1 1 , x 2 1 , . . . , x n 1 ) x_1=(x_1^1,x_2^1,...,x_n^1) x1=(x11,x21,...,xn1),在第一轮的迭代中,假设我们第一个维度 x 1 2 x_1^2 x12的已经搜索结束,那么在对第二维度进行搜索的时候,使用的应该是下面的形式:
x 2 2 = a r g m i n f ( x 1 2 , x 2 , . . . , x n 1 ) x_2^2=argminf(x_1^2,x_2,...,x_n^1) x22=argminf(x12,x2,...,xn1)
同理:
x 3 2 = a r g m i n ( x 1 2 , x 2 2 , x 3 , . . . , x n 1 ) x_3^2=argmin(x_1^2,x_2^2,x_3,...,x_n^1) x32=argmin(x12,x22,x3,...,xn1)
直到执行了n个搜索步骤,我们就确定了下一轮的输入 x 2 x^2 x2。
注意: 当函数可微的时候,方法会收敛到梯度为0的点,但是不可微的时候,则可能会在非最优点停止,如下图所示:
此时,任何坐标方向都不会有函数值下降的点,此时可以通过搜索
x
2
−
x
1
x^2-x^1
x2−x1的方向来进行克服这个问题。如下图所示:
这种沿着方向
x
k
+
1
−
x
k
x^{k+1}-x^k
xk+1−xk搜索的方式在坐标轮换方法中经常使用,有时函数可微的时候也可以采用这种方法,并且在固定k词迭代之后进行一次这样的搜索,通常可以加快收敛。也就是说,这种思路可以形成加速步。
3 离散步长的Hooke和Jeeves方法
在对于坐标轮换法有了一定的了解之后,我们下面基于坐标轮换来描述下一个搜索算法Hooke and Jeeves 算法。
3.1 基本思路
这种方法在进行最优点搜索的时候,通常会执行两种类型的搜索,包括试探搜索和模式搜索。
首先,我们给定初始点
x
0
x^0
x0,按照坐标轮换法的方式进行坐标轮换搜索到点
x
1
x^1
x1。下一步,我们需要根据
x
1
−
x
0
x^1-x^0
x1−x0进行模式搜索。然后产生一个最优点
y
y
y。
进一步,我们来举一个例子来说明一下:
假设,我们的目标函数为:
m
i
n
(
x
1
−
2
)
4
+
(
x
1
−
2
x
2
)
2
,
初
始
点
为
(
0
,
3
)
min(x_1-2)^4+(x_1-2x_2)^2,初始点为(0,3)
min(x1−2)4+(x1−2x2)2,初始点为(0,3)
我们以第一轮迭代为例:
首先是试探搜索,从两个方向(1,0)和(0,1)进行搜索:
x
1
1
=
x
0
+
λ
0
(
1
,
0
)
=
>
λ
0
∈
(
3
,
4
)
=
3.13
,
x
1
1
=
(
3.13
,
3.00
)
x_1^1=x_0+λ_0(1,0)=>λ_0∈(3,4)=3.13,x_1^1=(3.13,3.00)
x11=x0+λ0(1,0)=>λ0∈(3,4)=3.13,x11=(3.13,3.00)
x
2
1
=
x
1
+
λ
1
(
0
,
1
)
=
>
λ
1
=
−
1.414
,
x
2
1
=
(
3.13
,
1.56
)
x_2^1=x_1+λ_1(0,1)=>λ_1=-1.414,x_2^1=(3.13,1.56)
x21=x1+λ1(0,1)=>λ1=−1.414,x21=(3.13,1.56)
下一步是模式搜索,在执行到这一步的时候,我们已经能够知道的通过当前的试探搜索已经获得试探搜索的结果为(3.13,1.56),同时以上面的两个搜索的差值(3.13,-1.44)为模式搜索的方向,则进行模式搜索为:
y
1
=
x
2
1
+
λ
(
3.13
,
−
1.44
)
y_1=x_2^1+λ(3.13,-1.44)
y1=x21+λ(3.13,−1.44)
在搜索到最优λ之后,我们就能确定
y
1
y_1
y1的最优值为(2.82,1.70)。
然后,以 y 1 y_1 y1为初始点,重复进行迭代,具体的迭代过程为:
由于在第一步使用了坐标轮换搜索,所以这里我们给出两种方法在收敛上的图示,其中左侧为Hooke算法,右侧为坐标轮换法:
从上面的图示中,我们可以看出,Hooke算法相比于坐标轮换法,其收敛的速度更快,更加有效。
3.2 算法描述
最后,我们来总结一下离散步长的Hooke算法和Jeeves方法的算法步骤:
初始时 d 1 , d 2 , . . . , d n d_1,d_2,...,d_n d1,d2,...,dn为坐标轴方向,标量ε>0作为终止算法的参数,步长 △ ≥ ε △≥ε △≥ε,加速因子α>0(用于离散步长,加速收敛),初始点为 x 1 x_1 x1,令 y 1 = x 1 , k = j = 1 y_1=x_1,k=j=1 y1=x1,k=j=1
- 在 f ( y j + △ d j ) < f ( y j ) f(y_j+△d_j)<f(y_j) f(yj+△dj)<f(yj),试验成功,令 y j + 1 = y j + △ d j y_{j+1}=y_j+△d_j yj+1=yj+△dj,转到下一步。否则,如果 f ( y j − △ d j ) ≥ f ( y j ) f(y_j-△d_j)≥f(y_j) f(yj−△dj)≥f(yj),则试验失败。此时如果 f ( y j − △ d j ) < f ( y j ) f(y_j-△d_j)<f(y_j) f(yj−△dj)<f(yj),令 y j + 1 = y j − △ d j y_{j+1}=y_j-△d_j yj+1=yj−△dj,转向第二步,否则 y j + 1 = y j y_{j+1}=y_j yj+1=yj,转向第二步。
- 若 j < n , j < − j + 1 j<n,j<-j+1 j<n,j<−j+1重复第一步。否则,若 f ( y n + 1 ) < f ( x k ) f(y_{n+1})<f(x_k) f(yn+1)<f(xk),转向第三步,否则转向第四步。
- 令 x k + 1 = y n + 1 x_{k+1}=y_{n+1} xk+1=yn+1,令 y 1 = x k + 1 + α ( x k + 1 − x k ) y_1=x_{k+1}+α(x_{k+1}-x_k) y1=xk+1+α(xk+1−xk),令 k < − k + 1 k<-k+1 k<−k+1,令j=1,转向第一步。
- 如果 △ ≤ ε △≤ε △≤ε,停止; x k x_k xk为解。否则, △ < − △ 2 △<-\frac{△}{2} △<−2△,令 y 1 = x k y_1=x_k y1=xk, x k + 1 = x k x_{k+1}=x_k xk+1=xk,k<-k+1,令j=1,重复第一步。
这里为了便于理解,我们以伪代码的形式给出上述的算法:
简单的分析一下,Step1的作用就是在进行试探搜索。这个搜索过程包括前向和反向两个梯度的搜索,其最终的目标就是是目标函数值下降。
对于Step2,是采用最大维度来确定算法是否应该停止。如果没有超过了向量的最大维度,则可以继续按照顺序来继续进行试探搜索。否则,比较最后两次的试探搜索结果的值,如果满足最后一次结果的函数值小于倒数第二次的结果的函数值,则转向Step3,继续进行模式搜索。否则转向Step4,用△和e比较来确定是否停止。如果算法不符合整体的停止条件,然后转向Step1进行下一轮迭代。
最后,我们在举一个实际的计算例子:
在计算完第一轮的迭代之后,执行完Step3之后,再次转向到Step1中,重复进行试探搜索。后面的过程和第一轮类似,在搜索的过程中,从Step2转向step4来决定算法是否结束。在最后,我们给出整个的迭代过程:
3.3 代码实现
在理解了Heek算法之后,进一步,我们给出算法的代码实现:
4 Rosenbrock算法
4.1 基本思路
回顾我们上面提出的两个算法,无论是坐标轮换法还是Hooke算法,都是没有进行线搜索,而是直接采取沿搜索方向的离散步长的搜索。同理,我们在Rosenbrock方法中也利用到了这个思想。在Rosenbrock方法中,并没有线搜索而是直接采取沿着搜索方向的离散步长搜索,每次迭代沿着n个线性无关的正交方向来进行。当达到每次迭代终点的时候,构造一组正交向量。
具体的来说,假设 d 1 , d 2 , . . . , d n d_1,d_2,...,d_n d1,d2,...,dn是一组线性无关,范数为1的向量。并假设这组向量相互正交,从当前向量 x k x_k xk开始,目标函数f沿着每一个方向进行最小化,得到 x k + 1 x_{k+1} xk+1点,此时: x k + 1 − x k = ∑ j = 1 n λ j d j x_{k+1}-x_k=∑_j=1^nλ_jd_j xk+1−xk=∑j=1nλjdj, λ j λ_j λj为该方向上移动的距离。这一步迭代之后,我们下面需要构造一组正交向量,正交向量的构造可以通过Gram-Schmidt过程来实现。
我们用 d j − , j = 1 , 2 , 3 , . . . n d_j^-,j=1,2,3,...n dj−,j=1,2,3,...n表示构造出来的正交方向的集合。其具体的产生公式为:
a
j
=
{
d
j
λ
j
=
0
∑
i
=
j
n
λ
i
d
i
λ
j
≠
0
a_j=\begin{cases}d_j&λ_j=0\\ ∑_{i=j}^nλ_id_i&λ_j≠0\end{cases}
aj={dj∑i=jnλidiλj=0λj=0
b
j
=
{
a
j
j
=
1
a
j
−
∑
i
=
1
j
−
1
(
a
j
t
d
i
−
)
,
d
i
−
j
≥
2
b_j=\begin{cases}a_j&j=1\\ a_j-∑_{i=1}^{j-1}(a_j^td_i^-),d_i^-&j≥2\end{cases}
bj={ajaj−∑i=1j−1(ajtdi−),di−j=1j≥2
其中:
d
j
−
=
b
j
∣
∣
b
j
∣
∣
d_j^-=\frac{b_j}{||b_j||}
dj−=∣∣bj∣∣bj
最后,可以证明,如股票 d 1 , d 2 , . . . , d n d_1,d_2,...,d_n d1,d2,...,dn是一组线性无关的相互正交的变量,则上述构造的 d i − , j = 1 , 2 , . . , n d_i^-,j=1,2,..,n di−,j=1,2,..,n对任意 λ j λ_j λj也是线性无关,相互正交的向量,并且如果 λ j = 0 λ_j=0 λj=0,则 d j = d j − d_j=d_j^- dj=dj−
4.2 算法描述
在这一个部分,我们给出Rosenbrock算法的具体步骤:
Step1:沿着坐标方向搜索得到
y
j
+
1
=
y
j
+
λ
j
d
j
y^{j+1}=y^j+λ_jd_j
yj+1=yj+λjdj
Step2 : 令
x
k
+
1
=
y
k
+
1
x^{k+1}=y^{k+1}
xk+1=yk+1,如果两次解的距离小于预订的精度,则算法停止,否则令
y
k
=
x
k
+
1
,
k
<
−
k
+
1
y^k=x^{k+1},k<-k+1
yk=xk+1,k<−k+1,转向Step3。
Step3:根据我们上面的公式,重新计算得到新的正交方向,重复
S
t
e
p
1
Step1
Step1。
4.3 Rosenbrock算法实例
最后,我们给出整个例子的迭代过程:
4.3 带有离散步长的Rosenbrock算法
在上述的Rosenbrock算法中,对于步长,我们采用的是线搜索的形式。进一步,为了避免线搜索,函数值在具体的点上进行计算的时候,可以通过适当的增加或者减少步长来加速收敛,离散的步长获取方式和之前定义的离散的Jeeves算法类似,这里不再赘述。
5 参考
- 哈工大—组合优化和凸优化