前情回顾
0 概述
这一次课涉及5个video,内容比较分散,这里先小结一个mind map。
1 梯度下降法的局限
这里指的是梯度下降法陷入saddle point和local minima的情形。
1.1 saddle point和local minima
梯度下降法求解到一定程度,会出现如下图黄色的情况。此时,求解可能到达了saddle point,也可能到达了local minima。
saddle point和local minima如下图所示。saddle point是鞍点,可能在这个方向上梯度为零,但仍然存在优化的可能;local minima是局部极值,这个点的四周都比它高。
1.2 识别saddle point和local minima
如何识别鞍点(saddle point)和局部极值点(local minima),通过Hessian来确定。
下图的
L
L
L是一个泰勒展开式,定义
H
H
H为二阶偏导。
H
H
H可以用于区分以下三种点。
可以根据
H
H
H的正负来判断当前点属于什么。
也可以通过画图来确定。
在saddle point中,Hessian可以告诉我们梯度update的方向
但是在实操中,不会用这个方法来确定saddle point,计算量太大。
1.3 saddle point和local minima哪个更常见
在低维空间中无路可走,在高维空间可能有路。
在二维是个local minima,在三维有可能是saddle point。
local minima没有那么常见,在高维还是大部分都是saddle point。
2 批次Batch与动量Momentum
2.1 Batch
2.1.1 Batch是什么
每次训练都割成很多份数据,就是很多个batch,每次训练都要把所有的batch都练完,才完成一步(一个epoch)。
2.1.2 小batch和大batch的优缺点
在不引入并行计算时
通常认为,小batch的好处是看一部分数据,就可以update一次参数;而大batch则要看完全部数据才能够update。
但是,小batch也容易导致振荡,而大batch的求解则更加稳定。
考虑并行计算时
但是如果考虑并行运算(使用GPU),大batch不一定比小batch运算时间长。看一个具体的案例:手写数字识别(MNIST数据集),除非数据实在太大。
甚至考虑并行计算时,小batch因为需要不断读取数据及更新,在一个epoch上需要更多的时间。
在training上的效果
但是,小的batch size(nosiy update)依然会带来比较好的training结果。在两个数据集上,的实践证明了这一点。
所以为什么会更好呢?
相当于有多个备份,当一个batch梯度下降卡在平台时,另外一个不会卡住,这样有助于更快速的完成梯度下降寻优。
在testing上的效果
此外,小的batch也对testing有好处。这里有一篇参考文献:On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima。
为什么是这样?
从下面这张图可以直观地进行理解,一般来说training和testing都会有loss的差距。这里假设是testing比training向右平移。如果求出来的结果是flat minima(梯度比较平缓)的话,则train和test的差距没有那么明显,但如果是sharp minima(梯度比较锋利)的话,差距就会非常明显。
我们普遍会认为,small batch可以帮我们找到一个flat minima,而large batch更容易走到sharp minima里头。
2.1.3 总结:小batch vs 大batch
因此,batch size是一个需要调整的超参数。
李宏毅推荐了一些参考论文,探讨如何确定一个好的batch size从而同时获得较快的计算速度及较好的准确性。
2.2 Momentum
尝试像一个真实世界里的小球,让它具有一定的惯性,从而不会被local minima卡住。
此时,会变成这个样子。每次移动的方向,除了受到gradient的影响,还受到上一步的移动方向的影响。
通式如下:
更直观地理解,依然看小球下坡的例子。走到local minima时,还受到前一步方向的影响。就算是走上坡,如果前一步的方向影响够大,也依然可以往前走。
3 自动调整学习率adaptive learning rate
3.1 为什么需要自动调整学习率
在实际上,loss练到不变时,gradient不见得很小。这个可能是因为卡在了一个山谷,就没有办法再下降了。
回到之前回归时用过的例子,learning rate的调整很麻烦
太大振荡,太小走着走着就走不动了。
learning rate不应该在每一个时刻都使用相同的,需要特制化的learning rate。
3.2 随参数特制化的学习率
3.2.1 Root Mean Square
常见的类型是,计算平均方差(Root Mean Square)。
上述方法被用于AdaGrad。
为什么有用呢?
如果连续梯度很大,就用小一点的learning rate,如果连续梯度很小,就用大一点的learning rate。这样又不容易出现振荡,又不容易陷入局优。
3.2.2 RMSProp
我们希望同一个参数,同一个方向,learning rate也可以是动态的。举个例子如果error surface是新月型的,在w1不同值时,我们希望w2的学习率也有变化,如下图。
新的方法RMSProp(无论文)就是解决这个问题的。
可以动态调整learning rate。
走到很陡的地方可以很快地踩一个刹车,走到平滑的时候又可以加快。
RMSProp方法的优点在于,可以调整
α
\alpha
α,这样可以关注接近的梯度,而不是对先前的所有梯度都同等对待。
3.2.3 learning rate scheduling
learning rate scheduling可以防止最后阶段的振荡。分为learning rate decay和warm up。
warm up在很多知名network有用到,是个黑科技,比如:
- Residual Network
- Transformer
Warm up的作用有点像收集信息,就是在前面阶段需要收集足够多的信息,然后再来进行学习,才能学的更好。
关于Warm up的更多内容可以查看RAdam
3.3 Adam优化
我们现在最常用的Adam优化就是,基于RMSProp和Momentum的。论文:Adam: A Method for Stochastic Optimization
一般用Adam优化器,使用PyTorch预设的参数就可以。
可参见Adam的PyTorch官方文档。
3.4 小结
值得注意的momentum和root mean square的效果不会相互抵消掉。
4 简化error surface
目标:直接把山铲平,尝试把error surface变得简单。
4.1 损失函数Loss
4.1.1 分类问题classification
分类问题很多时候不可以简单当作回归问题的指标来体现。
一般会把class进行独热编码(one-hot vector)。
如果是一个向量化的输入,则一般来说是下面这样的。
输出往往需要加一个
s
o
f
t
m
a
x
softmax
softmax,简单地解释就是希望
y
y
y里头的值更靠近0,1。
softmax的运作如下图所示:
如果是二分类问题一般就不用
s
o
f
t
m
a
x
softmax
softmax,就用
s
i
g
m
o
i
d
sigmoid
sigmoid了,他们是同一件事情。
4.1.2 Loss function
我们常见的可能是MSE,但是还有一种更常用的是交叉熵 Cross-entropy。
L
(
y
^
,
y
)
=
(
y
log
y
^
+
(
1
−
y
)
log
(
1
−
y
^
)
)
L (\hat y,y)= (y\log {\hat y} + (1-y)\log(1-\hat y ))
L(y^,y)=(ylogy^+(1−y)log(1−y^))
下面介绍Cross-entropy在求解优化上有什么优点。从下图可以看到MSE很容易train不太起来(当然用Adam还是有机会),但是Cross-entropy就很好求解。
Cross-entropy常用到什么地步呢?在PyTorch里头,
s
o
f
t
m
a
x
softmax
softmax内嵌到Cross-entropy里头了,只要你用Cross-entropy,就会自动在你的网络最后一层加上
s
o
f
t
m
a
x
softmax
softmax。
可参见PyTorch官方文档,其中提及
This criterion combines
LogSoftmax
andNLLLoss
in one single class.
4.2 批次标准化 batch normalization
4.2.1 batch normalization的目的
常见的landscape是convex碗状的,而且可能几个变量间差别很大,常需要用Adam等进阶的优化方法来求解。
如果能够把变量间的差别拉平,那就能够简化error space 的 landscape。
一种方法是进行特征标准化(feature normalization)。
事实上,在深度学习中,除了
x
x
x,
z
z
z或
a
a
a也同样还是需要normalization。那么到底在activation function前做normalization,还是activation function后做normalization呢,在实战中似乎差别不大。
z
z
z的标准化如下:
这里有一个比较特别的地方,就是
z
z
z的标准化,受到案例的影响,所以这是一个非常巨大的network。
4.2.2 batch normalization
因为一下子处理所有的数据显得有些不太可能,所以我们会分批次处理数据,都进行标准化。这就是batch normalizaiton。
还要加入
β
\beta
β,
γ
\gamma
γ两个参数,防止平均值一直是0(?),调整一下输出的分布。这两个参数是需要学出来的。
一般来说
β
\beta
β的初始值都是1,
γ
\gamma
γ的初始值都是0,这样保证在网络训练的最初,error surface是比较平均分布的;到了训练后期可能会有变化,但是已经学得了足够多的信息。
(所以
β
\beta
β,
γ
\gamma
γ两个参数是怎么更新的呢?)
在testing中,batch normalization是有点问题的,因为
μ
\mu
μ和
σ
\sigma
σ需要根据batch来计算。
PyTorch在这里内置了一个解决方法,就是在训练的过程中会把
μ
\mu
μ和
σ
\sigma
σ存储下来,给testing使用。
可以看一下原论文。
可以看到batch normalization可以应对复杂的问题,并且训练速度更快。
除了batch normalization还有一些其他的简化error space的方法,以及其他的一些normalization的方法。