机器学习,最优化数值计算常用算法

一 机器学习表示及数值求解原理

大部分机器学习,尤其是神经网络、深度网络,最优化一个经验损失函数(通常带有正则项),损失函数在某个样本点可表示为: L(β⃗ ,X(i)) L ( β → , X ( i ) ) ,在训练样本上的期望损失函数表示为 L(β⃗ )=1nni=0L(β⃗ ,X(i)) L ( β → ) = 1 n ∑ i = 0 n L ( β → , X ( i ) ) 训练就是给定在样本上寻找期望损失函数 L(β⃗ ) L ( β → ) 全局最小值所在的参数 β⃗  β → 即:

β⃗ =argminβ⃗ ΘL(β⃗ )) β → ∗ = a r g m i n β → ∈ Θ L ( β → ) )

通用的损失函数最优化的数值方法,来源于泰勒展开式,多元函数的泰勒展开式可表示为:
L(β⃗ +tα⃗ )=L(β⃗ )+i=1n(j=1p(tαjβj)iL(β⃗ ))+o(tn)α⃗ 2=1 L ( β → + t α → ) = L ( β → ) + ∑ i = 1 n ( ∑ j = 1 p ( t α j ∂ ∂ β j ) i L ( β → ) ) + o ( t n ) ∀ ‖ α → ‖ 2 = 1

1.1 一阶逼近

一阶泰勒展开式为:

L(β⃗ +tα⃗ )=L(β⃗ )+tL(β⃗ )α⃗ +o(t)α⃗ 2=1 L ( β → + t α → ) = L ( β → ) + t ∇ L ( β → ) α → + o ( t ) ∀ ‖ α → ‖ 2 = 1

给定 β⃗ ,α⃗ 2=1,t>0 β → , ‖ α → ‖ 2 = 1 , t > 0 的条件下,忽略高阶项,在 α⃗ =sL(β⃗ )s=⃗ L(β⃗ )1 α → = s ∇ L ( β → ) , s = ‖ ∇ → L ( β → ) ‖ − 1 时,有最小值。

L(β⃗ tα⃗ )=L(β⃗ )t⃗ L(β⃗ ) L ( β → − t α → ) = L ( β → ) − t ‖ ∇ → L ( β → ) ‖

因此在一阶条件下,最速下降法参数迭代的数值更新公式为:
β⃗ β⃗ t⃗ L(β⃗ ,X)(1) β → ← β → − t ∇ → L ( β → , X ) ( 1 )

1.2 二阶逼近

可以对损失函数进行二阶展开,展开式可以表示为:

L(β⃗ +tα⃗ )=L(β⃗ )+tL(β⃗ )α⃗ +t2α⃗ t2L(β⃗ )α⃗ +o(t2)α⃗ 2=1 L ( β → + t α → ) = L ( β → ) + t ∇ L ( β → ) α → + t 2 α → t ∇ 2 L ( β → ) α → + o ( t 2 ) ∀ ‖ α → ‖ 2 = 1

二阶条件下,给定 β⃗ ,α⃗ 2=1,t>0 β → , ‖ α → ‖ 2 = 1 , t > 0 的条件下, L(β⃗ +tα⃗ ) L ( β → + t α → ) 取得最小值的必要条件是:
L(β⃗ )+t2L(β⃗ )α⃗ =0ta=(2L(β⃗ ))1L(β⃗ ) ∇ L ( β → ) + t ∇ 2 L ( β → ) α → = 0 t a = − ( ∇ 2 L ( β → ) ) − 1 ∗ ∇ L ( β → )

此时 β⃗  β → 的更新参数是:
β⃗ β⃗ (2L(β⃗ ))1L(β⃗ )(2) β → ← β → − ( ∇ 2 L ( β → ) ) − 1 ∗ ∇ L ( β → ) ( 2 )

