目的:简单介绍机器学习中常用的一些优化算法,主要用于无约束最优化问题的求解。具体包括梯度下降法(最速梯度下降),牛顿法,几个拟牛顿法(包括DFP,BFGS,LBFGS等,共轭方向法,共轭梯度法,信赖域方法等不在本次做讨论)。
概述
一般的有监督的机器学习问题中,有了带有标注的数据之后,我们往往会先假设一个模型(比如在二分类问题中,我们可以假设有一个超平面把不同类别的case分开),这些假设的模型的数学表达中会有一些未定的参数。然后,我们会设计一个函数,来衡量会这个模型的输出和我们期望的输出之间的“差距”,这个函数一般被叫做损失函数。之后在将这个损失函数和正则化项组合成目标函数(obj)。最后对obj函数进行最优化(一般也就是求极值),来确定模型中的各个参数,最终完成模型假设。这个过程也就是我们常说的机器学习的过程,也就是参数估计的过程。
这当中的最优化问题,说直白点,就是有一个函数,我们要找到它的极值(全局或者局部)。如果我们找到这些极值,就可以用这些取得极值时的数据,来确定我们假设模型中的参数。总体来说,我们的目标就是当obj确定了之后,通过一些方法,来确定极值在哪里,是多少。
本文后面的部分,就是来讨论一下针对最优化这一问题,一般有哪些常用的方法。
问题抽象
确定函数下找最值(以下我们以找最小值为例),就是一般的通用无约束最优化问题:
怎么找呢?如果f本身连续,又可导,可微,而且f比较简单(比如说单变量二次函数),那么我们可能直接可以通过解方程的方式得到解析解,从而找到最小值。但是在一般情况下,f(x)都比较复杂(尤其是维度很大,f本身非凸的情况下),有可能会不可导,不可微分,或者求导困难,所以针对更一般的情况,我们采取的通用方法是迭代法。迭代法大体是如下一种方法:是先猜一个点(估计点),之后根据这个点x0,再附近(比较近的范围内)再找一个点x1,让f(x1)<f(x0),之后再根据x1找到一个 x2,让f(x2)<f(x1),就这样一值找下去,直到找到一个点
,使得基本没办法再找到新的 ,使得 了,或者周边的f(x)差距非常非常小了,那么 这个点可能就是我们希望找到的f(x)取得最小值的x的取值点(全局或者局部最小点)。用数学一点的话来讲,我们希望找到一个序列 x0,x1,x2.....
(或者找到一个算法生成这样的序列),使得在定义域上,f(x0)>f(x1)>f(x2).....>f( ),如果f( ) 基本上等于f(x)的最小值,或者说lim == X*,lim || -X*|| == 0(在k趋近于无穷时,X*为极值点的x取值),那我们就说这个算法产生的迭代,收敛于f(x)的最小值取值点X*。
一般做法
我们希望找到一个算法,或者找到一个迭代,使得上面的过程成立,从而找到最小值。具体怎么做呢?
我们聚焦到一步,来看看一般情况下的做法。假设我们目前更新到的Xk,那下面就有2种情况:第一种情况,
无论向周边怎么移动,也没有比f( )更小的值了,那么 时就取得了f(x)的最小值;第二种,如果至少还有1个方向P(||P||==1),使得 向这个方向移动,可以使f(x)的值变小,那么我们让 = +aP,使得f( )<f( )即可。这里我们称P为方向,也就是X要往哪里走,a为步长,也就是走多少。如果算法是有效的,那么最终我们就会找到X*。所以,优化问题基本可以看成2个阶段的抉择:1.选取一个方向P;2.选取一个步长a。其中选取P比较重要,各种各样不同的算法,基本上就是根据选取P的策略不同而不同的。对a的选择也有很多方法,最简单的方法是固定选取一个固定的,较小的a(比如a=0.005 ~ 0.01);有的时候可以先选一个a,之后根据迭代后P的大小,来动态的调整a;另外就是line search类a选取方法等等,我们下面会有详细的涉及。
下面我们就来看看几个常用的无约束问题的优化算法。
梯度下降法(最速下降法)
梯度下降(Gradient Descent) 也被称之为最快下降法(Steepest Descent),可用于寻找函数的最小值(局部最小值)。梯度下降法的思路,是利用函数值在梯度反方向来作为X的迭代方向,也就是 。只要沿着函数的梯度反方向移动足够小的距离到一个新的点,那么函数值必定是非递增的,而且在梯度下降法的假设前提下,负的梯度方向是下降是最快的方向。
梯度下降法,顾名思义,就是利用obj函数的一阶导数来寻找最小值。对于f(x),我们根据泰勒公式的一阶展开,可以得到如下的拟合(对应向量的情况):
其中
是 的高阶无穷小,忽略。并且 是我们要找的方向,且 ==1, 是步长,且 >0。我们先来看看
如何找到。我么你要找一个 ,使 。我们根据 ,要达到 ,只要 <0即可。根据向量夹角公式
,我们可以把 写成 。cos的最小值是-1,即theta的取值为π时,当