目录
crirical point means gradient=0
当梯度接近于0甚至等于0的时候,损失函数的值卡住不再下降。梯度=0不一定是卡在了local minima,还有可能是卡在了saddle point:如果卡在了local minima,那就很难在进行参数更新;如果卡在了saddle point,那还是可以通过一定方式进行参数更新的。
判断critical point是local minima还是saddle point?
泰勒近似:
L
(
θ
)
≈
L
(
θ
′
)
+
(
θ
−
θ
′
)
T
g
+
1
2
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
L(\boldsymbol{\theta}) \approx L\left(\boldsymbol{\theta}^{\prime}\right)+\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)^{T} g+\frac{1}{2}\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)^{T} H\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)
L(θ)≈L(θ′)+(θ−θ′)Tg+21(θ−θ′)TH(θ−θ′)
其中,g是gradient向量 ->
g
=
∇
L
(
θ
′
)
g=\nabla L\left(\boldsymbol{\theta}^{\prime}\right)
g=∇L(θ′);H是Hessian matrix多元函数二元偏导构成的矩阵 ->
H
i
j
∘
=
∂
2
∂
θ
i
∂
θ
j
L
(
θ
′
)
{H}_{i j}^{\circ}=\frac{\partial^{2}}{\partial \boldsymbol{\theta}_{i} \partial \boldsymbol{\theta}_{j}} L\left(\boldsymbol{\theta}^{\prime}\right)
Hij∘=∂θi∂θj∂2L(θ′)。
当在critical point时,即
g
=
0
g=0
g=0,泰勒近似变为下式:
L
(
θ
)
≈
L
(
θ
′
)
+
1
2
(
θ
−
θ
′
)
T
H
(
θ
−
θ
′
)
L(\boldsymbol{\theta}) \approx L\left(\boldsymbol{\theta}^{\prime}\right)+\frac{1}{2}\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)^{T} H\left(\boldsymbol{\theta}-\boldsymbol{\theta}^{\prime}\right)
L(θ)≈L(θ′)+21(θ−θ′)TH(θ−θ′)
令
θ
−
θ
′
=
v
\theta-\theta^{'}=v
θ−θ′=v,那么根据
v
T
H
v
\boldsymbol{v}^{T} H \boldsymbol{v}
vTHv 可以判断 critical point 的类型:
对于所有的v,
v
T
H
v
>
0
\boldsymbol{v}^{T} H \boldsymbol{v}>0
vTHv>0 -> H是正定矩阵 -> H的所有特征值都大于0 -> local minima
对于所有的v,
v
T
H
v
<
0
\boldsymbol{v}^{T} H \boldsymbol{v}<0
vTHv<0 -> H是负定矩阵 -> H的所有特征值都小于0 -> local maxima
对于所有的v,
v
T
H
v
>
0
\boldsymbol{v}^{T} H \boldsymbol{v}>0
vTHv>0和
v
T
H
v
>
0
\boldsymbol{v}^{T} H \boldsymbol{v}>0
vTHv>0 同时存在 -> H的特征值有正有负 -> saddle point
卡在saddle point时参数update的方向?
【结论】:沿着H负的特征值对应的特征向量方向update
【数学证明】:令H的特征向量为u,u的特征值为
λ
\lambda
λ
u
T
H
u
=
u
T
(
λ
u
)
=
λ
∥
u
∥
2
\boldsymbol{u}^{T} H \boldsymbol{u}=\boldsymbol{u}^{T}(\lambda \boldsymbol{u})=\lambda\|\boldsymbol{u}\|^{2}
uTHu=uT(λu)=λ∥u∥2
当
λ
<
0
\lambda<0
λ<0时,根据
L
(
θ
)
≈
L
(
θ
′
)
+
1
2
u
T
H
u
L(\boldsymbol{\theta}) \approx L\left(\boldsymbol{\theta}^{\prime}\right)+\frac{1}{2}\boldsymbol{u}^{T} H \boldsymbol{u}
L(θ)≈L(θ′)+21uTHu,
L
(
θ
)
<
L
(
θ
′
)
L(\boldsymbol{\theta})<L(\boldsymbol{\theta}^{'})
L(θ)<L(θ′),此时
u
=
θ
−
θ
′
u=\theta-\theta^{'}
u=θ−θ′,即
θ
=
θ
′
+
u
\theta=\theta{'}+u
θ=θ′+u。
saddle point vs. local minima
说明经验上local minima出现的情况非常少,更多的时候是卡在了saddle point。
small batch size and momentum help escape critical point
Batch
【概念】:将training data分为多笔batch,对每一笔batch计算gradient和Loss来更新参数。
shuffle(最常见的一种shuffle的做法):在每个epoch开始之前会分一次batch,但是每一次的epoch都会不太一样。
- optimization指的是training accuracy
small batch对于参数更新更有效,因为每个batch的lossfunction略有不同,在L1卡住的时候在L2不一定会卡住。
- Generalization指的是testing accuracy
small batch更会到达一个平坦的minima,相对而言测试结果会更加稳定;而large batch更会到达一个尖锐的minima。
引自论文<On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima>
【结论】:Batch size is a hyperparamters you have to decide.
Momentum
【概念】:gradient descent的移动方向不再是gradient的反方向,而是gradient的反方向+前一步移动的方向。
Movement
m
t
=
λ
m
t
−
1
−
η
g
t
\text { Movement } \boldsymbol{m}^{\mathbf{t}}=\lambda \boldsymbol{m}^{\mathbf{t-1}}-\eta \boldsymbol{g}^{\mathbf{t}}
Movement mt=λmt−1−ηgt
Adaptive learning rate
Adagrad
当参数在某个方向上gradient非常小,我们希望learning rate大一点;当在某一方向上learning rate比较陡峭,我们希望learning rate小一点。即对不同的参数都有自己特制的learning rate。
θ
t
+
1
←
θ
t
−
η
t
σ
t
g
t
\theta^{t+1} \leftarrow \theta^{t}-\frac{\eta^{t}}{\sigma^{t}} g^{t}
θt+1←θt−σtηtgt
σ
t
{\sigma^{t}}
σt是parameter dependency的,最常见的做法是取均方根
σ
i
t
=
1
t
+
1
∑
i
=
0
t
(
g
i
t
)
2
\sigma_{i}^{t}=\sqrt{\frac{1}{t+1} \sum_{i=0}^{t}\left(g_{i}^{t}\right)^{2}}
σit=t+11i=0∑t(git)2
RMSProp
在Adagrad中我们假设gradient在同一方向上大小不变,但实际上error surface可能会非常复杂,即使是同一参数在同一方向上gradient也会发生很大的变化。所以RMSProp对Adagrad进行改进,可以通过调整现在gradient和以往gradient的权重来快速调整learning rate(Adagrad也可以根据现在的gradient进行调整,只不过Adagrad反应比较慢)。
σ
i
t
=
α
(
σ
i
t
−
1
)
2
+
(
1
−
α
)
(
g
i
t
)
2
\sigma_{i}^{t}=\sqrt{\alpha\left(\sigma_{i}^{t-1}\right)^{2}+\left(1- \alpha\right)\left(\boldsymbol{g}_{i}^{t}\right)^{2}}
σit=α(σit−1)2+(1−α)(git)2
【注】:目前最常用的Optimizator是Adam=RMSProp+Momentum
learning rate scheduling
使用adaptive learning rate的方法(如图使用的是Adagrad)会找到最优点,但是在终点附近有可能会出现剧烈震荡的情况。这是因为在终点附近gradient的值都很小,
σ
\sigma
σ积累了一定小的gradient会使learning rate变大从而导致震荡。所以在gradient descent的learning中的
η
{\eta}
η不再是个常数,让其变成和时间有关的变量
η
t
{\eta}^{t}
ηt,随着时间越长,离终点越近,控制learning rate很小。
- learning rate decay
- warm up
在训练bert的时候往往会用到warm up
可参考论文<On the Variance of the Adaptive Learning Rate and Beyond>
Batch normalization
【目的】:让error surface不那么崎岖,更好训练
【做法】:不仅对feature做normalization,对神经网络内每一层输出的数值也要做normalization,而这种normalization是要在每个batch上做的,所以叫batch normalization。可以在activative function之前做,也可以在activative function之后做。如果activative function是sigmoid的话,更推荐在之前做。
- 【training】
z ~ i = z i − μ σ \tilde{\boldsymbol{z}}^{i}=\frac{\boldsymbol{z}^{\boldsymbol{i}}-\boldsymbol{\mu}}{\boldsymbol{\sigma}} z~i=σzi−μ
z ^ i = γ ⊙ z ~ i + β \hat{\boldsymbol{z}}^{i}=\gamma \odot \tilde{\boldsymbol{z}}^{i}+\boldsymbol{\beta} z^i=γ⊙z~i+β - 【testing】
难以实现再等待收集一个batch的资料后再进行计算,所以 μ \mu μ和 σ \sigma σ的计算跟training略有不同,计算的是在训练过程中batch的moving average。
μ ‾ ← p μ ‾ + ( 1 − p ) μ t \overline{\boldsymbol{\mu}} \leftarrow p \overline{\boldsymbol{\mu}}+(1-p) \boldsymbol{\mu}^{t} μ←pμ+(1−p)μt
z ~ i = z i − μ ‾ σ ‾ \tilde{\boldsymbol{z}}^{i}=\frac{\boldsymbol{z}^{\boldsymbol{i}}-\overline{\boldsymbol{\mu}}}{\overline\boldsymbol{\sigma}} z~i=σzi−μ - Why does batch normalization works?
Internal Covariate Shift
但是以上解释在<How does batch normalization help optimization>被打脸,might be somewhat serendipitous。