本文总结了牛顿法, 拟牛顿法,梯度下降和随机梯度下降的概念和计算公式.
首先考虑一维问题.
对于一个一维的函数,如果这个函数连续可微, 并且导数可以计算,
那么计算这个函数的最优解可以看成求解方程 f′(x)=0 的根.
设 F(x)=f′(x) , 这个求解过程就变成了求解方程 F(x)=0 的过程.
使用上述迭代的方法就可以进行计算.
迭代的方程为:
xk+1=xk−f′(xk)f′′(xk)
对于多维情况, f(x1,x2,x3,…,xn) , 需要求这个函数的最优解,
就是求 ∇f(x⃗ )=0⃗ 的解.
其中 ∇f(x⃗ )=(∂f(x⃗ )∂x0,∂f(x⃗ )∂x1,…,∂f(x⃗ )∂xn)
按照求解一维函数的方法, 设 Fi(x⃗ )=∂f(x⃗ )∂xi .
则 ∇f(x⃗ )=F⃗ (x⃗ ) .
那么对于多维函数来说, 牛顿法的公式为:
{x⃗ =初始值x⃗ k=x⃗ k−(DF⃗ (x⃗ k))−1F⃗ (x⃗ k),k=0,1,2,…
由于求解矩阵的逆的计算复杂度较高, 因此,需要使用替换的方法.
设 s⃗ =(DF⃗ (x⃗ k))−1F⃗ (x⃗ k) ,
即 DF⃗ (x⃗ k)s⃗ =F⃗ (x⃗ k) .
牛顿法的公式变为:
⎧⎩⎨⎪⎪x⃗ =初始值x⃗ k=x⃗ k+s⃗ DF⃗ (x⃗ k)s⃗ =F⃗ (x⃗ k),k=0,1,2,…
牛顿法虽然收敛速度很快, 但是计算海森矩阵时计算量特别大.
由此演化出了拟牛顿法.
拟牛顿法是模拟牛顿法的意思, 并不是一种算法, 而是几种算法的总称, 这些算法包括DFP算法, BFGS算法, L-BFGS算法.
牛顿法中, 设 gk=∇f(xk) 为梯度向量, Hk=∇2f(xk) 为海森矩阵.
拟牛顿法是对 Hk 或者 H−1k 取近似值, 从而减少计算量.
记 B≈H , D≈H−1 , yk=gk+1−gk , sk=xk+1−xk
根据拟牛顿法条件, 可得到近似公式:
或
下面是几种拟牛顿法:
DFP算法采用的是 D ,但并不直接计算D,而是计算每一步 D 的增量△D来间接的求出 D 。这也是很多优化算法的做法,因为一般上一步的中间结果对下一步的计算仍有价值,若直接抛弃重新计算耗时耗力耗内存,重新发明了轮子。
D0 通常取单位矩阵 I ,关键导出每一步的△Dk。
通过一系列艰苦而又卓绝的推导计算假设取便,最终的导出结果为:
BFGS算法与DFP算法类似,只是采用的 B 来近似H。最终的公式为:
L-BFGS算法对BFGS算法进行改进,不再存储矩阵 Dk ,因为 Dk 有时候比较大,计算机的肚子盛不下。
但是我们用到 Dk 的时候怎么办呢?答案是根据公式求出来。
从上面的算法推导可知, Dk 只跟 D0 和序列 {sk} 和 {yk} 有关。
即我们知道了后者,即可以求得前者。
进一步近似,我们只需要序列 sk 和 yk 的最近m个值即可。
这样说来,我们的计算机内存中只需要存储这两个序列即可.
最终的递推关系为:
其中
首先是梯度的介绍, 对于单变量的的函数中, 梯度是导数, 对于线性函数而言, 梯度就是线的斜率.
假设 h(x) 是要拟合的函数, J(θ) 是损失函数, θ 是参数:
g(θ)=∑nj=0θjxj
J(θ)=12m∑mi=1(yi−hθ(xi))2
∇h(θj)=∂J(θ)∂θj=−1m∑mi=1(yi−hθ(xi))xij
θ′j=θj−α∇h(θj)
这种算法有许多缺点:
当数据量比较大时, 这种方法收敛速度比较慢.
同样假设 h(x) 是要拟合的函数, J(θ) 是损失函数, θ 是参数:
g(θ)=∑nj=0θjxj
J(θ)=12m∑mi=1(yi−hθ(xi))2
∇h(θk)=∂J(θ)∂θk=−1m∑mi=1(yi−hθ(xi))xik
θ′j=θj−α∇h(θk)
相对于批量梯度下降, 随机梯度下降在每次更新操作时, 并没有选择全局最优解, 这也导致随机梯度下降可能陷入局部最优解.