李宏毅《深度学习》笔记(五)
网络设计的技巧
? 对于梯度下降法会遇到各种不顺利的情况,比如经过梯度下降之后的损失函数仍然比较大,又比如梯度为零无法下降等。对于这些错误的特殊值,统称为临界值(Critical Point)。临界值可以有局部最低点(Local Minima)和鞍点(Saddle Point)。具体例子可以见下图。其中遇到saddle point会比local minima更容易解决,因为saddle point还有方向继续优化,而local minima似乎已经无路可走。
? 所以第一个问题是怎么判断Critical Point是saddle point 还是 local minima呢?可以运用泰勒展开式近似估计。将
L
(
θ
)
L(\theta)
L(θ)用
L
(
θ
′
)
L(\theta')
L(θ′)近似估计,展开如下: ? 对于Critical Point,
L
(
θ
′
)
L(\theta')
L(θ′)的梯度为0,可以暂时忽略,所以影响
L
(
θ
)
L(\theta)
L(θ)估值的只有最后一项
1
2
(
θ
?
θ
′
)
T
H
(
θ
?
θ
′
)
\frac{1}2(\theta-\theta')^TH(\theta-\theta')
21?(θ?θ′)TH(θ?θ′)。这一项可以用于判断Critical Point到底是哪一类。
见下图,如果最后一项(即红色部分)在
(
θ
?
θ
′
)
(\theta-\theta')
(θ?θ′)无论怎么取时都大于零,就有
L
(
θ
)
>
L
(
θ
′
)
L(\theta)>L(\theta')
L(θ)>L(θ′),说明
L
(
θ
)
L(\theta)
L(θ)是附近区域的最低点,即属于Local Minima的情况。反之如果红色都大于零,就有
L
(
θ
)
<
L
(
θ
′
)
L(\theta)<L(\theta')
L(θ)<L(θ′),说明
L
(
θ
)
L(\theta)
L(θ)是附近的最高见,即属于Local Max的情况。对于有一部分取值大于零,有一部分取值小于零,说明此时的Critical Point是Saddle Point。但是这种方法的不合理之处在于,我们要代入所有的v才能判断Critical Point的情况。
因此有一个更简便的办法,根据线性代数知识,我们只需要矩阵H所有的特征值(eigen values)大于零就能保证
v
T
H
v
v^THv
vTHv的取值都大于零,即属于Local Minima;反之矩阵H所有的特征值(eigen values)小于零就能保证
v
T
H
v
v^THv
vTHv的取值都小于零,即属于Local Max;如果特征值有正有负说明此时的Critical Point是Saddle Point。
这个矩阵H还能告诉我们梯度下降的方向。如下图,假设
λ
\lambda
λ<0是H的一个特征值,u是对应的特征向量,更新
θ
\theta
θ=
θ
′
+
u
\theta'+u
θ′+u即可。
? 注:虽然这个方法能帮我们脱离saddle point 但在实际应用中这种方法极少被使用。原因是在实际例子中计算二次微分矩阵H的特征值和特征向量,这个计算量很大。
? 了解完对Critical Point的解决方法之后,再来探讨是Saddle Point 和 Local Minima哪种情况出现的更多。
首先,第一步是了解随着维度的升高,梯度下降法会更容易找到到损失函数的最低点。这个很好理解,假设一维的直线上,中间有有一点断了不允许通过,这时候再一维上很难从左端点走到右端点,但是在二维平面上就能绕个弯过去。在二维平面上有阻碍时,我们可以在三维立体空间中绕过障碍到终点。同理,我们在三维上被local minima卡住时,在四维甚至更高维度就能走到全局的最低点,而在实际应用中我们的参数确实就是多维的,因此不容易遇到local minima的问题。
第二步是通过一个经验函数训练实例中了解,如下图。纵轴是训练集上的损失函数,横轴是Minimum Radio,定义式为
二
次
微
分
矩
阵
H
的
特
征
值
为
正
数
的
个
数
特
征
值
的
总
个
数
\frac{二次微分矩阵H的特征值为正数的个数}{特征值的总个数}
特征值的总个数二次微分矩阵H的特征值为正数的个数?,也可以理解为这个critical point是local minima的概率。从实例结果中可以发现,每次遇到的critical point的横轴值多为0.6以下,因此可以理解为很少有点是local minima。
Batch方法
? 在更新模型参数时,我们不再用所有的训练集数据来更新参数。而是把所有的数据先分为一个个组(Batch),然后用每个组轮流来更新参数,当把所有的Batch使用过一次后,成为完成一轮(epoch)。每完成1epoch后,需要进行重新分组即换一种Batch方案,这成为shuffle。
? 接下来还需要讨论为什么要使用Batch,然后讨论每个Batch的大小会有什么影响。
? 很显然,如果不分Batch就像上图左边一样看完左右的数据后再进行一次更新,如果分为Batch就会像上图右一样会更新多次,会给我们带来不一样的结果。于是开始探讨在不同的Batch会有什么效果。
首先要说明一个可能的误区:在一定范围内,并不是越大的Bacth所需要的时间就会越长,更不会长很多。原因就是随着计算机技术的发展,现在的GPU已经能够进行多种的平行运算,这就给大Batch节省了很多时间。正是由于这个原因,在一次计算时间差不多的前提下,Large Batch的更新次数少,所以需要的时间反而更短了。
对于Batch规格的差别比较在下图:
? 总结的来说,大Batch在完成1轮更新运算的速度更多,时间更短;而小Batch,虽然他的运算结果更加noisy,但是它在最优化求解和泛化能力上更有优势,即更可能找到Loss Function的最低值,并且小Batch更新计算得到的模型在测试集上有更好的表现。
Moment方法
? 简单理解moment方法就是希望寻找到一种“惯性”来改进梯度下降法,达到在遇到local minimal的情况时能够翻过前方的“障碍”,继续向下优化。对于这种方法的效果图如下:
? 对于一般的优化步骤效果图是找到上一次参数的梯度(gradient),沿这个gradient的反方向优化参数(因为学习率大于零)。每次都是按照这个方法不断更新。 ? 而在Moment方法中多考虑了上一次的移动方向。如上图所示,第一次的行动是
g
0
g^0
g0的反方向加上
m
0
m^0
m0的方向, 第二次的行动是梯度
g
1
g^1
g1的反方向加上上一次行动
m
1
m^1
m1的方向,以此类推。另一种解读是每一次的行动方向实际上是考虑了之前每一次的行动方向。 ? 关于Moment的实际效果在这张图上可以看出,小球翻过local minima之后,gradient的方向是向左往回走,而moment保留了上一次方向向右走,只要比例控制合适,就能离开local minima的区域继续向前走。
自适应学习率(Adaptive Learning Rate)
? 在神经网络训练过程中还有一个问题是,即使训练到损失函数不再下降的时候,却发现gradient不再减小,反而还有可能在变大。这时候的问题不是我们处在critical point,而是因为参数更新的步长过大,导致无法再让损失函数下降。
以下面这个这个训练为例子:
黄色的X是全局最低点,黑色的点是出发点。(实际上这个等高线是一个个椭圆,很扁很长的椭圆) ? 学习率取
1
0
?
2
10^{-2}
10?2时,学习的过程会上下震荡,无法到最低点,这是因为学习步长太大了无法先在纵轴上找到最底点。于是我们调小学习率,发现虽然能找到正确的方向了,但是仍然无法走到终点,因为学习的步长实在是太小了,向左移动的小小一段已经是更新了10万次的结果。因此我们需要的是参数能根据一定的条件实现自适应。
? 所以第一步是在思考希望参数如何变化。根据上面这个例子可以总结出两个条件:一是在坡度比较陡峭的方向(此例为纵轴)上学习率比较小;二是在坡度比较缓和的方向(此例为横轴)上学习率比较大。
所以在原有学习率的基础上,除以每次梯度的均方根。
需要说明的是这种方法的有效性,也通过例子来说明:
? 蓝色曲线更缓,此时它的梯度更小,即
σ
i
t
\sigma_i^t
σit?越小,使得步长越大;反之在更陡峭的绿色曲线中,梯度更大,
σ
i
t
\sigma_i^t
σit?越大,使得步长越小,因此可以满足条件。
? 但是这种解决办法的不足之处在于,即使在一个方向上也不是一直要求很大或很小的。
? 所以还要在原来的基础上,加入调节参数
α
\alpha
α,来控制第t次的梯度和之前梯度
g
i
g_i
gi?的权重,通过更加看重本次梯度值来缩小
σ
i
\sigma_i
σi?。
Learning Rate Scheduling
? 如图所示,Learning Rate Decay是想让学习率随着时间的增长而降低,因为我们认为越到后面,越接近最低值,应该减小步长,所以想学习率
η
t
\eta^t
ηt随时间减小。第二种方法是warm up,这种方法认为一开始应该要有较小的学习率先进行“适应”,然后再增大学习率,然后再减小。
分类(calssfication)
? 对于分类算法,我们可以使用向量化的方式规定每一类的取值。通过类似回归的方法,算出预测值向量在每个维度上的值。从而判断所属的类别。
? 上图就是回归和分类的过程比较,对于得到的预测值通过softmax来使y向量中的每个值都在0,1之间。
关于Softmax:
用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。假设我们有一个数组V,
V
i
V_i
Vi?表示V中的第i个元素,那么这个元素的softmax值就是
S
i
=
e
i
∑
j
e
j
S_i=\frac{e^i}{\sum_je^j}
Si?=∑j?ejei?
详细参考链接:https://www.cnblogs.com/alexanderkun/p/8098781.html
然后需要计算分类算法的损失函数(Loss of Classification)
如图所示,有两种Loss的计算方式,MSE和Cross-entropy。Cross-entropy的表达式和极大似然估计法的表达是等价的(极大似然法介绍https://zhuanlan.zhihu.com/p/96463015)。接下来的任务是要评估两者的优劣。
先指出,对于分类来说Cross-entropy的形式要优于MSE。图上的实例可以看出,Cross-entropy有更陡峭的等高线,在梯度下降法时,Cross-entropy更有可能找到最低点;而MSE可能在由于损失函数过于平稳,出现critical point的情况,无法下降。
还有一个发现,我们可以看出,对同一个算法,定义的Loss function不一样,得到的参数结果也不一样,梯度下降的过程和难度也不一样。
改进 Error Surface
? 从图形上看,要降低梯度下降的难度,可以优化Loss function的形状。最起码保证它不是椭圆形的,没有过于陡峭和缓和的导致同样的参数不适用所有情况,,所以我们要做的就是让所有的特征值(feature)有相同的取值范围。
第一个方法就是单位化,对所有
X
i
X_i
Xi?,对同一维度的取值都分别做单位化,就能保证所有特征的所有维度取值都在0,1之间。具体过程如下:
? 但即使对特征X做了单位化,由于
W
i
W^i
Wi的取值不同,计算得到的
Z
i
Z^i
Zi取值也会不同,所以可以继续对向量Z进行单位化。单位化方法和上述一样,注意向量没有除法,图中表达的是每个向量每个维度的值都分别如此计算。但如果对Z进行这种单位化之后,可以发现,
X
1
X^1
X1的变化会影响到
a
2
和
a
3
a^2和a3
a2和a3的取值,也就是说单位化之后,
Z
i
Z^i
Zi之间产生了关联性。
? 如果对数量巨大的训练集做这种network,工作量很大,通常是对一个Batch进行计算的,因此这种方法也称为Batch Normalization。
? 对于测试集,当手上的数据量不满一个Batch时,单位化的
μ
和
σ
\mu和\sigma
μ和σ可以来自训练集各个Batch的移动平均值。
|