TOC
KINA

KINA-0

Start having fun with KINA right now!

深度学习基础(3):优化算法(梯度下降、冲量法、Adam…)

《动手学深度学习》笔记——优化算法。本文首先介绍了优化的目标、常见问题以及凸性的重要性。随后,详细讨论了梯度下降的基本原理,并对随机梯度下降和小批量梯度下降进行了比较。这些方法通过不同的数据处理方式影响训练效率与收敛速度。此外,文中还探讨了冲量法,通过引入过去的梯度信息来加速收敛,以及Adam优化算法,该算法结合了动量与自适应学习率,广泛应用于深度学习模型的训练中。

1 优化基础知识

1.1 优化的目标

在优化中,损失函数通常被称为优化问题的目标函数,且大多数优化算法都关注的是最小化(若要最大化,只需给目标函数加负号)。对于目标函数f:\mathbb{R}^n \rightarrow \mathbb{R},其优化的一般形式为

\text{minimize } f(\mathbf{x}) \text{ subject to } \mathbf{x}\in \mathcal{X}

\mathcal{X}=\mathbb{R}^n则为不受限,否则为限制集合,如

\mathcal{X}=\{ \mathbf{x}\mid h_1(\mathbf{x})=0, \cdots,h_m(\mathbf{x})=0,g_1(\mathbf{x})≤0,\cdots,g_r(\mathbf{x})≤0 \}

1.2 优化常见问题

全局最小值vs局部最小值

全局最小值(Global Minimum):在x处对应的f(x)值是整个域\mathcal{X}中目标函数的最小值,则f(x)就是全局最小值。即存在\mathbf{x}^*满足

\forall\ \mathbf{x}\in \mathcal{X},\ f(\mathbf{x}^*)≤f(\mathbf{x})

局部最小值(Local Minimum):在x处对应的f(x)值小于在x附近任意其他点的f(x)值,则f(x)可能是局部最小值。即存在\mathbf{x}^*满足

\exists\ \epsilon,\ \forall\ \mathbf{x}:\lVert \mathbf{x} -\mathbf{x}^* \rVert ≤ \epsilon,\ f(\mathbf{x}^*)≤f(\mathbf{x})

使用迭代优化算法来求解,一般只能保证找到局部最小值。通过最终迭代获得的数值解可能仅使目标函数局部最优,而不是全局最优。

局部最值

鞍点

鞍点(Saddle Point)是指函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。

梯度消失

梯度消失(Gradient Vanishing):见数值稳定性

1.3 凸性

凸性(Convexity)在优化算法的设计中起到至关重要的作用。注意此处的“凸”指的是“向下凸”!

凸集(Convex Set):若对于任何a,b \in\mathcal{X},连接ab的线段也位于\mathcal{X}中,则称该向量空间中的集合\mathcal{X}(Convex)的,即

\forall\ \lambda \in [0,1],\ \forall\ a,b \in \mathcal{X},\  \lambda a+(1-\lambda)b \in \mathcal{X}

\mathcal{X}\mathcal{Y}是凸集,则\mathcal{X}\cap \mathcal{Y}也是凸集。反之不成立。对于并集也不成立。

凸集

凸函数(Convex Function):给定一个凸集\mathcal{X},若函数f:\mathcal{X}\rightarrow \mathbb{R}是凸的,则

\forall\ \lambda \in [0,1],\ \forall\ x,x' \in \mathcal{X},\ \lambda f(x)+(1-\lambda)f(x')≥f(\lambda x+(1-\lambda)x;)

x≠x',\ \lambda\in (0,1)是、时不等式严格成立,则称为严格凸函数

严格凸函数

  • 如果目标函数f是凸的,且限制集合\mathcal{X}也是凸的,则为凸优化问题,那么局部最小一定是全局最小。
  • 严格凸优化问题有唯一的全局最小。

严格凸优化问题有唯一的全局最小

典例
凸:
(1)线性回归f(\mathbf{x})=\lVert \mathbf{Wx}-\mathbf{b} \rVert^2
(2)Softmax回归
非凸(大多数):MLP、CNN、RNN、attention、……


2 梯度下降

梯度下降(Gradient Descent)是最简单的迭代求解算法。设目标函数为f(\mathbf{x}),随时间增加执行以下操作

