北大旁听 - Optimizer、数据预处理、Normalization、正则化

优化器大家族以及Adam的问题、数据预处理、Normalization、正则化

1. Optimizer

Optimization Algorithms

这是一张大家都很熟悉的图了,优化器发展到现在,已经快到极限了。在平常的一些任务中,我们还是会使用最简单的SGD,只有在追求性能的时候才会去使用高级的优化器。

1.1 Optimizer Family

Optimizer Family

先说说各个优化器最大的优点及原理简单概括:

  • Momentum:动量,在梯度更新方向上加强正向梯度,削减反向梯度
  • Nesterov:预测动量变化,加强小幅调整,削减大幅调整,被证明在RNN中效果非常明显(Advances in Optimizing Recurrent Networks, ICASSP2013);
  • Adagrad:对不同参数采取不同的调整策略,加强稀疏数据对梯度的影响,削减频繁数据对梯度的影响,被证明对于训练数据分布不均匀的数据集非常有效(Glove: Global Vectors for Word Representation, CEMNLP2014)(老师在这里留了个坑,说会专门拿一节课出来讲数据分布不均衡时该怎么做;
  • Adadelta:在Adagrad中需要对所有历史梯度的平方和,导致后续梯度下降缓慢甚至停止。在其基础上添加了窗口的概念,仅对窗口内的梯度进行平方和计算;
  • RMSprop:Hinton在他的Coursera课程中提到,只是可以看做Adadelta的简化版本;
  • Adam-Adaptive Moment Estimation:自适应矩估计,也是一种不同参数自适应不同学习速率的方法,结合了动量的想法,其不使用历史平方衰减,衰减方式类似动量;
  • AdamMax:在Adam中,动量有可能特别的小,导致训练缓慢,此时用梯度代替,所以在更新策略中另vt=max(βvt, |gt|),其中右边的vt代表动量,gt代表梯度;
  • Nadam:一种Adam的加速方法,思路就是用上一次的动量对调整结果进行预估;

1.2 Adam的问题所在

文章出自:On the Convergence of Adam and Beyond, ICLR2018

最近,在Adam系列方法的应用中,研究者发现在某些情况下,Adam系列方法的效果并不好,甚至不如基于动量的SGD方法
这是由于在Adam系列方法中,通过求前序梯度的平均来调整学习率,如此一来,对于有些低频出现却能够提供较大权重调整信息的minibatches变得不公平,它们的影响被平均值“掩盖”了。

在之前的博客中提到,batch_size不是越大越好。所以,我认为这从另一方面证明了一件事情:当batch_size设置较小(例如16、32、64)的时候就不适合使用Adam优化器了,反而是SGD表现的更好。

基于此,该论文提出了新方法:AMSGrad,它的原理很简单:

AMSGrad

这样一来,当一个对提供较大权重调整信息的batch来说,就能够较好地保留自身梯度,而不被“掩盖”。

2. 数据预处理

(这里的数据预处理泛指机器学习中的预处理,而不是特指深度学习中图像预处理)

首先要说明的是,数据预处理对网络的性能没有太大的影响,只是提高训练效率,因为网络有足够的能力应对仿射变换

在图像、文本的处理中一般用不到预处理(当你的数据集没那么大,相差没那么多时)。

为什么需要进行初始化:消除量纲的差异、数据分布的差异带来的训练困难

归一化

由于梯度的方向总是沿着等高线的切线垂直方向,所以如果没有做归一化,数据分布就可能是个“椭圆”,梯度所指方向不是圆心,就会导致zigzagging的出现。

下面将介绍常见的数据预处理方法。

2.1 Feature Scaling

一个很简单的预处理方法,对样本某维度值的缩放,将数值范围归一化到[0, 1]或[-1, 1]之间:

Feature Scaling

2.2 z-score Normalization

一个比较常用的方法,将每一维特征都处理为符合标准正态分布的值(均值为0,方差为1):

Normalization

z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。该种标准化方式要求原始数据的分布可以近似为高斯分布,否则效果会变得很糟糕。
来源:CSDN:数据标准化/归一化normalization

2.3 Whitening

一句话概括白化的目的:去除输入数据的冗余信息

经过白化后的数据满足两个性质:

  • 特征之间相关性较低;
  • 所有特征具有相同的方差。

需要注意的是,白化后的数据可能会造成信息损失。举个例子,当不同维度的特征相关时,例如身体质量指数(BMI)和体重之间的关系,白化后就会造成信息的损失(数据的降维)。但白化对有些问题会十分有用。

而常用的白化算法就是PCA和ZCA。

2.3.1 PCA Whitening

Principal Components Analysis(PCA)主成分分析

它是一种能够极大提升无监督特征学习速度的数据降维算法。

假设使用图像来训练算法,因为图像中相邻像素高度相关,输入的数据是有一定冗余的。

而由于相邻像素间的相关性,PCA可以将输入的向量转换为一个维数低很多的近似向量,而且误差非常小。

一句话概括PCA算法:计算样本的特征向量和特征值,将特征值较大的特征向量保持下来,重新映射样本到保留下来的特征向量上,从而实现降维。(要注意的是,使用PCA算法前,每个维度要有相同的均值和方差)

下面拿图来说话:

PCA1
PCA2
PCA3
PCA4

那么问题来了,降维可以降到多少呢,如何确定k值呢?

k太大,则压缩率太低;k太小,则近似误差太大。所以在决定k时,通常考虑不同k值可保留的方差百分比。而整个方差百分比可以通过特征向量计算得到:

PCA5

以图像处理为例,通常取方差百分比大于0.99的最小的k。

做完了上述操作,特征之间的相关性就被消除了,但由于重新映射到不同的基上,各维度的方差又不相同了,我们可以直接使用一个缩放因子来缩放每个特征:

PCA6

2.3.2 ZCA Whitening

PCA白化的问题:由于重新映射,导致数据“旋转”了,而ZCA就是对PCA的结果进行还原旋转。算法很简单,直接使用上面的协方差矩阵再乘以PCA白化结果即可:

ZCA

所以当你只为了消除相关性,而不想降维的时候,再使用ZCA白化吧!

3. Normalization

Normalization

图片出自Group Normalizaiton。

3.1 Batch Normalization

这个2015年的算法我们再熟悉不过了,这里只提几点大家容易忽略的地方:

BN的原因:数据分布在训练过程中发生了偏移(Internal Covariate Shift),导致网络泛化能力下降;

反向传播计算(这里没太看懂,有时间的时候好好研究一下:

BN

BN2

批量归一化操作可以看作是一个特殊的神经层,加在每一层非线性激活函数之前

3.2 Layer Normalization

Layer Normalization

这是2016年的算法,算是比较新的,可能部分人没听过。它在RNN(循环神经网络)的表现非常好,而Batch Normalization在RNN中就无法使用。可以先直观地看一下它和BN的区别:

LN

LN在一些基于RNN/LSTM/GAN的表现中很好(例如NLP)。

3.3 Group Normalization

Group Normalization

这里老师上课没讲,是我加的,它是出自何恺明老师之手的ECCV2018 best paper。

BN最大的问题就是网络处在不同状态时的batch_size不一样,导致均值和方差的不一致性(inconsistency),举例来说,训练时batch_size是64,但测试时batch_size是1,这个时候只能用之前算好的均值和方差来近似了,问题就出在这。

至于GN的具体细节,各位可以自己上网搜,我还没深入了解。

可以直观的看到GN在不同的batch_size上的表现都非常优秀:

GN2

和LN和IN的对比:

There have been existing methods, such as Layer Normalization (LN) and Instance Normalization (IN)(Figure 2), that also avoid normalizing along the batch dimension. These methods are effective for training sequential models (RNN/LSTM [49, 22]) or generative models(GANs [15, 27]). But as we will show by experiments, both LN and IN have limited success in visual recognition, for which GN presents better results. Conversely, GN could be used in place of LN and IN and thus is applicable for sequential or generative models. This is beyond the focus of this paper, but it is suggestive for future research.

除了GAN、RNN、LSTM之外,至少在图像的大部分领域中,可以用LN代替BN了,尤其是在batch_size较小的时候。

4. 正则化

“奥卡姆剃刀”原则:在模型精度无明确不同的情况下,我们应该尽量选择尽可能简单的模型。

4.1 范数

只说一下1-范数:向量元素绝对值之和。

4.2 L2 Regularization

L2R
L2R2

4.3 L1 Regularization

L1R

L1在NLP上非常有用,通过L1正则化,可以让网络参数变的稀疏

L1R2
L1R3

4.4 Dropout

李戈老师差点写出dropout的论文……哈哈真的很厉害了。

Deep Learning: A Bayesian Perspective中,总结了Dropout有效的原因(这是一篇值得阅读的论文):

  • Dropout相当于使用多个网络进行训练,每做一次dropout,相当于从原始的网络中采样得到一个子网络;
  • 每次迭代都相当于训练一个不同的子网络,这些子网络共享原始网络的参数;
  • 最终的网络可以看作是集成了指数级个不同网络的组合模型。

除了Dropout其实还又dropconnect,在RNN中dropconnect更好些,在NLP中dropout更稳定(因为稀疏嘛)。

在input layer其实也能做dropout(大约0.2),这么做可以减少数据冗余,增加数据噪音。

在训练时,一部分神经元被丢弃,而在测试时,所有的神经元都可以激活。

5. 总结

在Optimizer中,我们遇到了Adam的问题(过于平均,抑制了部分minibatches对梯度的贡献)

在数据预处理中,我们遇到了可以去掉数据相关性的PCA白化。

在Normalization中,我们遇到了BN的问题(对小batch_size不友好),遇到了对RNN/LSTM/GAN友好的LN,遇到了解决BN问题的GN。

在正则化中,我们遇到了L1正则化在需要参数稀疏的任务(例如NLP)中的优势,和dropout的变体dropconnect。