0. 理想问题设定
最小化一个凸的、连续且可微的损失函数 ℓ(w)(或者最大化似然函数)。
最终求出相应的 w^ 。
算法框架:
- 初始化 w0
- 重复直到收敛: wt+1=wt+s (与 ℓ(w) 相关)
- 若 ∥wt+1−wt∥2<ϵ,则已收敛(参数几乎不动)
问题:如何选择这样的步长 s ?
1. 梯度下降法
梯度下降法是我们最常用的最优化方法。
其几个典型特性如下:
- 当目标函数是凸函数时,梯度下降法的解是全局解
- 一般情况下,其解不一定是全局最优解
- 方法简单直观,但是可能需要大量迭代才会收敛
下面引用一段维基百科对梯度下降法的定义:
定义
梯度下降法(Gradient descent)是一种求解无约束最优化问题的一阶迭代最优化算法,它被用来求得可微函数的局部极小值,通常也称为最陡下降法。
- 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索,因为这是最陡下降的方向。
- 如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点,这个过程则被称为梯度上升法。
%20%7B%20.cur%20%7B%20animation%3A%20none%20%7D%20%7D%0A%20%20.cur%20%7B%20animation%3A%20blink%201s%20steps(1)%20infinite%20%7D%0A%20%20%40keyframes%20blink%20%7B%2050%25%20%7B%20opacity%3A%200%20%7D%20%7D%0A%3C%2Fstyle%3E%3Crect%20width%3D'800'%20height%3D'600'%20fill%3D'%230c0c0a'%2F%3E%3Ctext%20x%3D'400'%20y%3D'310'%20text-anchor%3D'middle'%20font-family%3D'monospace'%20font-size%3D'28'%20fill%3D'%233a3a35'%3Ecicada%40blog%3A~%24%20loading%3C%2Ftext%3E%3Crect%20class%3D'cur'%20x%3D'589'%20y%3D'282'%20width%3D'16'%20height%3D'30'%20fill%3D'%233a3a35'%2F%3E%3C%2Fsvg%3E)
上图展示了梯度下降的过程,其中
- 蓝色的曲线是等高线
- 红色箭头指向该点梯度的反方向
- 从某个随机点出发,走向谷底,到达函数局部的极小值
1.1 公式参考
x(k+1)=x(k)−α∇xkf(x)
- x(k+1):更新后的位置
- x(k):更新前的位置
- α:学习率
- ∇xkf(x):在 x(k) 处对 f 求梯度
即选取步长
s=−α∇xkf(x)
1.2 局限
- 学习率 α 的选取,对整个学习过程会产生很大的影响
- 当 α 足够小时,梯度下降才会收敛,相应的速度会很慢
- 当 α 太大时,算法很容易震荡发散,“之字型”抖动
- 靠近最优解的区域收敛速度将明显变慢
例如下式的二维函数,其参数为 x1,x2:
f(x)=0.5(x12−x22)+0.5(x1−1)2
下图展示了在固定学习率的情况下,两种不同的学习率分别迭代 20 次的结果,起始点 (x1,x2)=(0,0) ,最小值点 (x1,x2)=(1,1) 。
%20%7B%20.cur%20%7B%20animation%3A%20none%20%7D%20%7D%0A%20%20.cur%20%7B%20animation%3A%20blink%201s%20steps(1)%20infinite%20%7D%0A%20%20%40keyframes%20blink%20%7B%2050%25%20%7B%20opacity%3A%200%20%7D%20%7D%0A%3C%2Fstyle%3E%3Crect%20width%3D'800'%20height%3D'600'%20fill%3D'%230c0c0a'%2F%3E%3Ctext%20x%3D'400'%20y%3D'310'%20text-anchor%3D'middle'%20font-family%3D'monospace'%20font-size%3D'28'%20fill%3D'%233a3a35'%3Ecicada%40blog%3A~%24%20loading%3C%2Ftext%3E%3Crect%20class%3D'cur'%20x%3D'589'%20y%3D'282'%20width%3D'16'%20height%3D'30'%20fill%3D'%233a3a35'%2F%3E%3C%2Fsvg%3E)
对于这些缺点,可以通过使用可变学习率的方法优化,如:
- α=t0/t:随时间衰减的学习率
- Adagrad 自适应学习率:梯度大的特征步长小,梯度小的特征步长大
- 线性搜索:每次迭代前寻找最优的学习率,再进行迭代
1.3 常见用法
- 批量梯度下降法(Batch Gradient Descent,BGD)
更新每一参数时都使用所有的样本来进行更新
- 随机梯度下降法(Stochastic Gradient Descent,SGD)
在每次迭代时,只使用一个样本
- 批量梯度下降法(Mini-batch Gradient Descent,MBGD)
更新每一参数时都使用一部分样本(batch)来进行更新,兼顾上述两方法
2. 牛顿法
前述梯度上升是一种非常有效的算法,但它在每次迭代时都需要小步,因此需要大量迭代才能收敛。
牛顿法(Newton's method)是一种在实数域和复数域上近似求解方程的方法。它是一种二阶优化算法。
牛顿法通常比梯度下降法收敛更早,并且迭代次数通常要少一个数量级。然而,在这种情况下,每次迭代的成本往往更高。
首先,考虑用于寻找函数零点的牛顿法。具体地,假设我们有一个函数 f:R↦R ,我们希望找到一个 θ 使得 f(θ)=0 。其中,θ∈R。牛顿法执行以下更新:
θ:=θ−f′(θ)f(θ)
我们可以将其视为通过一个与 f 在当前 θ 处相切的线性函数来近似 f,求解该线性函数的零点,并将下一个 θ 值设为此线性函数的零点位置。
%20%7B%20.cur%20%7B%20animation%3A%20none%20%7D%20%7D%0A%20%20.cur%20%7B%20animation%3A%20blink%201s%20steps(1)%20infinite%20%7D%0A%20%20%40keyframes%20blink%20%7B%2050%25%20%7B%20opacity%3A%200%20%7D%20%7D%0A%3C%2Fstyle%3E%3Crect%20width%3D'800'%20height%3D'600'%20fill%3D'%230c0c0a'%2F%3E%3Ctext%20x%3D'400'%20y%3D'310'%20text-anchor%3D'middle'%20font-family%3D'monospace'%20font-size%3D'28'%20fill%3D'%233a3a35'%3Ecicada%40blog%3A~%24%20loading%3C%2Ftext%3E%3Crect%20class%3D'cur'%20x%3D'589'%20y%3D'282'%20width%3D'16'%20height%3D'30'%20fill%3D'%233a3a35'%2F%3E%3C%2Fsvg%3E)
牛顿法给出了求解 f(θ)=0 的方法,如何用它最大化似然函数呢?ℓ 的最大值对应于其一阶导数 ℓ′(θ) 为零的点(最小化函数也是同理)。因此,令 f(θ)=ℓ′(θ) ,我们可以使用相同的算法来最大化 ℓ,即
θ:=θ−ℓ′′(θ)ℓ′(θ)
2.1 公式参考
x(k+1)=x(k)−f′′(x(k))f′(x(k))
- x(k):第 k 次迭代的位置
- f′(x(k)):一阶导数(梯度)
- f′′(x(k)):二阶导数(曲率)
- x(k+1):更新后的新位置
即选取步长
s=−f′′(x(k))f′(x(k))
2.2 二次收敛性
牛顿法具有称为二次收敛性的性质(quadratic convergence)。一般地,迭代算法产生序列 x(k)→x∗,误差 ek=∣x(k)−x∗∣。收敛速度描述误差怎么缩小,梯度下降法一般是线性收敛的,而牛顿法一般是二次收敛的。
给出一个二次收敛的非正式定义如下:
存在常数 M > 0,使得:
∣∣xk+1−x∗∣∣≤M⋅∣∣xk−x∗∣∣2
可以见到,每次迭代,误差都被"平方压缩"。
- 有效数字位数每步翻倍
- 达到 ε 精度只需 log log(1/ε) 次迭代
设牛顿法在一次迭代中具有 0.01 误差。迭代之后,误差可以二次跳跃到 0.0001,并且在两次迭代之后,它可以进一步跳跃到 0.00000001。这就是牛顿法需要相对较少迭代的原因。
关于上述相关性质的证明,可以参见 UTSA Math — Newton's Method。
2.3 向量写法
在我们的逻辑回归设置中,θ 是向量值,因此我们需要将牛顿法从单维情况推广到多维情况。牛顿法到多维设置的推广(也称为Newton-Raphson法)由下式给出:
θ:=θ−H−1∇θℓ(θ)
上式中
- ∇θℓ(θ) 是 ℓ(θ) 对 θi 的偏导数向量
- H 是一个 d×d 矩阵(如包含截距项则为 d+1),称为 Hessian 矩阵
此时,步长 s 即
s=−H−1∇θℓ(θ)
Hessian 矩阵定义为多变量函数中二阶偏导数的矩阵,其元素由下式给出
Hij=∂θi∂θj∂2ℓ(θ)
因此,Hessian 矩阵形如
H=∂x12∂2f∂x2∂x1∂2f⋮∂xn∂x1∂2f∂x1∂x2∂2f∂x22∂2f⋮∂xn∂x2∂2f⋯⋯⋱⋯∂x1∂xn∂2f∂x2∂xn∂2f⋮∂xn2∂2f
牛顿法通常比批量梯度下降收敛更快,并且需要更少的迭代次数就能非常接近最小值。
然而,牛顿法的一次迭代可能比梯度下降的一次迭代更昂贵,因为它需要找到并求逆一个 Hessian 矩阵;但只要 d 不是太大,总体上通常要快得多。
当牛顿法应用于最大化逻辑回归的对数似然函数 ℓ(θ) 时,得到的方法也称为 Fisher 得分。
3. 泰勒展开视角
通过假设损失函数 ℓ(θ) 比我们料想的要简单的多(在某点附近),可以预估函数的走势以优化。这可以通过泰勒近似实现:只要步长范数 ∣∣s∣∣2 很小(即 w+s 非常接近 w ),我们就可以用一阶和二阶导数近似函数 ℓ(w+s):
一阶展开:ℓ(w+s)≈ℓ(w)+g(w)⊤s
二阶展开:ℓ(w+s)≈ℓ(w)+g(w)⊤s+21s⊤H(w)s
其中,
- g(w)=∇ℓ(w) 是梯度(一阶导数)
- H(w)=∇2ℓ(w) 是 Hessian 矩阵(二阶导数)
上述两种近似在 ∣∣s∣∣2 很小均成立。
3.1 梯度下降与一阶近似
在梯度下降中我们只用梯度(一阶),即:我们假设 ℓ 在 w 附近是线性的,其行为类似于 ℓ(w)+g(w)⊤s 。
在最速下降(steepest descent)中,我们直接设:
s=−αg(w),α>0 很小
可以很简单地证明此时 ℓ(w+s)<ℓ(w) :
ℓ(w+(−αg(w)))≈ℓ(w)−α>0g(w)Tg(w)<ℓ(w)
3.2 牛顿法与二阶近似
在牛顿法中我们使用的是二阶近似:
ℓ(w+s)≈ℓ(w)+g(w)⊤s+21s⊤H(w)s
上式在 w 附近将 ℓ 近似为一个凸抛物线,我们可以通过求解以下优化问题找到它的最小值:
argsminℓ(w)+g(w)⊤s+21s⊤H(w)s
为了找到目标的最小值,我们对 s 求一阶导数、令其为零并解出 s:
g(w)+H(w)s=0⇒s=−[H(w)]−1g(w)
注意
如果近似足够精确且所得步长足够小,牛顿法的收敛速度一般是非常快的。但是,当函数在某个维度上(几乎)平坦时,其二阶导数接近于零,则其倒数将变得非常大,进而导致巨大的步长。与梯度下降不同,这里不能够保证步长受控。由于泰勒近似仅在局部区域精确,大步长可能使当前估计值远离泰勒近似有效的区域,最终导致发散。
%20%7B%20.cur%20%7B%20animation%3A%20none%20%7D%20%7D%0A%20%20.cur%20%7B%20animation%3A%20blink%201s%20steps(1)%20infinite%20%7D%0A%20%20%40keyframes%20blink%20%7B%2050%25%20%7B%20opacity%3A%200%20%7D%20%7D%0A%3C%2Fstyle%3E%3Crect%20width%3D'800'%20height%3D'600'%20fill%3D'%230c0c0a'%2F%3E%3Ctext%20x%3D'400'%20y%3D'310'%20text-anchor%3D'middle'%20font-family%3D'monospace'%20font-size%3D'28'%20fill%3D'%233a3a35'%3Ecicada%40blog%3A~%24%20loading%3C%2Ftext%3E%3Crect%20class%3D'cur'%20x%3D'589'%20y%3D'282'%20width%3D'16'%20height%3D'30'%20fill%3D'%233a3a35'%2F%3E%3C%2Fsvg%3E)
上图展示了同一函数上的梯度下降步(左)和牛顿步(右)。损失函数以黑色表示,近似用红色虚线表示。
- 梯度步沿函数的线性近似将点向下移动
- 牛顿步将点移动到用于近似函数的抛物线的极小值处
参考
- https://cs229.stanford.edu/main_notes.pdf
- https://aman.ai/cs229/newton-method/
- 梯度下降法-维基百科
- 牛顿法-维基百科
Gradient Descent (and Beyond)
https://www.cs.cornell.edu/courses/cs4780/2018fa/lectures/lecturenote07.html
- 常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)
最优化算法 — Machine Learning From Scratch 0.1 文档
https://machine-learning-from-scratch.readthedocs.io/zh-cn/latest/%E6%9C%80%E4%BC%98%E5%8C%96%E7%AE%97%E6%B3%95.html#id3
- UTSA Math — Newton's Method