以上(1)(2)两式是数值求解损失函数的基本方法,不断迭代参数 β⃗  β → ,理想情况下每一步迭代都有 L(β⃗ (k+1))L(β⃗ (k)) L ( β → ( k + 1 ) ) ≤ L ( β → ( k ) ) ,反复迭代更新 β⃗  β → 得到 L(β⃗ ) L ( β → ) 的局部最小值,从而求得 β⃗  β → ∗ ,这就是最优化数值求解的基本思想。
迭代求解的过程,就是机器学习的训练过程,机器学习就是在给定模型和样本的情况下,求解参数 β⃗  β → ∗ .

二 一阶方法

所有一阶方法,都源于损失函数的一次泰勒逼近(线性逼近),主要是对(1)式的改造,重点是处理 L(β⃗ ) ∇ L ( β → ) .

2.1 梯度下降法(GradDescend)

最基础的梯度下降法,参数更新方程就是(1)式。这一方法的弊端在机器学习 –超参数调优中很详细的讨论过了。还有一个问题,就是梯度下降法是锯齿状前进的。
假设上一步搜索的沿梯度方向 v⃗ t1 v → t − 1 前进,并且在此方向上搜索到了参数 β⃗ t β → t β⃗ t β → t 恰好是损失函数在 v⃗ t1 v → t − 1 方向上的局部最小值,则蕴藏着:

ddsL(β⃗ t+sv⃗ t1)=L(β⃗ t)v⃗ t1=0 d d s L ( β → t + s v → t − 1 ) = ∇ L ( β → t ) ∗ v → t − 1 = 0

此意味着下一步的搜索方向 v⃗ t=L(β⃗ t) v → t = ∇ L ( β → t ) 与上一步的搜索方向 v⃗ t1 v → t − 1 正交,这一特点在随机梯度下降法和自适应梯度下降法中都成立;在动量下降法和共轭梯度下降法中得到改进。

2.2 随机梯度下降法(SGD)

现代的机器学习算法,涉及到的训练样本 X X 超大,使得客观上计算 L(β⃗ ) ∇ L ( β → ) 困难。随机梯度下降利用大数定理,可以有效减少运算量。
注意到公式(1),在给定 β=β^ β = β ^ 的条件下更新参数, L(β⃗ ,X) ∇ L ( β → , X ) 是样本统计量,在 X X 中随机抽样抽得的k个样本 {X(i)i1..k} { X ( i ) ∣ i ∈ 1.. k } ,根据大数定理则有

limm1ki=1kL(β,X(i))β=β^pL(β⃗ )β=β^ l i m m → ∞ 1 k ∑ i = 1 k ∇ L ( β , X ( i ) ) ∣ β = β ^ → p ∇ L ( β → ) ∣ β = β ^

在样本中在抽样取得较小样本,用较小样本估计梯度代替全部样本的梯度,就得到参数更新方程为:
β⃗ β⃗ tki=1kL(β⃗ ,X(i))(3) β → ← β → − t k ∑ i = 1 k ∇ L ( β → , X ( i ) ) ( 3 )

随机梯度下降法,就是通过在全部样本中再抽样取得小样本,计算统计量 1kki=1⃗ L(β⃗ ,X(i)) 1 k ∑ i = 1 k ∇ → L ( β → , X ( i ) ) 作为 L(β⃗ ) ∇ L ( β → ) 的估计值。

在实际计算中,一般是将样本分块,每块k个样本,每次迭代是随机选取一块样本计算梯度。因此采用梯度下降法时,特别需要注意将样本顺序随机打乱然后分块,以免出现系统误差。

随机梯度下降法,很大程度解决了机器学习计算量的问题,但没有改善梯度下降法面临的其他问题,参数发散、梯度爆炸等等问题。

2.3 自适应梯度下降法(AdaGrad)

为了解决参数发散问题和梯度爆炸问题,机器学习 –超参数调优一文中讨论到了修正 L(β⃗ ,X) ∇ L ( β → , X ) 的模长。
在数值计算实践中,如果要用的除法,为了避免除以一个很小的数导致结果不稳定,同时也为了避免除以零溢出,在确信分母非负的情况下,可以在分母上加一个比较小的数,这就是下面用到的参数 δ δ
自适应梯度下降法的参数更新公式如下:

