1、SGD
随机梯度下降。
- 随机的意思是随机选取一个batch进行梯度更新
1.1、更新过程
- 学习率 ϵ k \epsilon_k ϵk
- 梯度估计
g ^ = 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ) = 1 m ∂ L ∂ θ \begin{aligned} \hat{g}& = \frac{1}{m} \nabla_{\theta}\sum_iL(f(x^{(i)};\theta), y) \\ &=\frac{1}{m}\frac{\partial{L}}{\partial{\theta}} \end{aligned} g^=m1∇θi∑L(f(x(i);θ),y)=m1∂θ∂L - 梯度更新
g t = g t − 1 − ϵ k g ^ g_t = g_{t-1} - \epsilon_k\hat{g} gt=gt−1−ϵkg^
1.2、优化
保证SGD收敛的一个充分条件是:(这里还不会证明)
∑
k
=
1
∞
ϵ
k
=
∞
∑
k
=
1
∞
ϵ
k
2
=
0
\begin{aligned} &\sum_{k=1}^{\infty}\epsilon_k = \infty\\ &\sum_{k=1}^{\infty}\epsilon_k^2 = 0 \end{aligned}
k=1∑∞ϵk=∞k=1∑∞ϵk2=0
- 实践中,一般会采用线性衰减学习率,知道第
τ
\tau
τ次迭代。
ϵ k = ( 1 − α ) ϵ 0 + α ϵ τ \epsilon_k = (1-\alpha)\epsilon_0 + \alpha\epsilon_{\tau} ϵk=(1−α)ϵ0+αϵτ
其中, τ = k τ \tau=\frac{k}{\tau} τ=τk,在第τ步迭代后,一般使 ϵ \epsilon ϵ保持常数。 ϵ τ \epsilon_{\tau} ϵτ一般设为 ϵ 0 \epsilon_0 ϵ0的1% - 研究优化算法的收敛率,一般会衡量额外误差:(这里还不理解)
J ( θ ) − m i n θ J ( θ ) J(\theta)-min_{\theta}J(\theta) J(θ)−minθJ(θ) - SGD应用于凸问题时,k步迭代后的额外误差量级是 O ( 1 k ) O(\frac{1}{\sqrt{k}}) O(k1),强凸情况下是 O ( 1 k ) O(\frac{1}{k}) O(k1)。
ps:强凸问题。 f ( x ) − m 2 ∣ ∣ x ∣ ∣ 2 f(x)-\frac{m}{2}||x||^2 f(x)−2m∣∣x∣∣2是一个凸函数,也就是说,f(x)是凸性度量为m的强凸函数。
2、动量
动量法旨在加速学习,特别是处理高曲率、小但一致的梯度或是带噪声的梯度。
- 动量法积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动
2.1、动量法更新
超参数
α
\alpha
α决定了之前梯度的贡献,衰减得有多快。更新规则如下:
v
=
α
v
−
ϵ
∇
θ
(
1
m
∑
i
=
1
m
L
(
f
(
x
(
i
)
;
θ
)
)
,
y
(
i
)
)
θ
=
θ
+
v
\begin{aligned} & v = \alpha v-\epsilon\nabla_{\theta}(\frac{1}{m}\sum^m_{i=1}L(f(x^{(i)};\theta)),y^{(i)})\\ & \theta=\theta+v \end{aligned}
v=αv−ϵ∇θ(m1i=1∑mL(f(x(i);θ)),y(i))θ=θ+v
2.2、动量法的步长
不使用动量法时,步长是梯度范数乘以学习率(
ϵ
1
m
∂
L
∂
θ
\epsilon \frac{1}{m}\frac{\partial L}{\partial \theta}
ϵm1∂θ∂L),引入动量后,步长取决于梯度序列的大小和排列。当许多连续的梯度指向相同方向时,步长最大。如果动量算法总是观测到梯度g,那么他会在方向-g上不停加速,直到达到最终速度,其中步长大小为:
ϵ
∣
∣
g
∣
∣
1
−
α
\begin{aligned} &\frac{\epsilon ||g||}{1-\alpha} \\ \end{aligned}
1−αϵ∣∣g∣∣
上式证明:
v
=
α
v
−
ϵ
g
=
α
n
v
0
−
α
n
−
1
ϵ
g
−
α
n
−
2
ϵ
g
−
.
.
.
−
α
ϵ
g
−
ϵ
g
\begin{aligned} v &= \alpha v -\epsilon g \\ &=\alpha ^n v_0 - \alpha ^{n-1}\epsilon g - \alpha ^{n-2}\epsilon g - ...- \alpha \epsilon g - \epsilon g \end{aligned}
v=αv−ϵg=αnv0−αn−1ϵg−αn−2ϵg−...−αϵg−ϵg
利用等比数列求和:
v
=
α
n
v
0
−
(
α
n
−
1
)
ϵ
g
α
−
1
v = \alpha ^n v_0 - \frac{(\alpha ^ n - 1)\epsilon g}{\alpha - 1}
v=αnv0−α−1(αn−1)ϵg
因为
α
n
→
∞
\alpha ^ n \rarr \infty
αn→∞,所以
v
→
ϵ
g
α
−
1
v\rarr \frac{\epsilon g}{\alpha-1}
v→α−1ϵg,步长为v的绝对值,为
ϵ
∣
∣
g
∣
∣
1
−
α
\frac{\epsilon ||g||}{1-\alpha}
1−αϵ∣∣g∣∣
- 因此,将动量的超参数视为 1 1 − α \frac{1}{1-\alpha} 1−α1有助于理解,α=0.9对应着最大速度10倍于梯度下降算法。
- 实践中,阿尔法一般取值为0.5,0.9,0.99,和学习率一样,α也会随着时间不短调整,一般初始值是一个比较小的值,随后慢慢变大。
2.3、Nesterov动量
Nesterov动量法在标准动量方法中增加了一个校正因子,来增加收敛速度。
计算方法:
θ
~
=
θ
+
α
v
g
=
1
m
∇
θ
∑
i
L
(
f
(
x
(
i
)
,
θ
~
)
,
y
(
i
)
)
v
=
α
v
−
ϵ
g
θ
=
θ
+
v
\begin{aligned} \tilde \theta &=\theta + \alpha v\\ g &= \frac{1}{m}\nabla_{\theta}\sum_iL(f(x^{(i)},\tilde \theta), y^{(i)})\\ v & = \alpha v - \epsilon g\\ \theta & = \theta + v \end{aligned}
θ~gvθ=θ+αv=m1∇θi∑L(f(x(i),θ~),y(i))=αv−ϵg=θ+v
3、学习率自适应
对每个参数设置不同的学习率,在整个学习过程中,自动适应这些学习率是有道理的。
3.1、AdaGrad
算法缩放每个参数反比于其所有梯度历史平方指总和的平方根,效果是损失大的参数,有一个大的学习率,损失小的参数有一个小的学习率。净效果是在更为平缓的倾斜方向会取得较大的进步(较大进步的意思是,在平缓的倾斜方向上,学习率减小,以使模行可以得到最优解)。
缺点:梯度平方和的累积,导致步长减少过快,可能提前结束学习。
- 设置小常数 δ \delta δ,为了数值稳定,大约设为 1 0 − 7 10^{-7} 10−7
- 初始化梯度累计变量 r = 0 r=0 r=0
- 更新参数如下:
g = 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ) r = r + g ⊙ g Δ θ = − ϵ δ + r ⊙ g θ = θ + Δ θ \begin{aligned} g& = \frac{1}{m} \nabla_{\theta}\sum_iL(f(x^{(i)};\theta), y) \\ r&=r+g\odot g\\ \Delta \theta&=-\frac{\epsilon}{\delta+\sqrt r}\odot g \\ \theta &=\theta + \Delta \theta \end{aligned} grΔθθ=m1∇θi∑L(f(x(i);θ),y)=r+g⊙g=−δ+rϵ⊙g=θ+Δθ
3.2、RMSProp
针对AdaGrad的梯度勒紧问题,RMSProp引入指数衰减平均以丢弃遥远过去的历史。
- 设置衰减速率 ρ \rho ρ
- 设置小常数 δ \delta δ,通常设置为 1 0 − 6 10^{-6} 10−6
- 初始化累积变量 r = 0 r=0 r=0
- 更新过程如下:
g = 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ) r = ρ r + ( 1 − ρ ) g ⊙ g Δ θ = − ϵ r + δ ⊙ g θ = θ + Δ θ \begin{aligned} g& = \frac{1}{m} \nabla_{\theta}\sum_iL(f(x^{(i)};\theta), y) \\ r& = \rho r + (1-\rho)g\odot g \\ \Delta \theta & = -\frac{\epsilon}{\sqrt {r+\delta}}\odot g \\ \theta & = \theta + \Delta \theta \end{aligned} grΔθθ=m1∇θi∑L(f(x(i);θ),y)=ρr+(1−ρ)g⊙g=−r+δϵ⊙g=θ+Δθ
采用Nesterov动量的RMSProp算法 - 设置衰减速率 ρ \rho ρ,动量系数 α \alpha α
- 更新过程如下:
θ ^ = θ + α v g = 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ^ ) , y ) r = ρ r + ( 1 − ρ ) g ⊙ g v = α v − ϵ r ⊙ g θ = θ + v \begin{aligned} \hat \theta & = \theta +\alpha v \\ g & = \frac{1}{m} \nabla_{\theta}\sum_iL(f(x^{(i)};\hat \theta), y) \\ r & = \rho r + (1-\rho)g \odot g \\ v & = \alpha v - \frac{\epsilon}{\sqrt r}\odot g \\ \theta & = \theta +v \end{aligned} θ^grvθ=θ+αv=m1∇θi∑L(f(x(i);θ^),y)=ρr+(1−ρ)g⊙g=αv−rϵ⊙g=θ+v
3.3、Adam
Adam的实现在RMSProp的基础上,增加了一阶矩估计,并修正偏差。
- 设定指数衰减速率, ρ 1 , ρ 2 ∈ [ 0 , 1 ) \rho_1,\rho_2 \in[0, 1) ρ1,ρ2∈[0,1),建议默认为0.9和0.999
- 用于数值稳定的小常数 δ \delta δ,建议默认为 1 0 − 8 10^{-8} 10−8
- 初始化一阶和二阶矩变量s=0,r=0
- 更新过程如下:
g = 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ) s = ρ 1 s + ( 1 − ρ 1 ) g r = ρ 2 r + ( 1 − ρ 2 ) g ⊙ g s ^ = s 1 − ρ 1 t r ^ = r 1 − ρ 2 t Δ θ = − ϵ s ^ r ^ + δ θ = θ + Δ θ \begin{aligned} g& = \frac{1}{m} \nabla_{\theta}\sum_iL(f(x^{(i)};\theta), y) \\ s &=\rho_1 s +(1-\rho_1)g\\ r& = \rho_2 r + (1-\rho_2)g\odot g \\ \hat s & = \frac{s}{1-\rho_1^t} \\ \hat r & = \frac{r}{1-\rho_2^t}\\ \Delta \theta & = -\frac{\epsilon \hat s}{\sqrt {\hat r}+\delta} \\ \theta & = \theta + \Delta \theta \end{aligned} gsrs^r^Δθθ=m1∇θi∑L(f(x(i);θ),y)=ρ1s+(1−ρ1)g=ρ2r+(1−ρ2)g⊙g=1−ρ1ts=1−ρ2tr=−r^+δϵs^=θ+Δθ