本人学习记录,侵删,转载请署名
基础优化
w = w + Δ w w\,\,=\,\,w\,\,+\,\,\varDelta \,\,w w=w+Δw
花书第8章Optimization for Training Deep Models中对机器学习中的优化器有如下定义:
finding the parameters θ \theta θ of a neural network that significantly reduce a cost function J ( θ ) J(\theta) J(θ) ,
which typically includes a performance measure evaluated on the entire training set as well as additional regularization terms
1. GD — 梯度下降
1.1 BGD — 批量梯度下降
BGD(Batch Gradient Descent) 在求解梯度时一次性的将整个数据集进行迭代,从而计算出平均的梯度用于参数的更新
w i + 1 = w − η 1 m ∑ j = 0 m ∂ C ∂ w j w_{i+1}=w-\eta \frac{1}{m}\sum_{j=0}^m{\frac{\partial C}{\partial w}_j} wi+1=w−ηm1j=0∑m∂w∂Cj
m m m 为数据量数, C C C 为损失函数
优势 — 每次迭代均会往最优化的方向跑,且由于考虑到整个数据集,下降时不会出现震荡
劣势 — 每次优化需遍历整个数据集,时间空间消耗巨大, 血亏
代码
1.2 SGD — 随机梯度下降
SGD(Stochastic Gradient Descent)— 在每次求解梯度时仅从数据集中随机的选取一个数据点进行梯度计算,从而更新参数
Δ w = − η J ′ ( w ) 或 w i + 1 = w − η ∂ C ∂ w \Delta w=-\eta J^{\prime}(w) 或 w_{i+1}=w-\eta \frac{\partial C}{\partial w} Δw=−ηJ′(w)或wi+1=w−η∂w∂C
η \eta η 指学习率, J ′ J^{\prime} J′ 指损失关于参数的梯度 ( ∇ w J ( w ) \nabla_{w} J(w) ∇wJ(w) 也有这种形式) C C C 为损失函数
其中每次用于更新的数据量为1
优势 — 优化的速度很快
劣势 — 数据中会存在噪音,使得优化朝着并不是最优的方向而迭代. 且还可能使得训练的准确率降低. 但总体还是朝着优化的方向前进的
代码
1.3 MBGD — 小批量梯度下降
w = w − η ⋅ ∇ w J ( w ; x ( i : i + n ) ; y ( i : i + n ) ) w=w-\eta \cdot \nabla _wJ\left( w;x^{(i:i+n)};y^{(i:i+n)} \right) w=w−η⋅∇wJ(w;x(i:i+n);y(i:i+n))
MBGD(Mini-Batch Gradient Descent)将BGD和SGD求一个折中的办法,每次从数据集中选取一小部分的数据进行计算梯度
优势 — 加快梯度下降的迭代速度, 降低数据集中单一噪音数据点对优化的影响
劣势 — 对于鞍点, SGD会在鞍点附近停止更新, 而MSGD会在鞍点周围来回震荡
代码
2. Momentum
- 加速训练过程
- 解决 SGD 在 ravines 的情况下容易被困住, 就像一个深谷, SGD可能会在两侧左右横跳而达不到低谷
2.1 Simple momentum update
回顾一下普通的SGD
θ = θ − η ∇ θ J ( θ ) \theta=\theta-\eta \nabla_{\theta} J(\theta) θ=θ−η∇θJ(θ)
加了动量后的SGD PLUS!!!
v i = γ v i − 1 + η ∇ w J ( w ) w = w − v i \begin{array}{l} v_{i}=\gamma v_{i-1}+\eta \nabla_{w} J(w) \\ w=w-v_{i} \end{array} vi=γvi−1+η∇wJ(w)w=w−vi
这里 v v v 初始为0, γ \gamma γ 为其中一个超参, 一般设定为 0.9 0.9 0.9 (参照上动态图)
优势 — 减少震荡, 跳出 ravines
劣势 — 一定程度上还是比较随机, 只是沿着梯度改变的方向前进
2.2 Nesterov momentum update (Nesterov Accelerated Gradient) (NAG)
v i = γ v i − 1 + η ∇ w J ( w − γ v i − 1 ) w = w − v i \begin{array}{l} v_{i}=\gamma v_{i-1}+\eta \nabla_{w} J(w - \gamma v_{i-1}) \\ w=w-v_{i} \end{array} vi=γvi−1+η∇wJ(w−γvi−1)w=w−vi
蓝线 是 Momentum 的更新过程,在更新后的累计梯度后有一个明显的大跳跃
棕色线 是 NAG 的更新过程, 先是一段大跳跃(预测向量),而后的 红线 是一段修正向量
红线是momentum , 蓝线是NAG
个人觉得这可以在更新梯度时遇到"上坡"前放缓脚步,别直接冲出去了XD
优势 — 更新速度可顺应梯度的变化而改变
劣势 — "学习率"还是一个固定值,
3. Adaptive learning rate optimization algorithm
从训练集中采包含 m m m 个样本 { x ( 1 ) , … , x ( m ) } \left\{x^{(1)}, \ldots, x^{(m)}\right\} { x(1),…,x(m)} 的小批量,对应目标为 y ( i ) y^{(i)} y(i)
计算梯度
g ← 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) \boldsymbol{g} \leftarrow \frac{1}{m} \nabla_{\boldsymbol{\theta}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \boldsymbol{\theta}\right), \boldsymbol{y}^{(i)}\right) g←m1∇θi∑L(f(x(i);θ),y(i))
3.1 AdaGrad (Adaptive Subgradient)
r i = r i − 1 + g i 2 Δ w = η ϵ + r i g i w = w − Δ w \begin{aligned} r_{i} &=r_{i-1}+g_{i}^{2} \\ \Delta w &=\frac{\eta}{\epsilon+\sqrt{r_{i}}} g_{i} \\ w &=w-\Delta w \end{aligned} riΔww=ri−1+gi2=ϵ+riηgi=w−Δw
其中 ϵ \epsilon ϵ 是一个极小的正数,用来防止除以0, g i g_{i} gi 指在 i 处的梯度, g i 2 = g i ⊙ g i g_{i}^{2}=g_{i} \odot g_{i} gi2=gi⊙gi
⊙ \odot ⊙ 指矩阵的 Hadamard product (哈达玛积), 即 [ a 11 b 11 a 12 b 12 ⋯ a 1 n b 1 n a 21 b 21 a 22 b 22 ⋯ a 2 n b 2 n ⋮ ⋮ ⋮ a m 1 b m 1 a m 2 b m 2 ⋯ a m n b m n ] \left[\begin{array}{cccc} a_{11} b_{11} & a_{12} b_{12} & \cdots & a_{1 n} b_{1 n} \\ a_{21} b_{21} & a_{22} b_{22} & \cdots & a_{2 n} b_{2 n} \\ \vdots & \vdots & & \vdots \\ a_{m 1} b_{m 1} & a_{m 2} b_{m 2} & \cdots & a_{m n} b_{m n} \end{array}\right] ⎣⎢⎢⎢⎡a11b11a21b21⋮am1bm1a12b12a22b22⋮am2bm2⋯⋯⋯a1nb1na2nb2n⋮amnbmn⎦⎥⎥⎥⎤
公式推导:
r i r_{i} ri 展开可得: 注意,i 从1开始
r i = r i − 1 + g i 2 = r i − 2 + g i − 1 2 + g i 2 = r 0 + g 1 2 + g 2 2 + ⋯ + g i 2 = r 0 + ∑ j = 1 i g j 2 \begin{aligned} r_{i} &=r_{i-1}+g_{i}^{2} \\ &=r_{i-2}+g_{i-1}^{2}+g_{i}^{2} \\ &=r_{0}+g_{1}^{2}+g_{2}^{2}+\cdots+g_{i}^{2} \\ &=r_{0}+\sum_{j=1}^{i} g_{j}^{2} \end{aligned} ri=ri−1+gi2=ri−2+gi−12+gi2=r0+g12+g22+⋯+gi2=r0+j=1∑igj2
一般情况下 r 0 = 0 r_{0} = 0 r0=0 , 此时
Δ w = − η ϵ + r 1 g 1 = − η ϵ + g 1 g 1 \begin{aligned} \Delta w &=-\frac{\eta}{\epsilon+\sqrt{r_{1}}} g_{1} \\ &=-\frac{\eta}{\epsilon+g_{1}} g_{1} \end{aligned} Δw=−ϵ+r1ηg1=−ϵ+g1ηg1
但本着分母不能为0的原则( g i g_{i} gi 不确定), 令 r 0 = ϵ r_{0} = \epsilon r0=ϵ, 此时就可以把位于分母处的 ϵ \epsilon ϵ这一保险去除了, 递推公式也变成了:
r i = r 0 + ∑ j = 1 i g j 2 = ϵ + ∑ j = 1 i g j 2 > 0 \begin{aligned} r_{i} &=r_{0}+\sum_{j=1}^{i} g_{j}^{2} \\ &=\epsilon+\sum_{j=1}^{i} g_{j}^{2}>0 \end{aligned} ri=r0+j=1∑igj2=ϵ+j=1∑ig