δv⃗ bβ⃗ =108=L(β⃗ ,X)=max(1,v⃗ p)β⃗ tv⃗ b+δ(4) δ = 10 − 8 v → = ∇ L ( β → , X ) b = m a x ( 1 , ‖ v → ‖ p ) β → ← β → − t v → b + δ ( 4 )

一般书籍中,其更新公式为:
δv⃗ bβ⃗ =108=L(β⃗ ,X)=v⃗ 2β⃗ tv⃗ b+δ(5) δ = 10 − 8 v → = ∇ L ( β → , X ) b = ‖ v → ‖ 2 β → ← β → − t v → b + δ ( 5 )

结合随机梯度下降法,得到的自适应随机梯度下降法的参数更新公式:
δv⃗ bβ⃗ =108=1kki=1L(β⃗ ,X(i))=v⃗ 2β⃗ tv⃗ b+δ(6) δ = 10 − 8 v → = 1 k ∑ i = 1 k ∇ L ( β → , X ( i ) ) b = ‖ v → ‖ 2 β → ← β → − t v → b + δ ( 6 )

自适应梯度下降法,能有效的避免参数迅速发散或梯度爆炸导致收缩被迫远离当前收缩的区域的问题,但是代价高昂,其迭代每一步进展都很小,收敛非常慢。

2.4 带动量的随机梯度下降法(MomentumSGD)

不管是梯度下降法的,还是随机梯度下降法,尤其是自适应梯度下降法,其收敛速度都很慢,其中一部分原因是梯度主要指向高曲率方向,而在曲率比较低方向行走得慢(搜索方向锯齿状前进),为了改善这一现象引入动量,采用动量的算法参数更新方程如下:

v⃗ β⃗ αv⃗ t1kki=1L(β⃗ ,X(i));//1>α>0β⃗ +v⃗ (7) v → ← α v → − t 1 k ∑ i = 1 k ∇ L ( β → , X ( i ) ) ; / / 1 > α > 0 β → ← β → + v → ( 7 )

α α 是动量衰减因子,在梯度下降过程中,动量法使得最近几步迭代的中,在具有长期趋势的收缩方向得到增强,在梯度下降法的震荡的方向有效衰减,因而具有加速收敛的效果,加入动量后参数在高曲率方向迅速衰减,将搜索方向集中到低曲率方向。
将动量法运用到随机梯度下降法中,还可以有效消减梯度的随机偏差。

2.5 Nesterov动量

Nesterov动量是略微修改前面的动量算法,有一个预更新,其参数更新方程如下:

β^v⃗ β⃗ =β⃗ +αv⃗ ;//1>α>0=αv⃗ t1kki=1L(β^,X(i))β⃗ +v⃗ (8) β ^ = β → + α v → ; / / 1 > α > 0 v → = α v → − t 1 k ∑ i = 1 k ∇ L ( β ^ , X ( i ) ) β → ← β → + v → ( 8 )

2.6 RMSProp

RMSProp,类似于自适应梯度下降法,其按照指数衰减方式加权梯度的模长,调整当前梯度的模长,其参数更新公式如下:

δv⃗ rβ⃗ =108=L(β⃗ )ρr+(1ρ)v⃗ 2;//1>ρ>0β⃗ tv⃗ r+δ(9) δ = 10 − 8 v → = ∇ L ( β → ) r ← ρ r + ( 1 − ρ ) ‖ v → ‖ 2 ; / / 1 > ρ > 0 β → ← β → − t v → r + δ ( 9 )

RMSProp算法还可以结合动量法,随机梯度下降法计算,参数更新公式如下:

