机器学习——一些常用的最优化算法

机器学习常用的最优化算法

本篇blog将介绍梯度下降法、随机梯度下降法、坐标下降法、牛顿法。

梯度下降法

基本步骤
首先写出梯度下降法的简单步骤:
我们需要最优化的函数是f(x),其中x为向量。
1、初始化向量x。
2、更新x=x-α*▽f(x) 其中 ▽f(x)=∂f(x)/∂(d) d为某维度的单位向量
3、重复这个过程直到收敛。
直观上理解就是,你在一座山的半山腰上,每次往下降最快的地方下降若干步,一步一步地逼近山谷。

一些问题
关键问题有三个,一个是下降方向的确定,一个是学习率α的选择,一个是收敛性的判定。

关于下降方向
我们有一个定理:可微函数f(x)在x处减小得最快的方向是负梯度方向。
梯度方向是指对于每一维求偏导,然后将原值带进去得到的向量。
梯度向量={v1,v2,v3…vn} v1=▽x1 f(x),v2=▽x2 f(x)
梯度方向上升最快,负梯度方向下降最快。
所以,d=▽f(x)/||▽f(x)||,d为负梯度方向上的单位向量。

关于学习率α
确定了下降方向后我们可以得到 x=x-α*▽f(x),其中▽f(x)为负梯度方向的向量
我们要找到一个最优的α使得x下降得最深。
即我们要找到一个最优的α使得 f(x-α*▽f(x)) 最小。
这是一个单变量问题,求个导数,等于零再带回去就好了。

关于收敛性的判定
当连续两次迭代得到的x代入的差值小于某个阈值我们就假装它收敛啦。
更详细的做法和证明留坑。

随机梯度下降法

随机梯度下降的引入
梯度下降法有一个比较大的问题,在每次迭代的时候我们需要对x向量的每一维都求偏导,这个计算量是相当大的。因为维度大小等于样本的个数,当样本达到几百万几千万的时候大概要跑很久才能完成一次迭代。
所以我们进行可以牺牲一些准确率,进行一些时间复杂度上的优化。
每次迭代时我们不对所有的维度都进行梯度下降,而是只随机出一个维度,将其作为下降的维度,只在这个维度上进行下降。

基本步骤
1、初始化向量x。
2、更新x=x-α*▽fi(x) 其中k为1-n中的的一个随机数。
3、重复这个过程直到收敛。

一些分析
1、E(▽if(x))=▽f(x),所以算法在期望意义下收敛。
2、Var(▽if(x))过大,即选择不同的维度对下降幅度的影响的方差过大,算法不够稳定。

随机梯度下降的一些变种
小批量的随机梯度下降:从每次随机一个维度改为每次随机10个或者其它个数的维度。

坐标下降法

基本步骤
1、初始化向量x。
2、x向量的更新 x=(x1,x2…xn) -> x=(x1+d*,x2+d1*…xn+dn*)
关于di*:d1*=argmin ( f (x1+d1,x2,x3…xn) )
3、重复这个过程直到收敛。
直观上的理解就是,在一座山峰上,我们每次把一个维度切开,并在这个维度上找到最低点。重复这个操作直到找到山谷。

优缺点分析
优点:迭代速度快。
缺点:普适性低。

牛顿法

牛顿法的推导
我们考虑在下降的时候当前的向量为xk。
我们将f(x)在xk处泰勒展开,忽略余项,可以得到:
f(x)=f(xk)+▽f’(xk)(x-xk)+▽f”(xk)*(x-xk)^2/2。
其中 ▽f”(xk) 为 f(x) 的二阶偏导,是一个 n*n 矩阵。
进行移项,(f(x)-f(xk))/(x-xk)=▽f’(xk)+▽f”(xk)*(x-xk)。
当x趋向xk,f’(x)=▽f’(xk)+▽f”(xk)*(x-xk)。
根据最优化的要求,f’(x(k+1))=0,即▽f’(xk)+▽f”(xk)*(x(k+1)-xk)=0。
所以:x(k+1)=xk-▽f’(xk)/▽f”(xk)。
所以对于每次迭代,我们需要求出xk点的一阶导数而二阶导数矩阵的逆,然后进行迭代。

牛顿法的缺点
一旦向量的维度较大,求一个矩阵的逆就会变得非常复杂。

拟牛顿法
//留坑之后填

猜你喜欢

转载自blog.csdn.net/wcy_1122/article/details/80189437