您的位置:首页 > 其它

机器学习(一) ---- 最优化理论基础

2014-09-02 12:31 288 查看
之前学习机器学习和数据挖掘的时候,很多都是知道这些算法的设计机制,对数学推导和求解过程依然是一知半解,最近看了一些机器学习算法的求解和各种优化算法,也发现了这些算法设计和公式推导背后的数学精妙之处和随处可见的最优化的影子。还是决定从最优化理论开始补起,我参考了最优化的基础,先总结了凸函数、hessian矩阵、泰勒展开、拉格朗日乘子、对偶函数,随后介绍了最优化中常用的梯度下降法、牛顿法、共轭梯度法、线性搜索法、置信域方法,最后介绍了其他的一些流行的最优化方法,模拟退火法和爬山法、遗传算法、神经网络、支持向量机。

一、最优化基础:

1. 凸函数:

凸函数有很多优良的特性,而且在求解极大值极小值时,十分有用。先看一下凸函数的定义:凸函数:在函数的区间I上,若对任意x1和x2,任意0<t<1,都有




或者对任意x1,x2都有:




凸函数有很多优良的:

1. 凸函数任何极小值也是最小值。

2. 一元二阶的函数在区间上市凸的,当且仅当它的二阶倒数是非负的;如果一个函数的二阶导数是正数,那么函数也就是严格凸的。反过来不成立。多远二次可微的连续函数在凸集上是可微的,当且仅当它的hessian矩阵在凸集内部是半正定的。

3. 对于凸函数f,水平子集{x| f(x) <=a}和{x|f(x)<=a}是凸集。然而,水平子集是凸集的函数不一定是凸函数;这样的函数被称为拟凸函数。

4. 凸函数的求和、最大也是凸函数;如果g(x)是递增的,那么g(f(x))仍然是凸函数。

2. hessian矩阵:

hessian(海瑟矩阵)就是所谓的二阶偏倒矩阵。对于一个临界点有一阶偏导等于零,然而凭借一阶偏导数无法确定这个点是鞍点、局部极大点还是局部极小点。而hessian矩阵可以回答这个问题。





若x0是f(x)的极值点,如果存在,则进一步设在一个邻域内所有二阶导数连续,H为在点x0的海瑟矩阵。而且x0是f(x)的极小值点时H>=0,即H的特征根均为非负。x0是f(x)的极大值点,H<=0, 即H的特征根均为非负。H>0,即H为正定矩阵,x0是f(x)的极小值点;H<0,即H为负定矩阵,x0是f(x)的极大值点;H的特征值有正有负,x0不是f(x)的极值点。

3. 正定矩阵:

设M是n阶方阵,如果对任何非零变量z,都有z'Mz>0,其中z'表示z的转置,就称M正定矩阵。

判定定理1:矩阵A的特征值全为正。

判定定理2:A的各阶主子式为正。

判定定理3:A合同于单位阵。

4. 泰勒展开:





泰勒公式可以用若干项加一起来表示一个函数。对于正整数n,若函数f(x)在闭区间[a,b]上n阶可导,切在(a,b)上面n+1阶可导数。任取a<=x<=b,则有:




拉格朗日余数:




请注意:泰勒展开在很多地方都有重要的应用,例如开方的计算。这里添加上牛顿迭代和泰勒级数展开求解根号的计算过程。另外我一直以为泰勒级数和牛顿迭代有一定关系,后来发现好像没有,不过可以把牛顿迭代看做仅取泰勒级数的一阶展开。

1). 使用泰勒级数求解根号2。此时我们可以得到f(x)=x^2-2;

取泰勒级数前两项,我们可以得到: f(x)=f(a) + f'(a)(x-a),令f(x)=0我们可以得到:

x=a-f(a)/f'(a); 其实我们可以把x看做是f(x)=0的解,使用这个式子多次迭代就可以得到根号的值。使用x(n+1)替换x,x(n)替换a,我们就可以得到:x(n+1)=x(n)-f(x(n))/f'(x(n))=x(n)-(x(n)^2-2)/2*x(n).

2). 牛顿迭代法:

如下图,已知(x0,y0) ,我们通过对f(x0)做切线,得到切线与x轴的交点(x1,0),然后根据(x1,f(x1))继续递推得到(x2,f(x2)):




那么对已知的(x0,y0),我们可以得到斜率:f'(x0)和点(x0,y0),那么我们可以得到直线:y-f(x0)=f'(x0)(x-x0)。再令y=0,我们可以得到:f(x)=x0-f(x0)/f'(x0)。其实我们已经得到了与泰勒级数展开相同的迭代公式。

5. 拉格朗日乘子:

拉格朗日乘子,就是求函数f(x1,x2,....)在g(x1,x2,....)=0的约束条件下的极值的方法。主要思想是通过引入一个新的参数λ,将约束条件和原函数联系到一起,从而求出原函数极值的各个变量的解。假设需要求极值的目标函数f(x,y),约束条件为φ(x,y)=M,然后我们得到新的函数: F(x,y,λ)=f(x,y)+λg(x,y),将新函数分别对x,y, λ求解即可得到原函数的极值。

6. 对偶函数:

一、最优化常见方法:

1. 牛顿法:

看了一些文章我的理解是牛顿法在最优化求解和前面的函数求解略有不同,此时是通过泰勒级数的二阶展开来进行计算的。展开泰勒级数的二阶形式:




当Δx 无限趋近于零时f(x+Δx
)=f(x),然后可以得到(注意f''(x)Δx+1/2f''(x))Δx^2=0),然后将f'(x)和f''(x)看作常数,对Δx
再次求导即可得到如下公式:






继续迭代可以得到:






得出迭代公式:






对于高纬的情况,我们可以得到如下迭代公式(其中H是海瑟矩阵):






牛顿法引入了高阶导数,利用了曲线的额外信息,迭代次数更很少,更容易收敛,可是也引入了hessian矩阵的复杂性。下图为牛顿法和梯度下降法求解的一个例子,牛顿法为红色,梯度下降法沿梯度方向为绿色。其实牛顿法每次迭代都需要计算hessian矩阵,这极大增加了求解的复杂性,因而也有拟牛顿法和各种近似优化方法,避免了每次都需要进行迭代的方法。




2. 梯度下降法:


梯度下降法,若实值函数F(x)在点a处可微且有意义,那么函数F(x)在a点沿着梯度相反的方向

下降最快。因而

并且足够小时,我们从预估的F函数的局部极小值x0出发可以得到递推公式:



如果顺利的话,我们可以得到如下式子,并且xn会收敛到极值(注意

可变):



如果满足条件,并且迭代收敛的话,我们就会沿着梯度下降的方向找到最小值。

对比牛顿法和梯度下降法:

a.
牛顿法是二阶收敛,梯度下降法是一阶收敛。所以牛顿法更快。 b. 牛顿法不能距离极小点太远,否则可能不收敛。 c. 牛顿阿发需要每次更新一个二阶矩阵,维数增加的时候是很耗内存的。 d. 梯度下降法在靠近最优点时会有震荡,牛顿法二次收敛很容易到达。可以先用梯度下降,再用牛顿法。


3. 共轭梯度法:


共轭梯度法是结余最快下降法和牛顿法的一个方法,它仅需利用一阶导数信息,但克服了最快下降法收敛慢的缺点,又避免了牛顿法需要存储和计算hessian矩阵并求逆的缺点(这么牛逼的介绍,简直是集众多优点于一身呀。。。存储小、收敛快、稳定性高、不需要额外参数。。。看来还是需要深入研究)。

参考文献:

1. 泰勒级数、牛顿展开、求解根号: http://www.linuxidc.com/Linux/2012-09/71467.htm
2. 拉格朗日乘子:http://baike.baidu.com/view/2415642.htm?fr=aladdin

3. 深入理解拉格朗日乘子和KKT法:http://blog.csdn.net/xianlingmao/article/details/7919597

4. 拉格朗日对偶: http://www.cnblogs.com/liqizhou/archive/2012/05/11/2495689.html
5. 牛顿法和梯度下降法:http://blog.csdn.net/luoleicn/article/details/6527049

6. 共轭梯度法: http://baike.baidu.com/view/2565822.htm?fr=aladdin
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: