文章目录
前言
这是我在Datawhale学习《深度学习详解》的记录,既作为我学习过程中的一些记录,也供同好们一起交流研究,之后还会继续更新相关内容的博客。
最优化失败的原因
如图所示,在梯度下降中,Loss应该不断下降并达到一个最小值。但在我们训练中,有可能出现Loss下降到了一个谷底,但此时并没有足够小的情况,也有可能Loss就没怎么下降(对应图中蓝,橙曲线)。
出现这种情况的原因是下降中遇到了临界点(critical point),而临界点不只包括之前我们提到的局部最小值(local minima)也包括鞍点(saddle point)。所以要注意区分的一个点就是我们梯度下降失败并不一定是因为遇到了局部最小值,还可能是遇到了鞍点。
如果我们遇到临界点了,我们该怎么做呢,这就要分情况讨论了。
当我们遇到的是local minima时,我们就暂时无路可走了,而当我们遇到的是鞍点时,事情就还有转机,因为对于鞍点来说,Loss只是陷入了某一个方向上的最小值,如果换一个方向,就可以继续下降。
如何区分局部最值和鞍点
泰勒级数近似
数学基础的补充
在上图中的式子就展示了如何用泰勒级数来近似计算,以下是对式子的解说:
首先,θ并不是我们熟悉的角度,而是一个由参数组成的向量。
再一个,绿框中第一部分就是参数向量之差的转置矩阵,g则是在
θ
′
θ'
θ′处的梯度。
最后红色框中的部分中的
H
H
H就是L对
θ
j
和
θ
i
θj和θi
θj和θi的二次微分得到的矩阵,也叫黑塞矩阵,具体细节直接百度。
判断方法
达到临界点时。绿框等于0,红框中的式子将决定我们遇到的critical point是哪种情况。
注:设
(
θ
−
θ
′
)
(\theta-\theta')
(θ−θ′)为
v
v
v。
如图所示:对于所有的
v
v
v,
v
T
H
v
v^THv
vTHv 的取值将影响我们遇到的哪种情况。但
v
v
v是无法穷尽的,所以我们可以通过
H
H
H特征值来判断。当特征值全为正数时为Local minima,全为负值时为Local maxima,有正有负为Saddle point。
举个例子:
设一个特别简单的神经网络:
y
=
w
1
w
2
x
y=w_1w_2x
y=w1w2x
critical point用Error Surface表示出来就像是上图一样。
如上图所示:代入
x
和
y
x和y
x和y,求这个网络的Loss,并将L分别对
w
1
和
w
2
w_1和w_2
w1和w2偏求导,得到g等于0,所以到了critical point。然后带入
w
1
、
w
2
w_1、w_2
w1、w2求黑塞矩阵的特征值,-2和2,所以
w
1
=
0
和
w
2
=
0
w_1=0和w_2=0
w1=0和w2=0这点是鞍点。
为什么遇到鞍点时不用害怕呢?
因为
H
H
H会告诉我们参数更新的方向。
如上图所示:当我们遇到saddle point时,我们要做的就是找出负的eigen value,以及它对应的eigen vector。然后用对应的eigen vector加上
θ
θ
θ去更新
θ
θ
θ。
而如何去求eigen value与eigen vector可以去看这个博文
eigenvector和eigenvalue的求法
在之前的例子中我们去实践一下,求出在 ( 0 , 0 ) (0,0) (0,0)处的黑塞矩阵和它的特征值。求出负的特征值对应的特征向量 u u u。然后沿着 u u u去更新 θ θ θ。
但是!由于这个方法的计算特别的复杂,所以一般不被用于实际操作。但这意味着我们在训练时遇到saddle point不用太担心,还是有解决办法的。后面将介绍一写更实用的逃离saddle point 的方法。
Saddle point v.s. Local Minima
现在,我们要讨论Saddle Point和Local Minima哪个在我们训练中更常见。
现在有一个想法:在低维中,我们遇到的Local Minima,在高维中去观察的话,它可能就是一个Saddle Point,就像上图中左侧的两幅图一样,从二维的角度去观察它是个Local Minima,但从三维的角度去观察的话,就是一个Saddle Point。
而当我们在训练时,参数是百万级别的,也许Local Minima会很少?
通过实验统计,发现我们遇到Critical point大多都是Saddle Point。
回顾:批量操作
在实际训练中,我们并不是将整个数据集去训练,而是将数据集分成很多份,也叫做batch,一份一份的进行梯度下降。
而将所有的batch都用过一遍就叫做 1 epoch。而数据集训练时要用多次也就是epoches,而在每次用数据集去训练前要先对数据集改组(Shuffle),使每个epoch的batch中的数据都不一样。这样可以提高数据集的使用率。
为什么要用Batch
如上图所示:这是未分Batch也就是Batch Size为N时和分了batch且Batch Size为 1 时一个比较:
B
a
t
c
h
S
i
z
e
=
N
Batch Size =N
BatchSize=N时:每进行一次梯度下降,因为训练的数据最多,所以需要的时间最多。但是每一步都更有效,不会朝着方向下降。
B
a
t
c
h
S
i
z
e
=
1
Batch Size =1
BatchSize=1时:每次批次需要的时间更短,但是每次下降并不一定都是有效的,有可能向反方向前进。
Small Batch V.S. Large Batch
Parallel computing
在实际实验中,我们可以发现 b a t c h s i z e batch size batchsize为1、10、100、1000时训练的时间相差无几,这是因为GPU可以进行平行运算,也就是同时对多个数据进行处理,而到10000时,超过单次训练的极限,时间就显然增加了好几倍。
我们来看训练一次epoch所需的时间,由于batch size 较小时,虽然更新一次的时间较短,但是更新的次数很多,所以训练一次epoch的时间会很长,反之很短。
而当单次训练的数据量达到GPU的平行运算的极限是,训练一次epoch的时间就达到最小值。
上图中,竖轴表示正确率,横轴表示
b
a
t
c
h
s
i
z
e
batch size
batchsize。
如图所示:较小的batch表现出更好的正确率。这是为什么呢?
这是因为
S
m
a
l
l
b
a
t
c
h
Small batch
Smallbatch带来的Noisy updata是对训练有好处的,可以使训练的Loss不会卡在一些Critical Point。有一个解释是这样的:就像是上图中两个图之间的比较,在
L
1
L_1
L1中卡住的critical point,由于批次不一样,也就是单次训练的数据集不一样,所以Loss曲线有差异,导致在
L
1
L_1
L1中卡住的critical point在
L
2
L_2
L2中就没有卡住。
上图是通过实验对SB(Small Batch)和LB(Large Batch)的效果进行比较。
我们可以看到,即使在测试数据中SB和LB表现出相似较高的正确率,但在测试数据中LB的正确率仍低于SB,所以说在训练时,SB的表现是要好于LB的(补充:如果出现SB的正确率小于LB的情况那就是过拟合了)。
如图是一个Loss的训练曲线,我们可以看到有两种
M
i
n
i
m
a
Minima
Minima,一种是Flat Minima,一种是Sharp Minima。而在训练时,我们通常认为Flat Minima是要好于Sharp Minima的,这是为什么呢?
这是因为训练数据和测试数据是有一定差距的,而用相同的模型去测试不同的数据集一般会出现上图中实线和虚线两种情况,形状大体一致,但又有些偏移。在训练数据集中Sharp Minima对应的地方,在测试数据集中可能是一个Loss较高的点。相较之下,Flat Batch对应的点Loss也会高一点,但Loss只是稍微高一点而已,不会偏差太多。
上图是对
S
m
a
l
l
−
b
a
t
c
h
和
l
a
r
g
e
−
b
a
t
c
h
Small-batch和large-batch
Small−batch和large−batch之间优缺点之间的比较。可以看出他们有好有坏,所以根据训练时的情况来挑选一个合适的Batch size是一个很重要的事。
动量(Momentum)
情景引入
虽然这个参数说是动量,但是它实际上更像是物理上的惯性,使Loss在达到critical point后仍然可以继续下降。像是上图中Loss到达critical point后仍然有继续前进的趋势。
如何使用动量
我们先看第一幅的左侧图。这是在添加参数-动量后的效果。Movement不再只取决于Gradient,而是Gradient与Momentum of the last step的加权和,在 m 和 g m和g m和g前面的参数就是它们的权重,第二幅图就是对此的阐述。
总结
第一小节聚焦于最优化失败时的原因可能是遇到了critical point,介绍了Local minima和Saddle point以及它们的判别方法和在实际训练中出现的可能性。第二节讲了批次和动量,这两个都是我们在训练时需要的技巧,后面还需自己揣摩如何调参。