优化算法的目的:寻找最优解
算法的运行形式:通过迭代的形式, 从一个初始点开始一步一步的接近最优解. 比如 x k + 1 = x k − α ∇ f ( x k ) x^{k+1}=x^{k}-\alpha \nabla f\left(x^{k}\right) xk+1=xk−α∇f(xk), 表示点 x k x^{k} xk 沿着负梯度方向移动 α \alpha α 的距离(严格来说是 α ∥ ∇ f ( x k ) ∥ \alpha\left\|\nabla f\left(x^{k}\right)\right\| α∥∥∇f(xk)∥∥ 的距离)得到一个新的点 x k + 1 x^{k+1} xk+1, 使得新的点处的函数值比原来点的函数值要小,就达到了下降的目的. 一直这么迭代下去,就能找到最优解. 算法的核心:步长 step-size \text{step-size} step-size 和下降方向 descent direction \text{descent direction} descent direction. 下降方向决定迭代点下一次更新的方向, 步长决定迭代点下一次行走的距离,. 步长和方向做为算法的核心, 决定了算法是否收敘、收敘速度如何等等. 在本节内容中, 我们假设下一次迭代的方向已知,现在只考虑如何找到最优步长. 而对于迭代方向的讨论在后面章节的内容中会有所说明.
步长的一般处理方法
因为不同的步长肯定会有不同的效果,比如步长很大,运气了可能一下子就到了最优解,但也有可能步长太大导致每次迭代总是跨过了最优解,甚至无法收敘. 很显然,步长不能设的特别大,但是也不能特别小,否则迭代速度就会很慢, 浪费时间. 因此, 一般我们会先固定好下降方向
d
k
d^{k}
dk 和当前迭代点
x
k
x^{k}
xk, 把下一个迭代点
x
k
+
1
=
x
k
+
α
d
k
x^{k+1}=x^{k}+\alpha d^{k}
xk+1=xk+αdk 视为
α
\alpha
α 的函数, 去求解使得
f
0
(
x
k
+
1
)
f_{0}\left(x^{k+1}\right)
f0(xk+1) 的函数值最小的那个
α
\alpha
α 做为最终的步长. 即
α
k
=
arg
min
α
⩾
0
f
0
(
x
k
+
α
d
k
)
\alpha^{k}=\arg \underset{\alpha \geqslant 0 }{\min} f_{0}\left(x^{k}+\alpha d^{k}\right)
αk=argα⩾0minf0(xk+αdk)
这就是所谓的精确线搜索
exact line search
\text{exact line search}
exact line search的定义. (为什么叫线搜索? 是因为迭代点是定义域中的一个点, 而搜索时
x
k
+
α
d
k
x^{k}+\alpha d^{k}
xk+αdk 是从
x
k
x^{k}
xk 沿着
d
k
d^{k}
dk 方向发出的一条射线, 所以叫线搜索. )
黄金分割法|优选法|0.618法
找一个尽量大的数, 记为
α
max
\alpha_{\max }
αmax, 将
α
\alpha
α 限制在
(
0
,
α
max
]
\left(0, \alpha_{\max }\right]
(0,αmax] 内. 然后对区间做分割,截取
0.382
α
max
0.382 \alpha_{\max }
0.382αmax 和
0.618
α
max
0.618 \alpha_{\max }
0.618αmax 这两个对称点, 计算它们的函数值, 去掉函数值比较大的区域, 继续做分割,这样一直下去, 可以找打一个使得函数值充分小的步长
α
\alpha
α ,充分小由人为指定. 特点: 自己确定一个
α
max
\alpha_{\max }
αmax, 自己确定终止条件.
Armijo Rule/Armijo \text{Armijo Rule/Armijo} Armijo Rule/Armijo 线搜索
给定初值
α
\alpha
α, 速率
β
∈
(
0
,
1
)
,
γ
∈
(
0
,
0.5
]
\beta \in(0,1), \gamma \in(0,0.5]
β∈(0,1),γ∈(0,0.5] .
若
f
0
(
x
k
+
α
d
k
)
>
f
0
(
x
k
)
+
γ
α
∇
f
0
T
(
x
k
)
d
k
f_{0}\left(x^{k}+\alpha d^{k}\right)>f_{0}\left(x^{k}\right)+\gamma \alpha \nabla f_{0}^{T}\left(x^{k}\right) d^{k}
f0(xk+αdk)>f0(xk)+γα∇f0T(xk)dk, 令
α
=
α
β
\alpha=\alpha \beta
α=αβ, 否则就停止迭代.
如图,
α
=
0
\alpha=0
α=0 的点就是
f
0
(
x
k
)
f_{0}\left(x^{k}\right)
f0(xk) 的值,
g
(
x
k
+
α
d
k
)
=
f
0
(
x
k
)
+
α
∇
f
0
T
(
x
k
)
d
k
g(x^{k}+\alpha d^{k}) = f_{0}\left(x^{k}\right)+ \alpha \nabla f_{0}^{T}\left(x^{k}\right) d^{k}
g(xk+αdk)=f0(xk)+α∇f0T(xk)dk 则是那条蓝色的线, 过
(
0
,
f
0
(
x
k
)
)
\left(0, f_{0}\left(x^{k}\right)\right)
(0,f0(xk)) 点的一条切线, 实际上就是
f
0
(
x
k
+
α
d
k
)
f_{0}\left(x^{k}+\alpha d^{k}\right)
f0(xk+αdk) 在
x
k
x^{k}
xk 的一阶泰勒展开,这个时候更新
α
=
α
β
\alpha=\alpha \beta
α=αβ, 使得
α
\alpha
α 值减小, 再用
γ
\gamma
γ 调整一下斜率, 变成了红色的那条线. 因此,
Armijo
\text{Armijo}
Armijo 就是在给定
γ
,
β
\gamma,\beta
γ,β 之后, 去找红色线以下的所有
α
∈
[
0
,
α
f
e
a
s
i
b
l
e
]
\alpha \in [0,\alpha_{feasible}]
α∈[0,αfeasible] 中的一个做为步长.