《动手学深度学习》笔记——优化算法
深度学习基础笔记 (1) :预备知识(张量、梯度、概率…)
深度学习基础笔记 (2) :深度神经网络 DNN
深度学习基础笔记 (3) :优化算法(梯度下降、冲量法、Adam…)
深度学习基础笔记 (4) :卷积神经网络 CNN
深度学习基础笔记 (5) :计算机视觉(目标检测、语义分割、样式迁移)
深度学习基础笔记 (6) :注意力机制、Transformer
深度学习PyTorch代码模板
1 优化基础知识
1.1 优化的目标与问题
在优化中,损失函数通常被称为优化问题的目标函数,且大多数优化算法都关注的是最小化(若要最大化,只需给目标函数加负号)。对于目标函数 f : R n → R f:\mathbb{R}^n \rightarrow \mathbb{R} f:Rn→R ,其优化的一般形式为 minimize f ( x ) subject to x ∈ X \text{minimize } f(\mathbf{x}) \text{ subject to } \mathbf{x}\in \mathcal{X} minimize f(x) subject to x∈X若 X = R n \mathcal{X}=\mathbb{R}^n X=Rn 则为不受限,否则为限制集合,如 X = { x ∣ h 1 ( x ) = 0 , ⋯ , h m ( x ) = 0 , g 1 ( x ) ≤ 0 , ⋯ , g r ( x ) ≤ 0 } \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 \} X={x∣h1(x)=0,⋯,hm(x)=0,g1(x)≤0,⋯,gr(x)≤0}
优化常见问题:
- 全局最小值vs局部最小值
- 全局最小值(Global Minimum):在
x
x
x 处对应的
f
(
x
)
f(x)
f(x) 值是整个域
X
\mathcal{X}
X 中目标函数的最小值,则
f
(
x
)
f(x)
f(x) 就是全局最小值。即存在
x
∗
\mathbf{x}^*
x∗ 满足
∀ x ∈ X , f ( x ∗ ) ≤ f ( x ) \forall\ \mathbf{x}\in \mathcal{X},\ f(\mathbf{x}^*)≤f(\mathbf{x}) ∀ x∈X, f(x∗)≤f(x) - 局部最小值(Local Minimum):在
x
x
x 处对应的
f
(
x
)
f(x)
f(x) 值小于在
x
x
x 附近任意其他点的
f
(
x
)
f(x)
f(x) 值,则
f
(
x
)
f(x)
f(x) 可能是局部最小值。即存在
x
∗
\mathbf{x}^*
x∗ 满足
∃
ϵ
,
∀
x
:
∥
x
−
x
∗
∥
≤
ϵ
,
f
(
x
∗
)
≤
f
(
x
)
\exists\ \epsilon,\ \forall\ \mathbf{x}:\lVert \mathbf{x} -\mathbf{x}^* \rVert ≤ \epsilon,\ f(\mathbf{x}^*)≤f(\mathbf{x})
∃ ϵ, ∀ x:∥x−x∗∥≤ϵ, f(x∗)≤f(x)使用迭代优化算法来求解,一般只能保证找到局部最小值。通过最终迭代获得的数值解可能仅使目标函数局部最优,而不是全局最优。
- 全局最小值(Global Minimum):在
x
x
x 处对应的
f
(
x
)
f(x)
f(x) 值是整个域
X
\mathcal{X}
X 中目标函数的最小值,则
f
(
x
)
f(x)
f(x) 就是全局最小值。即存在
x
∗
\mathbf{x}^*
x∗ 满足
- 鞍点(Saddle Point)是指函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。
- 梯度消失(Gradient Vanishing):见前文——数值稳定性
1.2 凸性
凸性(Convexity)在优化算法的设计中起到至关重要的作用。注意此处的“凸”指的是“向下凸”!
凸集(Convex Set):若对于任何
a
,
b
∈
X
a,b \in\mathcal{X}
a,b∈X,连接
a
a
a 和
b
b
b 的线段也位于
X
\mathcal{X}
X 中,则称该向量空间中的集合
X
\mathcal{X}
X 是凸(Convex)的,即
∀
λ
∈
[
0
,
1
]
,
∀
a
,
b
∈
X
,
λ
a
+
(
1
−
λ
)
b
∈
X
\forall\ \lambda \in [0,1],\ \forall\ a,b \in \mathcal{X},\ \lambda a+(1-\lambda)b \in \mathcal{X}
∀ λ∈[0,1], ∀ a,b∈X, λa+(1−λ)b∈X若
X
\mathcal{X}
X 和
Y
\mathcal{Y}
Y 是凸集,则
X
∩
Y
\mathcal{X}\cap \mathcal{Y}
X∩Y 也是凸集。反之不成立。对于并集也不成立。
凸函数(Convex Function):给定一个凸集 X \mathcal{X} X ,若函数 f : X → R f:\mathcal{X}\rightarrow \mathbb{R} f:X→R 是凸的,则 ∀ λ ∈ [ 0 , 1 ] , ∀ x , x ′ ∈ X , λ f ( x ) + ( 1 − λ ) f ( x ′ ) ≥ f ( λ x + ( 1 − λ ) x ; ) \forall\ \lambda \in [0,1],\ \forall\ x,x' \in \mathcal{X},\ \lambda f(x)+(1-\lambda)f(x')≥f(\lambda x+(1-\lambda)x;) ∀ λ∈[0,1], ∀ x,x′∈X, λf(x)+(1−λ)f(x′)≥f(λx+(1−λ)x;)若 x ≠ x ′ , λ ∈ ( 0 , 1 ) x≠x',\ \lambda\in (0,1) x=x′, λ∈(0,1) 是、时不等式严格成立,则称为严格凸函数。
- 如果目标函数 f f f 是凸的,且限制集合 X \mathcal{X} X 也是凸的,则为凸优化问题,那么局部最小一定是全局最小。
- 严格凸优化问题有唯一的全局最小。
典例
- 凸
- 线性回归 f ( x ) = ∥ W x − b ∥ 2 f(\mathbf{x})=\lVert \mathbf{Wx}-\mathbf{b} \rVert^2 f(x)=∥Wx−b∥2
- Softmax回归
- 非凸(大多数)
- MLP、CNN、RNN、attention、……
2 梯度下降
梯度下降(Gradient Descent)是最简单的迭代求解算法。设目标函数为 f ( x ) f(\mathbf{x}) f(x) ,随时间增加执行以下操作 x ← x − η ∇ f ( x ) \mathbf{x}\leftarrow \mathbf{x}-\eta \nabla f(\mathbf{x}) x←x−η∇f(x)其中 η \eta η 称为学习率(Learning Rate)。
3 随机梯度下降
随机梯度下降(Stochastic Gradient Descent,SGD):给定 n n n 个样本的训练数据集,设 f i ( x ) f_i(\mathbf{x}) fi(x) 是关于索引 i i i 的训练样本的损失函数,则目标函数 f ( x ) = 1 n ∑ i = 1 n f i ( x ) f(\mathbf{x})=\frac1n \sum\limits_{i=1}^n f_i(\mathbf{x}) f(x)=n1i=1∑nfi(x) ,梯度 ∇ f ( x ) = 1 n ∑ i = 1 n ∇ f i ( x ) \nabla f(\mathbf{x})=\frac1n \sum\limits_{i=1}^n \nabla f_i(\mathbf{x}) ∇f(x)=n1i=1∑n∇fi(x) 。计算该导数开销太大,因此改用SGD来不断逼近目标,即 x ← x − η ∇ f i ( x ) , i = 1 , 2 , ⋯ , n \mathbf{x}\leftarrow \mathbf{x}-\eta \nabla f_i(\mathbf{x}),\ i=1,2,\cdots,n x←x−η∇fi(x), i=1,2,⋯,n易知随机梯度 ∇ f i ( x ) \nabla f_i(\mathbf{x}) ∇fi(x) 是对完整梯度 ∇ f ( x ) \nabla f(\mathbf{x}) ∇f(x) 的无偏近似(期望一样),即 E i [ ∇ f i ( x ) ] = 1 n ∑ i = 1 n ∇ f i ( x ) = ∇ f ( x ) E_i[\nabla f_i(\mathbf{x})]=\frac1n \sum_{i=1}^n \nabla f_i(\mathbf{x})=\nabla f(\mathbf{x}) Ei[∇fi(x)]=n1i=1∑n∇fi(x)=∇f(x)
4 小批量梯度下降
小批量随机梯度下降(Minibatch Gradient Descent):最常用的优化算法。对梯度下降和随机梯度下降的折中,取一个小批量 B \mathcal{B} B 来执行上述操作,提高计算效率。即 x ← x − η ∣ B ∣ ∑ i ∈ B ∇ f i ( x ) \mathbf{x}\leftarrow \mathbf{x}-\frac{\eta}{|\mathcal{B}|}\sum_{i\in \mathcal{B}} \nabla f_i(\mathbf{x}) x←x−∣B∣ηi∈B∑∇fi(x)与随机梯度下降一样,也是无偏近似。并且方差显著降低:由于小批量梯度由正在被平均计算的 ∣ B ∣ |\mathcal{B}| ∣B∣ 个独立梯度组成,其标准差降低了 ∣ B ∣ − 1 2 |\mathcal{B}|^{-\frac12} ∣B∣−21 。
5 冲量法
冲量法为了能够从小批量梯度下降方差减少的影响中受益,甚至超过小批量上的梯度平均值,使用泄漏平均值(Leaky Average)取代梯度计算。今后使用参数更新的另一种记法:设时间为 t t t ,则冲量法更新 w \mathbf{w} w 的过程为 g t : = 1 ∣ B ∣ ∑ i ∈ B ∇ f i ( x t − 1 ) v t = β v t − 1 + g t , w t = w t − 1 − η v t \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 gt:=∣B∣1i∈B∑∇fi(xt−1)vt=βvt−1+gt, wt=wt−1−ηvt其中 β ∈ ( 0 , 1 ) \beta\in (0,1) β∈(0,1) ,常取 0.5 , 0.9 , 0.95 , 0.99 0.5,0.9,0.95,0.99 0.5,0.9,0.95,0.99。 v \mathbf{v} v 称为冲量(Momentum),其梯度平滑,可展开为 v t = g t + β g t − 1 + β 2 g t − 2 + β 3 g t − 3 + ⋯ \mathbf{v}_t=\mathbf{g}_t+\beta g_{t-1}+\beta^2 \mathbf{g}_{t-2}+ \beta^3 \mathbf{g}_{t-3}+\cdots vt=gt+βgt−1+β2gt−2+β3gt−3+⋯
6 Adam
Adam算法将上述所有高级算法技术汇总到一个高效的学习算法中。其关键是对梯度做平滑,且对梯度各个维度值做重新修正。使用状态变量 v t = β 1 v t − 1 + ( 1 − β 1 ) g t s t = β 2 s t − 1 + ( 1 − β 2 ) g t 2 \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 vt=β1vt−1+(1−β1)gtst=β2st−1+(1−β2)gt2常设置非负加权参数 β 1 = 0.9 , β 2 = 0.999 \beta_1=0.9,\beta_2=0.999 β1=0.9,β2=0.999 。根据上述冲量法中的冲量展开式知,梯度依旧平滑。由 v 0 = s 0 = 0 \mathbf{v}_0=\mathbf{s}_0=\mathbf{0} v0=s0=0,为避免初始偏差过大,根据 ∑ i = 0 t β i = 1 − β t 1 − β \sum\limits_{i=0}^t \beta^i=\frac{1-\beta^t}{1-\beta} i=0∑tβi=1−β1−βt 修正 v , s \mathbf{v},\ \mathbf{s} v, s 为 v ^ t = v t 1 − β 1 t , s ^ t = s t 1 − β 2 t \mathbf{\hat v}_t=\frac{\mathbf{v}_t}{1-\beta_1^t},\ \mathbf{\hat s}_t=\frac{\mathbf{s}_t}{1-\beta_2^t} v^t=1−β1tvt, s^t=1−β2tst计算修正后的梯度为 g t ′ = η v ^ t s ^ t + ϵ \mathbf{g}'_t=\frac{\eta \mathbf{\hat v}_t}{\sqrt{\mathbf{\hat s}_t}+\epsilon} gt′=s^t+ϵηv^t为了在数值稳定性和逼真度之间取得良好的平衡,常选择 ϵ = 1 0 − 6 \epsilon=10^{-6} ϵ=10−6 。最后进行简单更新 w t = w t − 1 − η g t ′ \mathbf{w}_t=\mathbf{w}_{t-1}-\eta \mathbf{g}'_t wt=wt−1−ηgt′