δβ^g⃗ rv⃗ β⃗ =108=β⃗ +αv⃗ =1kki=1L(β^,X(i))ρr+(1ρ)g⃗ 2;//1>ρ>0αvtg⃗ r+δ;//1>α>0β⃗ +v⃗ (10) δ = 10 − 8 β ^ = β → + α v → g → = 1 k ∑ i = 1 k ∇ L ( β ^ , X ( i ) ) r ← ρ r + ( 1 − ρ ) ‖ g → ‖ 2 ; / / 1 > ρ > 0 v → ← α v − t g → r + δ ; / / 1 > α > 0 β → ← β → + v → ( 10 )

此方法结合了随机梯度下降法,自适应梯度下降法和动量法的优点,实际运用比较多。

三 二阶方法

一般而言,二阶方法数值计算复杂比较高,涉及到矩阵求逆,需要存储海塞矩阵,参数数量太大的时候,数值计算的时间复杂度和空间复杂度非常高,还有矩阵求逆还会碰到病态矩阵问题。因此是用的比较少。
但是二阶逼近每次迭代比一阶逼近精度高,需要的迭代次数少,同时二阶逼近方法没有学习率参数,不用进行学习率参数调优。

3.1 牛顿法

令: 2L(β⃗ )=H(β⃗ ) ∇ 2 L ( β → ) = H ( β → ) ,根据(2)式,牛顿法的参数更新方程是:

β⃗ β⃗ H1(β⃗ )L(β⃗ )(11) β → ← β → − H − 1 ( β → ) ∗ ∇ L ( β → ) ( 11 )

牛顿法有个限制,只有当 H(β⃗ ) H ( β → ) 非负定的时候,求解的才是局部最小值,当 H(β⃗ ) H ( β → ) 不定的时候,牛顿法到达的不是局部最小值,因此不能使用牛顿法。
注意: 当海塞矩阵非正定时,收敛到局部最大值,而海塞矩阵不定则收敛到鞍点。

另外,牛顿法迭代需要对 H(β⃗ ) H ( β → ) 矩阵求逆,如果海塞矩阵是病态的,则需要通过正则化来处理,求海塞矩阵的伪逆参考文章:岭回归与Moore逆矩阵;随机梯度下降发的思想仍然可以运用到牛顿法中,通过才样本中采样,估计海塞矩阵和梯度。
因此牛顿法的参数更新方程如下:

Hv⃗ Aβ⃗ =1kki=12L(β⃗ ,X(i))=1kki=1L(β⃗ ,X(i))=(H+λI)1;β⃗ Av⃗ #λ>0I(12) H = 1 k ∑ i = 1 k ∇ 2 L ( β → , X ( i ) ) v → = 1 k ∑ i = 1 k ∇ L ( β → , X ( i ) ) A = ( H + λ I ) − 1 ; # λ > 0 是 正 则 项 超 参 数 , I 是 单 位 阵 。 β → ← β → − A v → ( 12 )

3.2 共轭梯度

为了避免海塞矩阵求逆的问题,在仔细分析梯度下降法弱点的时候,发现梯度下降法上相邻两部的方向接近正交,搜索呈锯齿状前进,这意味着,下一步在上一步的某个方向上有撤回。
参照动量法更新公式可表示为:

v⃗ tL(β⃗ t1)stv⃗ t1 v → t ← ∇ L ( β → t − 1 ) − s t v → t − 1

若损失函数在 vt1 v t − 1 方向上达到最小值,则必有 v⃗ Tt1(βt1)=0 v → t − 1 T ∇ ( β t − 1 ) = 0 相对于动量算法,可以进一步评估 st s t
为了避免前面的进展被撤销,我们希望沿 v⃗ t v → t 方向上移动时,损失函数在 vt1 v t − 1 方向上继续保持最小值。 因此有:
0=dduL(βt1hv⃗ t+uv⃗ t1)=v⃗ Tt1(βt1hv⃗ t)v⃗ Tt1(βt1)hv⃗ Tt1H(βt1)v⃗ t=hv⃗ TtH(βt1)v⃗ t1 0 = d d u L ( β t − 1 − h v → t + u v → t − 1 ) = v → t − 1 T ∇ ( β t − 1 − h v → t ) ≈ v → t − 1 T ∇ ( β t − 1 ) − h v → t − 1 T H ( β t − 1 ) v → t = − h v → t T H ( β t − 1 ) v → t − 1

