无条件凸优化问题
在这一部分我们的目标是求出凸函数的最小值。一般来说,只要我们能解出方程\(\nabla f(x)=0\)我们就能求出最小值点。然而很多时候这一方程的封闭解是不存在的,这要求我们用其它的手段来求最小值。
梯度下降(Gradient Descent)
在线性规划的单纯形法中我们注意到每次移动到一个更优值最终能保证我们找到最优解,那在非线性的凸优化中是否存在一个类似的方法?这就是下降方法,我们每次都找到一个更小的值,期待我们最终找到最优值。
在\(f(x_0)\)处,\(-\nabla f(x_0)\)的方向是函数值下降最快的方向,因此我们能保证每次往负梯度方向移动一小步,函数值是一定会下降的,因此我们期待反复迭代这一过程最终得到最小值。然而步长的确定是一个困难的工作,步长太长会导致反复横跳,步长太短会导致无法收敛到最小值。我们无法对于任意函数给出一个选取最优步长的公式,但我们可以讨论当函数满足一些特殊的性质时,我们能给出步长选取的方法。
当函数满足对于任意\(x,y\)有\(\|\nabla f(x)-\nabla f(y)\| \leq L\|x-y\|\)时,我们称\(f\)为\(L-\)smooth函数(这个条件还等价于\(\nabla^2 f(x)\)的最大特征值的绝对值不超过\(L\),也等价于\(|f(y)-f(x)-\lang \nabla f(x),y-x\rang| \leq \dfrac{L}{2}\|y-x\|^2\)恒成立)。这个条件保证了函数的一阶导变化不会太快。此时取步长\(\eta \leq \dfrac{1}{L}\),我们能够证明每次迭代\(x_{k+1}=x_k-\eta\nabla f(x_k)\),则有\(f(x_{k+1})\leq f(x_k)-\dfrac{t}{2}\|\nabla f(x_k)\|^2\)成立。这称为下降引理,选取这样的步长我们能保证函数值不断下降,收敛到最小值。
下降引理只给出了单步的下降估计,无法给出整体的下降速率的估计。为了分析梯度下降整体的算法,我们先分析一个连续版本的梯度下降算法:在每点处取梯度方向连成一条曲线,也即曲线\(x(t)\)满足\(\dfrac{d}{dt}x(t)=-\nabla f(x(t))\),称为梯度流。对于\(x(t)\)我们可以计算得到\(f(x(t))-f(x^*)\leq \dfrac{\|x(0)-x^*\|_2^2}{2t}\),其中\(x^*\)是极值点。梯度下降可以看作梯度流下降的离散版本的近似,分析得到\(f(x_k)-f(x^*)\leq \dfrac{\|x_0-x^*\|^2_2}{2k\eta}\),也即函数值的收敛可以用迭代次数\(k\)的反比来bound。
一个与迭代次数成反比的估计不是任何时候都够用的bound。例如我们会发现对于二次函数梯度下降的收敛速率达到指数收敛。也就是说,对于满足更苛刻要求的函数,我们可以做出更好的收敛分析。一个重要的性质称为Strong Convexity(强凸性),如果\(f(x)-\dfrac{\mu}{2}\|x\|^2\)是凸的,那么称\(f(x)\)是强凸的。直观上可以看到,强凸函数是比二次函数“更凸”的函数。强凸有一些其它等价描述,例如\(\mu\)-强凸等价于二阶导矩阵的特征值全部\(\geq \mu\),也等价于\(f(y)\geq f(x)+\)\(\lang \nabla f(x),y-x \rang\)\(+\dfrac{\mu}{2}\|y-x\|^2\)恒成立,根据凸函数的梯度单调性得到它也等价于\(\lang \nabla f(x)-\nabla f(y),x-y\rang\geq \mu\|x-y\|^2\)恒成立。从中也可以看出强凸一定是严格凸的。对于\(\mu\)-强凸的\(L-\)smooth函数,梯度下降满足\(\|x_k-x^*\|^2\leq (1-\mu\eta)^k\|x_0-x^*\|^2\)。可见自变量的距离可以用迭代次数的指数次方来bound。函数值的收敛也是指数的,有\(f(x_k)-f(x^*) \leq\)\(\dfrac{L}{2}(1-\mu\eta)^k\|x_0-x^*\|^2\)。
对于二次函数\(f(x)=\dfrac{1}{2}x^\top Qx\),其中\(Q\)是半正定的,根据强凸和\(L-\)smooth的等价条件,我们立马得到\(f(x)\)是一个\(\lambda_{\min}(Q)\)-强凸以及\(\lambda_{\max}(Q)\)-smooth的函数。于是可以取\(\eta = \dfrac{1}{\lambda_{\max}(Q)}\),根据上面的分析得到梯度下降的收敛速率正比于\(\left(1-\dfrac{\lambda_{\min}(Q)}{\lambda_{\max}(Q)}\right)^k\)。事实上,对于二次函数,经过更精确的分析我们发现可以取\(\eta = \dfrac{2}{\lambda_{\min}(Q)+\lambda_{\max}(Q)}\),这样得到收敛速率正比于\(\left(\dfrac{\lambda_{\max}(Q)-\lambda_{\min}(Q)}{\lambda_{\max}(Q)+\lambda_{\min}(Q)}\right)^{2k}\),把\(\dfrac{\lambda_{\max}(Q)}{\lambda_{\min}(Q)}\)记为\(\kappa\),称为Condition Number,可见二次函数的收敛速率是关于\(\left(\dfrac{\kappa-1}{\kappa+1}\right)^2\)的。对于一般的二阶可导函数\(f(x)\),我们可以在局部泰勒展开到二阶来逼近,这样就可以把它视为二次函数,对它用梯度下降时收敛速率取决于\(\left(\dfrac{\kappa(\nabla^2 f(x))-1}{\kappa(\nabla^2 f(x))+1}\right)^2\)。
线搜索(Line Search)
梯度下降的步长选取依赖于函数的光滑程度。而对于非\(L-\)smooth的函数,或是难以确定\(L\)的\(L\)-smooth函数,我们就无法使用上面的分析。此时如何选取梯度下降的步长呢?
一个直接的想法是,由于在梯度方向的整条直线上函数依然凸函数, 那么直接下降到这个一元函数的最小值点。这就称为精确线搜索(Exact Line Search),它每次搜索给定“线”上的最小值,然后做迭代。(注意到在这样的迭代过程中,每次到达新的一点后沿原方向的梯度分类就势必是0,不然函数值在该方向上会更小,因此我们每次前进的方向都是互相垂直的。)
如何找到线上的最小值点?这本质上就在问如何找到一个一元凸函数的极小值,一元凸函数的导函数是单调函数,因此我们可以直接对导函数二分。一个更好的方法是用牛顿迭代法求根。牛顿法求根,每次在一点处用切线对函数局部近似,然后跳到切线的零点,不断迭代。在大多数函数上,牛顿迭代法的表现是比较优秀的。
如果一个函数满足\(\mu\)-强凸和\(L\)-smooth,应用精确线搜索做梯度下降,分析得到收敛速率\(f(x_k)-f(x^*) \leq(1-\dfrac{\mu}{L})^k(f(x_0)-f(x^*))\)。从结果上来看,我们得到了一个和一般梯度一样的收敛速率,因为我们在梯度下降时就会选择\(\eta=\dfrac{1}{L}\)。但好处在于我们不需要提前算出\(\mu\)或是\(L\),只需要应用线搜索每一次在梯度方向上用牛顿法求极值,我们就会自动以这样的速率收敛。
对于一般情形,很多时候每次迭代都求出精确最小值的操作还是花费了太多开销了。事实上,我们只希望函数值能在每一次迭代中减小一个充分小的值就好了。困难在于如何刻画“充分”。对于凸函数,我们在\(x_k\)处选定一个下降方向\(d_k\),可以过\(x_k\)作\(d_k\)方向的切线,那么根据凸函数的一阶条件成立\(f(x_k+\eta d_k)>f(x_k)+\eta \lang\nabla f(x_k),d_k\rang\)。这时候如果我们向上把切线旋转一个角度(但依然是下降的),那么夹在这两条直线之间的函数值部分就可以认为是充分小的了,因为我们正是用旋转后的切线限制住了函数的下降不至于太小(至少也会下降这条新的直线所割的那么多)。刻画旋转,只需要在斜率上乘一个常数因子\(\alpha\)。我们随意预设一个初始的步长,不妨令\(\eta=1\)。不停地迭代\(\eta\to \beta \eta\),直到\(f(x_k+\eta d_k)<f(x_k)+\alpha \eta \lang\nabla f(x_k),d_k\rang\)。这个操作就称为“回溯”,因为迭代时步长是指数衰减的,因此我们期待这样的迭代是高效的。这就是回溯线搜索(Backtracking Line Search)。假如函数本身就是\(L-\)smooth的,取\(\alpha \leq 1/2\),可以证明当步长降到小于\(\dfrac{1}{L}\)的时候一定已经是下降的了,因此我们的每一次步长都恒大于\(\dfrac{\beta}{L}\)。进一步的分析也表明,回溯线搜索的收敛速率对于强凸且\(L\)-smooth的函数也是指数级的。
牛顿法(Newton's Method)
在精确线搜索时我们应用牛顿迭代法来求单调函数的零点,然后确定梯度下降的步长。现在我们直接用牛顿法来下降。对于函数\(f(x)\),我们直接在\(x_k\)点处对\(f\)做二阶泰勒展开\(f(x)\approx f(x_k)+\nabla f(x_k)^\top (x-x_k)+\)\(\dfrac{1}{2}(x-x_k)^\top \nabla f^2(x_k)(x-x_k)\),右侧是二次函数,我们直接下降到这个二次函数的极小值点\(x_{k+1}=x_k-(\nabla^2 f(x_k))^{-1}\nabla f(x_k)\),反复迭代。这就是用来求函数极值的牛顿法。(注意我们需要\(f\)的二阶导是可逆的,这对于严格凸函数是始终成立的,因为此时二阶导是正定的。)
在一般情形下,牛顿法是无法保证正确性的。因为泰勒展开只是局部近似,无法保证全局的正确性。因此,我们需要\(f\)满足额外的条件,在这里主要是控制二阶导的变化范围。
如果\(\|\nabla^2 f(x)-\nabla^2f(y)\|\leq M\|x-y\|\),就称\(\nabla^2 f(x)\)是\(M\)-Lipschitz的(前者是矩阵范数,\(\|A\|=\max\limits_{\|v\|=1}\|Av\|=\sqrt{\lambda_{\max}(A^\top A)}\))。对于\(\mu\)-强凸以及二阶导是\(M\)-Lipschitz的函数,能够证明\(\|x_{k+1}-x^*\|\leq\dfrac{M}{2\mu}\|x_k-x^*\|^2\)。注意到等式右侧的平方项,这意味着\(\|x_k-x^*\| \leq \left(\dfrac{M}{2\mu}\right)^{2k-1}\|x_0-x^*\|^{2k}\),这比梯度下降收敛得快得多,称为二次收敛。然而,这样得收敛只有在\(\|x_0-x^*\|<1\)时才能成立,因此只对\(x^*\)邻域内才能生效。相反地,梯度下降虽然不能达到二次收敛,但对于全局都是有效的。
尽管牛顿法并不能保证每一步都下降,但我们可以验证对于严格凸函数,\(d_k=-(\nabla^2 f(x_k))^{-1}\nabla f(x_k)\)确实是一个下降方向,因为方向导数\(\lang \nabla f(x_k),d_k\rang=-\nabla f(x_k)^\top(\nabla^2 f(x_k))^{-1}\nabla f(x_k)\)是一个二次型,而中间的矩阵是正定的,因此方向导数小于0。只不过,牛顿法每次走过的步长太大了。于是一个直观的想法是,我们在原先牛顿法的\(d_k\)方向上应用回溯线搜索,保证牛顿法下降。这就是阻尼牛顿法(Damped Newton's Method),它给牛顿法的步长一个阻尼来保证下降。于是我们可以把牛顿法分为两个阶段,先采用阻尼牛顿法,等到接近收敛时,采用一般牛顿法直接二次收敛。对于\(\mu\)-强凸,二阶导是\(M\)-Lipschitz的函数并且二阶导满足存在常数\(L\)使得\(LI-\nabla^2 f(x)\)是正定的,那么存在\(\delta\in(0,\min\{\dfrac{\mu^2}{M},3(1-2\alpha)\dfrac{\mu^2}{M}\})\),\(\gamma=\alpha\beta^2\delta^2\dfrac{\mu}{L^2}\),对于\(\|\nabla f(x_k)\|>\delta\)时我们用阻尼牛顿法保证\(f(x_{k+1})-f(x_k)\leq-\gamma\),对于\(\|\nabla f(x_k)\|\leq \delta\)时用一般牛顿法保证二次收敛。
另一个控制二阶导范围的方法是考虑三阶导的范围。对于一元函数\(f\),如果满足\(|f'''(x)|\leq 2f''(x)^{3/2}\)恒成立,就称其为自和谐(Self-concordant)的。它可以等价描述为\(\left|\dfrac{d}{dx}\dfrac{1}{\sqrt{f''(x)}}\right|\leq 1\)。对于多元函数,如果沿任意直线都是自和谐的就称多元函数是自和谐的。对于自和谐的严格凸函数,我们可以分析阻尼牛顿法的收敛速率。定义\(\lambda(x)=\sqrt{\nabla f(x)^\top (\nabla^2f(x))^{-1}\nabla f(x)}\),那么存在\(\delta \in(0,1/4]\),和\(\gamma>0\)(只关于回溯线搜索中的\(\alpha,\beta\)),满足:当\(\lambda(x_k)\geq \delta\)时,阻尼牛顿法保证\(f(x_{k+1})-f(x_k)\leq -\gamma\);否则,一般牛顿法保证\(\lambda(x_{k+1})^2\leq2\lambda(x_k)^2\)。(另一个好处在于,以上收敛分析是仿射不变的,而关于\(M\)-Lipschitz的分析却不是)
近端梯度下降(Proximal Gradient Descent)
对于不可微的函数,梯度下降法和牛顿法都失效了。现在我们要开始讨论如何求解不可微的凸函数的极小值。
一个有趣的观察是,梯度下降可以“看作”是在使用牛顿法。因为当我们迭代\(x_{k+1}=x_k-\eta \nabla f(x_k)\)时,我们可以把\(x_k-\eta\nabla f(x_k)\)想象成某个二次函数的极小值点,那么这个二次函数可以构造为\(\hat f(x)=f(x_k)+\lang \nabla f(x_k),x-x_k\rang\)\(+\dfrac{1}{2\eta}\|x-x_k\|^2\)。因此梯度下降法可以看作是对\(\hat f(x)\)做牛顿法。
现在假设\(f(x)\)本身是不可微的,但是可以拆成一个可微函数\(g(x)\)和一个不可微函数\(h(x)\)。(我们要求\(f,g,h\)都是凸的)既然梯度下降的迭代可以看作求\(f(x_k)+\lang \nabla f(x_k),x-x_k\rang+\dfrac{1}{2\eta}\|x-x_k\|^2\)的最小值,那么现在我们可以用\(g(x_k)+\lang \nabla g(x_k),x-x_k\rang+\dfrac{1}{2\eta}\|x-x_k\|^2+h(x)\)来近似,求它的最小值。配方化简后等价于求\(\dfrac{1}{2\eta}\|x-(x_k-\eta\nabla g (x_k))\|^2+h(x)\)的最小值。定义近端梯度算子\(\text{prox}_h(y)=\arg\min \dfrac{1}{2}\|x-y\|^2+h(x)\),可以写出迭代:\(x_{k+1}=\text{prox}_{\eta h}(x_k-\eta\nabla g(x_k))\)。这就称为近端梯度下降算法。
近端梯度下降算法有一个更高观点的理解方法:在离散近似梯度流算法中,可以用\(x_{k+1}=x_k-\eta\nabla f(x_k)\)近似,也可以用\(x_{k+1}=x_k-\eta \nabla f(x_{k+1})\)近似,后者恰好可以等价地写成\(x_{k+1}=\text{prox}_{\eta f}(x_k)\)(因为\(\nabla (\dfrac{1}{2}\|x-x_k\|^2+\eta f(x))=x-x_k+\eta f(x)\))。因此近端梯度下降本质上就是轮换地用两种方法来近似梯度流算法。
我们看到近端梯度下降最关键的就是要能合适的选取\(h(x)\)使得极端梯度算子是可以计算的。对于复杂的\(h(x)\),我们是很难求出极端梯度算子的。这里举一个可以应用近端梯度下降的例子,称为LASSO(Least Absolute Shrinkage and Selection
Operator),在这里\(f(\beta)=\|y-X\beta\|_2^2+\lambda\|\beta\|_1\)。我们注意到1-范数是不可微的,因此选取\(h(\beta)=\lambda\|\beta\|_1\),在求\(\text{prox}_h(\gamma)\)我们发现每一维是独立的,对于第\(i\)个坐标分类,可以分类讨论求得\(\text{prox}_h(\gamma)^i\)的取值当\(\gamma_i>\lambda\)时为\(\gamma_i-\lambda\),当\(\gamma_i<-\lambda\)时为\(\gamma_i+\lambda\),其余为0。我们用符号\(\mathcal{S}_\lambda(\gamma_i)\)来表示这个函数,称为软阈值算子(Soft Thresholding Operator)。应用软阈值算子的近端梯度下降算法求出LASSO的最小值的算法称为ISTA(Iterative Soft-Thresholding Algorithm)。
下面要分析近端梯度下降算法的收敛情况。注意到\(h\)是不可微的,为此我们要引入次梯度(Subgradient)的概念,如果对于每个\(x\)都存在一个向量\(v_x\)成立\(f(y)\geq f(x)+\lang v_x,y-x \rang\),就称\(v_x\)是\(f\)的次梯度,记为\(v \in \part f(x)\)。对于凸函数,我们看到次梯度就扮演着一阶条件中梯度的角色。最后我们分析得到对于\(f(x)=g(x)+h(x)\),如果\(g\)是\(L\)-smooth且令\(\eta \leq \dfrac{1}{L}\),那么\(f(x_T)-f(x^*)\leq\dfrac{\|x_0-x^*\|^2}{2T\eta}\)。如果\(g\)是\(\mu\)-强凸的,那么有\(\|x_{k+1}-x^*\|^2 \leq (1-\mu\eta)\|x_k-x^*\|^2\)。(如果无法求出\(L\),我们可以用线搜索得到与梯度下降一样的收敛结果)。