\mathbf{x}\leftarrow \mathbf{x}-\eta \nabla f(\mathbf{x})

其中\eta称为学习率(Learning Rate)。


3 随机梯度下降

随机梯度下降(Stochastic Gradient Descent,SGD):给定n个样本的训练数据集,设f_i(\mathbf{x})是关于索引i的训练样本的损失函数,则目标函数f(\mathbf{x})=\frac1n \sum\limits_{i=1}^n f_i(\mathbf{x}),梯度\nabla f(\mathbf{x})=\frac1n \sum\limits_{i=1}^n \nabla f_i(\mathbf{x})。计算该导数开销太大,因此改用SGD来不断逼近目标,即

\mathbf{x}\leftarrow \mathbf{x}-\eta \nabla f_i(\mathbf{x}),\ i=1,2,\cdots,n

易知随机梯度\nabla f_i(\mathbf{x})是对完整梯度\nabla f(\mathbf{x})无偏近似(期望一样),即

E_i[\nabla f_i(\mathbf{x})]=\frac1n \sum_{i=1}^n \nabla f_i(\mathbf{x})=\nabla f(\mathbf{x})

4 小批量梯度下降

小批量随机梯度下降(Minibatch Gradient Descent):最常用的优化算法。对梯度下降和随机梯度下降的折中,取一个小批量\mathcal{B}来执行上述操作,提高计算效率。即

\mathbf{x}\leftarrow \mathbf{x}-\frac{\eta}{|\mathcal{B}|}\sum_{i\in \mathcal{B}} \nabla f_i(\mathbf{x})

与随机梯度下降一样,也是无偏近似。并且方差显著降低:由于小批量梯度由正在被平均计算的|\mathcal{B}|个独立梯度组成,其标准差降低了|\mathcal{B}|^{-\frac12}


5 冲量法

冲量法为了能够从小批量梯度下降方差减少的影响中受益,甚至超过小批量上的梯度平均值,使用泄漏平均值(Leaky Average)取代梯度计算。今后使用参数更新的另一种记法:设时间为t,则冲量法更新\mathbf{w}的过程为

\mathbf{g}_t:= \frac{1}{|\mathcal{B}|}\sum\limits_{i\in \mathcal{B}}\nabla f_i(\mathbf{x_{t-1}})\\
\mathbf{v}_t=\beta \mathbf{v}_{t-1}+\mathbf{g}_t,\ \mathbf{w}_t=\mathbf{w}_{t-1}-\eta \mathbf{v}_t

其中\beta\in (0,1),常取0.5,0.9,0.95,0.99\mathbf{v}称为冲量(Momentum),其梯度平滑,可展开为

\mathbf{v}_t=\mathbf{g}_t+\beta g_{t-1}+\beta^2 \mathbf{g}_{t-2}+ \beta^3 \mathbf{g}_{t-3}+\cdots

6 Adam

Adam算法将上述所有高级算法技术汇总到一个高效的学习算法中。其关键是对梯度做平滑,且对梯度各个维度值做重新修正。使用状态变量

\mathbf{v}_t=\beta_1\mathbf{v}_{t-1}+(1-\beta_1)\mathbf{g}_t\\
\mathbf{s}_t=\beta_2\mathbf{s}_{t-1}+(1-\beta_2)\mathbf{g}_t^2

常设置非负加权参数\beta_1=0.9,\beta_2=0.999。根据上述冲量法中的冲量展开式知,梯度依旧平滑。由\mathbf{v}_0=\mathbf{s}_0=\mathbf{0},为避免初始偏差过大,根据\sum\limits_{i=0}^t \beta^i=\frac{1-\beta^t}{1-\beta}修正\mathbf{v},\ \mathbf{s}

\mathbf{\hat v}_t=\frac{\mathbf{v}_t}{1-\beta_1^t},\ \mathbf{\hat s}_t=\frac{\mathbf{s}_t}{1-\beta_2^t}
```计算修正后的梯度为
```katex
\mathbf{g}'_t=\frac{\eta \mathbf{\hat v}_t}{\sqrt{\mathbf{\hat s}_t}+\epsilon}

为了在数值稳定性和逼真度之间取得良好的平衡,常选择\epsilon=10^{-6}。最后进行简单更新

\mathbf{w}_t=\mathbf{w}_{t-1}-\eta \mathbf{g}'_t

发表评论