满足 v⃗ TtH(βt1)v⃗ t1=0 v → t T H ( β t − 1 ) v → t − 1 = 0 的方向 v⃗ t,v⃗ t1 v → t , v → t 1 称为共轭方向。
如何估计 st s t ,根据
0=v⃗ Tt1H(β⃗ t1)(L(β⃗ t1)stv⃗ t1)v⃗ Tt1H(β⃗ t1)L(β⃗ t1)=stv⃗ Tt1H(β⃗ t1)vt1st=v⃗ Tt1H(β⃗ t1)L(β⃗ t1)vTt1H(β⃗ t1)vt1L(β⃗ t1)vt1 0 = v → t − 1 T H ( β → t − 1 ) ( ∇ L ( β → t − 1 ) − s t v → t − 1 ) ⇒ v → t − 1 T H ( β → t − 1 ) ∇ L ( β → t − 1 ) = s t v → t − 1 T H ( β → t − 1 ) v t − 1 ⇒ s t = v → t − 1 T H ( β → t − 1 ) ∇ L ( β → t − 1 ) v t − 1 T H ( β → t − 1 ) v t − 1 ≈ ‖ ∇ L ( β → t − 1 ) ‖ ‖ v t − 1 ‖

由此我们得到了共轭梯度法的参数更新公式:

g⃗ tstv⃗ tλβ⃗ t=1kki=1L(β⃗ t1,X(i))=L(β⃗ t1)/g⃗ t1;wheng⃗ t1=0st=0=g⃗ t+stg⃗ t1argmin1kki=1L(β⃗ +λv⃗ t,X(i))β⃗ +λv⃗ tt+1(13) g → t = 1 k ∑ i = 1 k ∇ L ( β → t − 1 , X ( i ) ) s t = ‖ ∇ L ( β → t − 1 ) ‖ / ‖ g → t − 1 ‖ ; w h e n ‖ g → t − 1 ‖ = 0 → s t = 0 v → t = − g → t + s t g → t − 1 λ ← a r g m i n 1 k ∑ i = 1 k L ( β → + λ v → t , X ( i ) ) β → ← β → + λ v → t t ← t + 1 ( 13 )

四 其他方法

上面提到的方法,都是比较通用的数值逼近方法。有些特殊损失函数,可以得到最小值的通解公式,或者说有解析解,比如均方损失函数下的线性回归模型,通过解析解可以一步到位求解模型,不用迭代。还有另外一些特殊的模型,可以将数值方法和解析方法结合起来求解,这种方法称为坐标下降法。

4.1 坐标下降法

对于特殊的模型,按照某种方式将损失函数的参数分组,可以分为多个组,为讨论简单起见,我们假定可分为两组:

L(β⃗ )=L(β⃗ (1),β⃗ (2)) L ( β → ) = L ( β → ( 1 ) , β → ( 2 ) )

当给定其中一组参数值的时候,另一组参数最优化存在解析解,符号表示如下:
L1(β⃗ (1))β(1)L2(β⃗ (2))β(2)=L(β⃗ (1),β⃗ (2))β(2)=argminL1(β⃗ (1))=f(β(2))=L(β⃗ (1),β⃗ (2))β(1)=argminL2(β⃗ (2))=g(β(1)) L 1 ( β → ( 1 ) ) = L ( β → ( 1 ) , β → ( 2 ) ) ∣ β ( 2 ) β ( 1 ) = a r g m i n L 1 ( β → ( 1 ) ) = f ( β ( 2 ) ) L 2 ( β → ( 2 ) ) = L ( β → ( 1 ) , β → ( 2 ) ) ∣ β ( 1 ) β ( 2 ) = a r g m i n L 2 ( β → ( 2 ) ) = g ( β ( 1 ) )

