机器学习训练过程和各种迭代优化算法密不可分,像梯度下降法、牛顿法等迭代式子随手都能写出来。但是对它们背后的数学原理却渐渐淡忘了。所以写一篇学习笔记,重新整理一下。
这些算法本身是用来求解方程解的,不过不难想到可以用他们来计算极值:求解导数为 0 的点。下面的内容首先从求解方程
f(x)=0
开始说起。
基础
不动点迭代法
由于我本科学习的是计算数学,其中有数值计算这门课,所以在接触到机器学习之前就对牛顿法之类不陌生。为了将逻辑衔接的更紧密,首先就从不动点迭代法开始说起吧。
不动点迭代过程:
-
首先将方程改写成:
x=ϕ(x)
如果 x˙ 满足 f(x˙)=0,那么显然有 x˙=ϕ(x˙),这个 x˙ 就称作不动点,同时也可以看出,不动点就是方程的解。
-
选取一个解附近的点 x0 带入:
x1=ϕ(x0)
-
执行迭代过程:
xk+1=ϕ(xk)
-
当 ∣xk+1−xk∣<ϵ 时停止迭代,其中 ϵ 为定义的精度阈值。
Newton-Raphson 方法(牛顿法、牛顿切线法)
用一阶泰勒展开式近似 f(x),有:
f(x)≈f(x0)+f′(x0)(x−x0)
方程 f(x) 在点 x0 附近可以近似表示为:
f(x0)+f′(x0)(x−x0)=0
然后进行迭代:
-
令:
x1=x0−f′(x0)f(x0)
-
迭代:
xk+1=xk−f′(xk)f(xk)
-
当 ∣xk+1−xk∣<ϵ 时终止,其中 ϵ 为定义的精度阈值。
个人理解,其实无论是梯度下降法还是牛顿法,本质思想都是不动点迭代,不同的是这个不动点针对的是函数本身还是函数的导数。
引申
用牛顿法求解函数极值点
有了上面的基础内容支撑,不难想出一个求解函数极值的方法。因为导数为 0 是函数极值的必要条件,所以,我们可以用牛顿法求解 f′(x) 的零点。
首先考虑 f(x) 在 xk 点的二阶泰勒展开式:
f(x)=f(xk)+f′(xk)(x−xk)+21f′′(xk)(x−xk)2
两边取导数,这一步计算要细心,记住 f(x) 是函数,f(xk) 是数,求导的时候不要乱套:
f′(x)=f′(xk)+f′′(xk)(x−xk)
假如在 xk+1 点可以取得极小值,那么有 f′(xk+1)=0。对上式两边带入 xk+1,有:
f′(xk+1)=0=f′(xk)+f′′(xk)(xk+1−xk)
整理一下得到递推式:
xk+1=xk−f′′(xk)f′(xk)
推广
在机器学习中,我们的输入往往不是标量,而是多组特征组成的向量。在这一节,我们将上面的内容推广到多元函数上。
牛顿法
仿照着一元函数的牛顿法推导过程,先在 xk 上进行泰勒展开。其中,gk 是在 xk 点的梯度向量,Hk 是在 xk 点的海塞矩阵:
f(x)=f(xk)+gkT(x−xk)+21(x−xk)THk(x−xk)
两边求梯度:
∇f(x)=gk+Hk(x−xk)
若在 xk+1 点取极值,两边带入 xk+1 得到:
∇f(xk+1)=gk+1=0=gk+Hk(xk+1−xk)
整理一下就得到了迭代公式:
xk+1=xk−Hk−1gk
在这里可以看出牛顿法推广到多元函数之后的一个缺陷:求解海塞矩阵的逆矩阵很复杂。为了解决这个问题,拟牛顿法被提出了。
拟牛顿法
拟牛顿法的核心思路就是用一个矩阵 Gk 替代海塞矩阵的逆 Hk−1。
在 xk+1 不为极值点的时候,满足等式:
gk+1=gk+Hk(xk+1−xk)
记 yk=gk+1−gk,δk=xk+1−xk。
那么有:
yk=Hkδk
或:
Hk−1yk=δk
这两个式子称作拟牛顿条件。
简而言之,只要保证拟牛顿条件成立,算法依然是”正确”的(具体来说,可以保证牛顿法的搜索方向正确,证明略去)。
进一步地,拟牛顿条件可以记作:
Gk+1yk=δk
而更新 Gk 的形式是:
Gk+1=Gk+ΔGk
最后,问题就只剩下一个:如何构造符合拟牛顿条件的 Gk。对于这一步有很多种具体实现方法,常用的就是 Broyden 类拟牛顿法。