类神经网络的训练
局部最小值与鞍点
-
背景:随着参数更新,
training loss
没有下降到足够小或者压根没有下降趋势。人们推测是走到的这些地方参数对loss
的微分为零时,梯度下降无法再updata参数。 -
gradient
为零的两种情况(统称为临界点)-
局部最小值:
local minima
,卡在此处,无路可走 -
鞍点:
saddle point
,卡在此处,有路可循
-
-
如何分析得出是卡在局部最小值还是卡在鞍点
-
泰勒多项式
简单理解就是损失函数的泰勒展开式和梯度(具有一次微分的项目)、海塞矩阵(具有二次微分的项目)有关。
-
当
gradient
为0时,我们可以根据点的分布来判断当前点的位置 -
可能情况
算出一个
Hession
,不需要将其和所有的v
相乘。只需要看这个Hession
的所有特征值都是整的,就代表这个条件成立。
-
-
卡在
saddle point
-
Hession
不仅可以判断当前卡住的位置是不是在saddle point
,还可以指出了参数可以更新的方向。 -
当
gradient
已经无法判断参数更新方向的时候
-
批次(Batch)与动量(Momentum)
-
利用
batch
进行优化- 当我们进行参数更新的时候,我们是将所有的
data
分为一个个的batch
。每次更新参数就会使用一笔batch
。所有的batch
都进行一遍叫做一个epoch
- 将资料分为
batch
的过程叫做Shuffle
,每次epoch
开始之前会切分一次batch
,所以每一个epoch
对应的batch
都不一样。
- 当我们进行参数更新的时候,我们是将所有的
-
为什么要使用
batch
-
进行
batch
和不进行batch
情况的比较- 左边不进行
batch
的情况冷却时间较长,但一步走的较为稳健(Powerful)。右边进行batch
的情况冷却时间较短,但每一步走的不稳定(Noisy)。 - 由于
GPU
可以进行并行运算的关系,所以batch size
可能对花费时间的影响非常小。
- 左边不进行
-
size
大小对Batch
的影响-
size
的大小越大,需要参数更新的次数就越小,可能batch size
大的batch
进行一个epoch
的时间更短。 - 综上所述,使用GPU进行并行运算时不进行
batch
不一定冷却时间比进行batch
花费时间长
-
-
小
Batch
与大Batch
的比较-
Noisy
的梯度下降反而可以帮助training
- 原因:如果是
full Batch
,在遇到local minimum
或者saddle point
的时候参数更新就会停止。而如果是Small Batch
,每一次使用的损失函数会有略微区别,使得遇到上述情况的时候可以继续进行下去。
-
除了可以帮助
training
,较小的batch
还可能可以帮助testing
。- 原因:当
Training Loss
和Testing Loss
之间有不匹配的地方,即两者的Loss
函数不同(选取的样本不一样)。这样在testing
的损失函数上,local minimum
较平缓的最小值点比较陡峭的最小值点在training
和testing
的差别更小。大的batch size
会让我们倾向于较为陡峭的最小值点,小的batch size
会让我们倾向于较为平缓的最小值点。 -
Batch size
是不得不去调整的超参数
- 原因:当
-
-
-
Momentum
-
背景:将Loss函数假象为真正的斜坡,参数想象成小球,在真实的物理世界中小球下降不一定会收到
saddle point
和local minimum
的阻拦。 -
一般的梯度下降
-
梯度下降加上动量
传统的梯度下降是向梯度的反方向移动参数。此时需要向梯度的反方向加上前一步移动的方向去移动参数。
-
updata
的方向不是考虑当前的梯度方向而是考虑过去所有的梯度总和
-
自动调整学习率(Learning Rate)
-
当Loss不再下降的时候,不一定卡在
Local minimum
和saddle minimum
,只是梯度确实无法继续下降了。 -
学习率产生的影响
- 当学习率较大时,梯度会来回震荡。当学习率较小时,梯度下降较慢,但在稍微平滑的地方就不再移动,无法到达
local minimum
。 - 需要客制化学习率
- 当学习率较大时,梯度会来回震荡。当学习率较小时,梯度下降较慢,但在稍微平滑的地方就不再移动,无法到达
-
改变梯度下降的公式,变为
Adagrad
,当坡度小的时候,学习率就增大。坡度大的时候,学习率减小。原因:梯度小,对应均方根小,对应的学习率就变大。 -
RMSProp
(动态调整学习率)- 可以*调整当前梯度的权重系数
- 目前最常用的优化策略(optimization)是
Adam: RMSProp + Momentum
-
使用
Adagrad
的表现:-
原因:在多个小均方根累积后会出现井喷式增长,但到梯度较大的地方又会返回。
-
解决方案:
Learning Rate Scheduling
,将学习率预设为与时间有关。-
Learning Rate Decay
:随着时间不断地进行,让学习率越来越小。 -
Warm Up
:让学习率先变大后变小。首先学习率较小,先收集有关均方根的数据,再让学习率爬升。
-
进一步了解
WarmUP
-
-
-
-
总结
分类与损失函数的影响
-
分类
-
分类标签标识的常见做法:将类别用
one-hot vector
表示。 -
output
如何输出成vector
形式 -
回归得到的
y
是数值型,而分类得到的y
是一个向量,向量通过softmax
得到最后的label
。softmax
就是将y
(可以取任何值)的值限定于范围0到1之间
-
softmax
的内部原理 -
分类问题损失函数的计算
maximizing likelihood = minimizing cross-entropy
最大似然估计和最小交叉熵是一件事
最小交叉熵比均方根更加适合用在分类问题上。
MSE
在Loss
较大的地方,梯度趋近于零,所以如果其初始位置在左上角,就很难通过梯度下降到达右下角。所以就算是损失函数的定义都可能影响training
的过程。
-
批次标准化(Batch Normalization)
-
背景:想要直接改变
error surface
的landscape
,需要将特征值限定于相同的范围内,使得training
过程更加容易。 -
Feature Normalization
-
做法:
-
针对深度学习:通过相应层数之后的数值也需要进行标准化,在激活函数之前做还是在激活函数之后都可以。
-
由于现在
x
决定z
,z
又决定a
,可谓牵一发而动全身,所以当前需要将所有经历了标准化的变量过程当作network
的一部分-
GPU
内存此时无法加载所有的data
,所以在实践的时候只会考虑一个batch
中的数据
-
-
下一步,
β
和γ
是另外被取出来的,是network
的参数。原因是z~
的平均值为0会对网络产生一些限制。
-