其算法如下:
#input(ϵ=108,β1,β2){β⃗ (1)β⃗ (2)condwhile(cond<ϵ){β^(1)β^(2)condβ⃗ (1)β⃗ (2)}return(β⃗ (1),β⃗ (2))}=β1=β2=ϵ+1f(β⃗ (2))g(β^(1))β^(1)β⃗ (1)+β^(2)β⃗ (2)β^(1)β^(2) # i n p u t ( ϵ = 10 − 8 , β 1 , β 2 ) { β → ( 1 ) = β 1 β → ( 2 ) = β 2 c o n d = ϵ + 1 w h i l e ( c o n d < ϵ ) { β ^ ( 1 ) ← f ( β → ( 2 ) ) β ^ ( 2 ) ← g ( β ^ ( 1 ) ) c o n d ← ‖ β ^ ( 1 ) − β → ( 1 ) ‖ + ‖ β ^ ( 2 ) − β → ( 2 ) ‖ β → ( 1 ) ← β ^ ( 1 ) β → ( 2 ) ← β ^ ( 2 ) } r e t u r n ( β → ( 1 ) , β → ( 2 ) ) }

β1,β2 β 1 , β 2 为初始参数,坐标下降法得到的可能是局部最优值,而非全局最优值,要得到全局最优值,需要合适的初始化参数。

例子1:

机器学习 –超参数调优中给到的模型,就可采用坐标下降化,其损失函数为:

Q(a,b)=12ni=1n(yiaxi1bxi2abxi3)2 Q ( a , b ) = 1 2 n ∑ i = 1 n ( y i − a x i 1 − b x i 2 − a b x i 3 ) 2

在分别给定 a,b a , b 条件下有:

b=ni=1(yia0xi1)(xi2+a0xi3)ni=1(xi2+a0xi3)2a=ni=1(yib0xi2)(xi1+b0xi3)ni=1(xi1+b0xi3)2 b = ∑ i = 1 n ( y i − a 0 x i 1 ) ( x i 2 + a 0 x i 3 ) ∑ i = 1 n ( x i 2 + a 0 x i 3 ) 2 a = ∑ i = 1 n ( y i − b 0 x i 2 ) ( x i 1 + b 0 x i 3 ) ∑ i = 1 n ( x i 1 + b 0 x i 3 ) 2

例子2:

在SVD++模型中 rui r u i 表示用u对商品i的评分, N(u) N ( u ) 表示用户评价过的商品, N(u) ∣ N ( u ) ∣ 表示用户评价过的商品数量, μ μ 是所有人对全部商品评分的均值,其损失函数如下:

Q(a⃗ ,b⃗ ,q,p,f)=i,uK[(ruiμaibuq⃗ Ti(p⃗ u+N(u)0.5jN(u)y⃗ j))2+λ1(q⃗ 2i+p⃗ 2u+jN(u)y⃗ 2j)+λ2(b2i+b2u)] Q ( a → , b → , q , p , f ) = ∑ i , u ∈ K [ ( r u i − μ − a i − b u − q → i T ( p → u + ∣ N ( u ) ∣ − 0.5 ∑ j ∈ N ( u ) y → j ) ) 2 + λ 1 ( q → i 2 + p → u 2 + ∑ j ∈ N ( u ) y → j 2 ) + λ 2 ( b i 2 + b u 2 ) ]

可以按照坐标下降法来求解 Q(a⃗ ,b⃗ ,q,p,f) Q ( a → , b → , q , p , f ) ,只需要将参数分为三组即可 (a⃗ ,q),(b⃗ ,p),(f) ( a → , q ) , ( b → , p ) , ( f ) ,给定任意两组的参数值,剩下的一组有解析解,可使用坐标下降法。

你可能感兴趣的:(机器学习)