凸优化之无约束优化(搜索步长或学习率设定问题)
多维优化问题的迭代求解算法中,经常遇到学习率(步长)参数问题。学习率大小对算法的影响有收敛性和收敛速度两个方面,收敛性放在具体的多维优化问题中讨论,这里讨论收敛速度问题,即每步迭代中最优学习率的选定问题。
1、一般多维优化问题中的迭代算法中的迭代公式为:
x(k+1)=x(k)+αk d(k)
其中 x(k) 从给定的初始搜索点 x(0) 迭代,αk≥0为第k次迭代的学习率或步长,迭代目的是寻找最优解x*,使得代价函数 J(x) 最小,d(k)表示搜索方向比如梯度下降方向,下面讨论学习率最优值问题, 定义第k步迭代中 α的选择标准为:min hk(α)= J(x(k) + αd(k)) = J(x(k+1)),即最优 α* 的选择应该使得 J(x(k+1)) 最小。
显然 min hk(α) 是一个求极小点的一维优化问题,可以使用前面提到的黄金分割法、斐波那契数列法,如果hk(α)连续一阶可微还可以使用二分法、割线法,如果连续二阶可微可以使用牛顿法。
2、下面讨论当 J(x) 具有标准二次型情况下的最优学习率问题,此时具有解析解:
hk(α)= J(x(k) + α*d(k)) = J(x(k+1)) 而 J(x) = J(x(k)) + ▽J(x(k))T(x-x(k)) + 1/2 * (x-x(k))TH(x(k))(x-x(k))
因此 hk(α) = J(x(k+1)) = J(x(k)) + α* ▽J(x(k))Td(k)+ 1/2 * α2 *(d(k))T H(x(k)) d(k)
hk(α)表示当前所选的学习率 α 使得下一次迭代x(k+1) 取得的成本函数值,显然所选取的 α,应使得J(x(k+1))尽可能的小,换句话说第 k 次迭代选取的最优 α* 应该使得J(x(k+1))最小。H(x(k)) 是海森矩阵,J(x)在 x(k) 处的二阶偏导。▽J(x(k))是J(x)在 x(k) 处的梯度。这是个一维优化问题:
h'k(α) = ▽J(x(k))Td(k) + α*(d(k))T H(x(k)) d(k)=0
α= - ▽J(x(k))Td(k) / (d(k))T H(x(k)) d(k)
特别地当d(k)= - ▽J(x(k)) 即沿着梯度下降方向搜索时,最优α具有解析解:||▽J(x(k))||2 / (▽J(x(k)))T H(x(k)) ▽J(x(k))。
3、在实际的多维优化中,这种每次求解最优学习率的方法一般很少使用,因为需要将更多的计算资源配置到多维优化算法中而不是追求高精度的学习率,因此应该为每一步中最优学习率的搜索设定一个停止条件。
Armijo-Goldstein条件:通常选定3个常数,0<ε<1, ε<η<1,要求:
(1) hk(α) ≤hk(0) + εαh'k(0) ,保证学习率α不会太大;
(2)hk(α) ≥hk(0) + ηαh'k(0) , 保证学习率α不会太小。
在多维优化问题中,对于每次迭代中的步长或学习率选择方法为:
一开始先为 α 选定一个备选值,如果能够满足(1),则选其为步长;否则,在该备选值上乘以一个系数 τ (0<τ<1),通常选τ=0.5,再次检验其是否能满足停止条件,以此类推直到选择出一个满足条件(1)的步长α。
1 #ifndef _MLARMIJOGOLDSTEINLO1D_H_ 2 #define _MLARMIJOGOLDSTEINLO1D_H_ 3 4 #include "MLLocalOptimization1d.h" 5 6 class MLArmijoGoldsteinLO1d : public MLLocalOptimization1d 7 { 8 public: 9 MLArmijoGoldsteinLO1d(PtrOneVarFunc f, PtrOneVarFunc g, float a0, float b0, float epsilon); 10 ~MLArmijoGoldsteinLO1d(); 11 12 virtual void Optimize(); 13 private: 14 float mEta;//0<mEpsilon<1,mEpsilon<mEta=0.5+0.5*mEpsilon<1,tau=0.5,x0=b0*0.9. 15 }; 16 17 18 #endif
1 #include "MLArmijoGoldsteinLO1d.h" 2 3 MLArmijoGoldsteinLO1d::MLArmijoGoldsteinLO1d(PtrOneVarFunc f, PtrOneVarFunc g, float a0, float b0, float epsilon):MLLocalOptimization1d(f, g, NULL, a0, b0, b0*0.9, epsilon) 4 { 5 mEta = epsilon+(1-epsilon)*0.5; 6 } 7 8 MLArmijoGoldsteinLO1d::~MLArmijoGoldsteinLO1d() 9 {} 10 11 void MLArmijoGoldsteinLO1d::Optimize() 12 { 13 int k; 14 float tau,xk; 15 tau=0.5; 16 k=0; 17 xk = mX0; 18 19 while(mFunc(xk)>(mFunc(0)+mEpsilon*xk*mGradient(0)) || mFunc(xk)<(mFunc(0)+mEta*xk*mGradient(0))) 20 { 21 xk = tau * xk; 22 #ifdef _DEBUG 23 cout<<"AGAlgorithm:"<<k++<<"th iteration xk="<<xk<<endl; 24 #endif 25 26 } 27 28 cout<<"ArmijoGoldstein algorithm final iteration x="<<xk<<endl; 29 mX = xk; 30 }
浙公网安备 33010602011771号