章二 优化深度学习 第1节 深度学习的实用层面

第一节 深度学习的实用层面

1.1 训练/开发/测试集

训练集(Training sets)、验证集(Development sets)、测试集(Test sets)的优劣对神经网络的性能有非常重要的影响。

训练过程

此外,构建神经网络时,还需要设置许多参数,例如神经网络的层数、每个隐藏层包含的神经元个数、学习因子(学习速率)、激活函数的选择等等。我们很难一开始就选择最佳的参数,需要通过不断地迭代更新来获得。

循环迭代的过程如下:先有个想法Idea,选择初始的参数值,构建神经网络模型结构;然后通过代码Code的形式,实现这个神经网络;最后,通过实验Experiment验证这些参数对应的神经网络的表现性能。根据验证结果,对参数进行适当的调整优化,再进行下一次的Idea->Code->Experiment循环。通过很多次的循环,不断调整参数,选定最佳的参数值,从而让神经网络性能最优化。

样本比例

一般将所有的样本数据分成三个部分:Train/Dev/Test sets(训练集,(简单交叉)验证集,测试集) 。Train sets用来训练算法模型Dev sets用来验证不同算法的表现情况,从中选择最好的算法模型;Test sets用来测试最好算法的实际表现,作为该算法的无偏估计。

最常见的方法是将所有数据三七分,即设置Train sets和Test sets的数量比例为70%和30%。如果有Dev sets,则设置比例为60%、20%、20%,分别对应Train/Dev/Test sets。

但是如果数据量很大的时候,比如百万级的数据,这种比例分配就不太合适了。科学的做法是要将Dev sets和Test sets的比例设置得很低。因为Dev sets的目标是用来比较验证不同算法的优劣,从而选择更好的算法模型就行了。对于100万的样本,往往只需要10000个样本来做验证就够了。Test sets也是一样,目标是测试已选算法的实际表现,无偏估计。对于100万的样本,往往也只需要10000个样本就够了。对于大数据样本,Train/Dev/Test sets的比例通常可以设置为98%/1%/1%,或者99.5%/0.25%/0.25%或者99.5%/0.4%/0.1%

分布问题

现代深度学习还有个重要的问题就是训练样本和测试样本分布上不匹配,意思是训练样本和测试样本来自于不同的分布。我们需要尽量保证Dev sets和Test sets来自于同一分布。通常我们可以对现有的训练样本做翻转、假如随机噪声等操作,来扩大训练样本的数量,从而让该模型更加强大。即使Train sets和Dev/Test sets不来自同一分布,使用这些技巧也能提高模型性能。

如果没有Test sets也是没有问题的。Test sets的目标主要是进行无偏估计。如果不需要无偏估计,可以不设置测试集。我们可以通过Train sets训练不同的算法模型,在Dev sets上进行验证,根据结果选择最好的算法模型,不再进行无偏估计。如果只有Train sets和Dev sets,有人会把这里的Dev sets称为Test sets。

1.2 偏差/方差

偏差(Bias)和方差(Variance)是机器学习领域非常重要的两个概念和需要解决的问题。

Bias和Variance是对立的,分别对应着欠拟合和过拟合,我们常常需要在Bias和Variance之间进行权衡。而在深度学习中,我们可以同时减小Bias和Variance,构建最佳神经网络模型。

Untitled

理解

通过两个数值Train set error(训练集误差)和Dev set error(验证集误差)来理解bias和variance。

假设Train set error为1%,而Dev set error为11%,即该算法模型对训练样本的识别很好,但是对验证集的识别却不太好。这说明了该模型对训练样本可能存在过拟合,模型泛化能力不强,导致验证集识别率低。这恰恰是high variance的表现。假设Train set error为15%,而Dev set error为16%,虽然二者error接近,即该算法模型对训练样本和验证集的识别都不是太好。这说明了该模型对训练样本存在欠拟合。这恰恰是high bias的表现。假设Train set error为15%,而Dev set error为30%,说明了该模型既存在high bias也存在high variance(深度学习中最坏的情况)。再假设Train set error为0.5%,而Dev set error为1%,即low bias和low variance,是最好的情况

一般来说,Train set error体现了是否出现bias,Dev set error体现了是否出现variance(正确地说,应该是Dev set error与Train set error的相对差值)。

Untitled

模型既存在high bias也存在high variance,可以理解成某段区域是欠拟合的,某段区域是过拟合的。

1.3 机器学习基础

机器学习要避免出现high bias和high variance。

减少high bias的方法通常是增加神经网络的隐藏层个数、神经元个数,训练时间延长,选择其它更复杂的NN模型等。在base error不高的情况下,一般都能通过这些方式有效降低和避免high bias,至少在训练集上表现良好。

减少high variance的方法通常是增加训练样本数据进行正则化Regularization选择其他更复杂的NN模型等。

传统机器学习算法中,Bias和Variance通常是对立的,减小Bias会增加Variance,减小Variance会增加Bias。而在现在的深度学习中,通过使用更复杂的神经网络和海量的训练样本,一般能够同时有效减小Bias和Variance。这也是深度学习之所以如此强大的原因之一。

1.4 正则化

(感觉中心思想都是简化网络,使得拟合函数不会过于复杂,自然就不会过拟合)

如果出现了过拟合(high variance),可以采用正则化的方法来解决。减小high variance也可以采用扩大样本数的方法,但扩大训练集比较难,所以正则化更可行。

L1

Untitled

L2

Untitled

只对w进行正则化而不对b进行正则化的原因如下:一般w的维度很大,而b只是一个常数。相比较来说,参数很大程度上由w决定,改变b值对整体模型影响较小。所以,一般为了简便,就忽略对b的正则化了。

对比

L1 regularization比L2 regularization得到的w更加稀疏,即很多w为零值。其优点是节约存储空间,因为大部分w为0。

L1 regularization在解决high variance方面不如L2 regularization。而且,L1的在微分求导方面比较复杂。L2 regularization更加常用。

L1、L2 regularization中的 λ 就是正则化参数(超参数的一种)。

计算

Untitled

Untitled

L2 regularization也被称做weight decay。

Untitled

1.5 为什么正则化可以减少过拟合

为什么正则化能够有效避免high variance,防止过拟合呢?下面我们通过几个例子说明。

还是之前那张图,从左到右,分别表示了欠拟合,刚好拟合,过拟合三种情况。

Untitled

假如我们选择了非常复杂的神经网络模型,如上图左上角所示。在未使用正则化的情况下,我们得到的分类超平面可能是类似上图右侧的过拟合。

w近似0

如果使用L2 regularization,当λ很大时,w[l]≈0。w[l]近似为零,意味着该神经网络模型中的某些神经元实际的作用很小,可以忽略。从效果上来看,其实是将某些神经元给忽略掉了。这样原本过于复杂的神经网络模型就变得不那么复杂了,而变得非常简单化了。如下图所示,整个简化的神经网络模型变成了一个逻辑回归模型。问题就从high variance变成了high bias了。

因此,选择合适大小的λ值,就能够同时避免high bias和high variance,得到最佳模型。

另外一个直观的例子

Untitled

惩罚参数,也就是简化了网络,使得网络更简单。

1.6 Dropout正则化

除了L2 regularization之外,还有另外一种防止过拟合的有效方法:Dropout(随机失活)。

Dropout是指在深度学习网络的训练过程中,对于每层的神经元,按照一定的概率将其暂时从网络中丢弃。也就是说,每次训练时,每一层都有部分神经元不工作,起到简化复杂网络模型的效果,从而避免发生过拟合。

Untitled

方法

Dropout有不同的实现方法,接下来介绍一种常用的方法:Inverted dropout。假设对于第l层神经元,设定保留神经元比例概率keep_prob=0.8,即该层有20%的神经元停止工作。dl为dropout向量,设置dl为随机vector,其中80%的元素为1,20%的元素为0。在python中可以使用如下语句生成dropout vector:

dl = np.random.rand(al.shape[0],al.shape[1]) < keep_prob

然后,第l层经过dropout,随机删减20%的神经元,只保留80%的神经元,其输出为:

al = np.multiply(al,dl)

最后,还要对al进行scale up处理,即:

al /= keep_prob

scale up后,能够尽可能保持al的期望值相比之前没有大的变化。

也就是放大了一些,期望还是不变的。

1.7 理解Dropout

原理

Dropout通过每次迭代训练时,随机选择不同的神经元,相当于每次都在不同的神经网络上进行训练,能够防止过拟合。

除此之外,对于某个神经元来说,某次训练时,它的某些输入被删除了。而在下一次训练时,又有不同的某些输入被删除。经过多次训练后,某些输入被删除,某些输入被保留。这样,该神经元不会受某个特定输入非常大的影响,影响被均匀化了也就是说,每个输入对应的权重w不会很大。与L2 regularization类似,都是减小w。

Dropout每次丢掉一定数量的隐藏层神经元,相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其他的神经元(指层与层之间相连接的神经元),使神经网络更加能学习到与其他神经元之间的更加健壮robust的特征。

设置方法

不同隐藏层的dropout系数keep_prob可以不同。一般来说,神经元越多的隐藏层,keep_out可以设置得小一些.,例如0.5;神经元越少的隐藏层,keep_out可以设置的一些,例如0.7,如果不担心过拟合问题,可以设置为1。另外,实际应用中,不建议对输入层进行dropout,如果输入层维度很大,例如图片,那么可以设置dropout,但keep_out应设置的大一些,例如0.8,0.9。

总体来说,就是越容易出现overfitting的隐藏层,其keep_prob就设置的相对小一些。没有准确固定的做法,通常可以根据validation进行选择。

Dropout在电脑视觉CV领域应用比较广泛,因为输入层维度较大,而且没有足够多的样本数量。值得注意的是dropout是一种regularization技巧,用来防止过拟合的,最好只在需要regularization的时候使用dropout。

Debug

使用dropout的时候,可以通过绘制cost function来进行debug,看看dropout是否正确执行。一般做法是,将所有层的keep_prob全设置为1,再绘制cost function,即涵盖所有神经元,看J是否单调下降。下一次迭代训练时,再将keep_prob设置为其它值。

1.8 其他正则化方法

data augmentation

一种方法是增加训练样本数量。但是通常成本较高难以获得额外的训练样本。但是,我们可以对已有的训练样本进行一些处理来“制造”出更多的样本,称为data augmentation。例如图片识别问题中,可以对已有的图片进行水平翻转(训练集可以增大一倍)、垂直翻转、任意角度旋转、缩放或扩大、旋转缩放裁剪等等。在光学字符识别中,也可以将原有的数字图片进行任意旋转或者扭曲,或者增加一些noise。 通过人工合成数据的话,需要通过算法验证原图的含义没有变(例如经过水平翻转猫还是猫)

early stopping

还有另外一种防止过拟合的方法:early stopping。一个神经网络模型随着迭代训练次数增加,train set error和代价函数J一般是单调减小的,而dev set error 先减小,之后又增大。也就是说训练次数过多时,模型会对训练样本拟合的越来越好,但是对验证集拟合效果逐渐变差,即发生了过拟合。因此,迭代训练次数不是越多越好,可以通过train set error和dev set error随着迭代次数的变化趋势,选择合适的迭代次数,即early stopping。

总结

机器学习训练模型有两个目标:一是优化cost function,尽量减小代价函数J;二是防止过拟合(减小方差)

L2 regularization的缺点之一是最优的正则化参数λ的选择比较复杂,需要尝试许多不同的值。early stopping比较简单,只需要运行一次梯度下降,就可以找出w的较小值,中间值和较大值,无需尝试那么多次。但L2 regularization还是更常用一些。

1.9 正则化输入

训练神经网络时,标准化输入能够加速神经网络训练。标准化输入就是对训练数据集进行归一化的操作,即将原始数据减去其均值后,再除以其方差。

Untitled

由于训练集进行了标准化处理,那么测试集或在实际应用时,应该使用同样的和对其进行标准化处理。保证训练集和测试集的标准化操作一致。

之所以要对输入进行标准化操作,主要是为了让所有输入归一化同样的尺度上,方便进行梯度下降算法时能够更快更准确地找到全局最优解。假如输入特征是二维的,且x1的范围是[1,1000],x2的范围是[0,1]。如果不进行标准化处理,x1与x2之间分布极不平衡,训练得到的w1和w2也会在数量级上差别很大。这样导致的结果是cost function与w和b的关系可能是一个非常细长的椭圆形碗。对其进行梯度下降算法时,由于w1和w2数值差异很大,只能选择很小的学习因子αα,来避免J发生振荡。一旦α较大,必然发生振荡,J不再单调下降。如下左图所示。

Untitled

1.10 梯度消失与梯度爆炸

梯度消失和梯度爆炸是指当训练一个层数非常多的神经网络时,计算得到的梯度可能非常小或非常大,甚至是指数级别的减小或增大。这样会让训练过程变得非常困难。

Untitled

1.11 神经网络的权重初始化

改善梯度爆炸或梯度消失问题(不能彻底解决),可以通过权重初始化的方式。

Untitled

Untitled

1.12 梯度的数值逼近

(下面两块内容之前都没有考虑过,而且这个似乎只要包没有问题,那就没有必要检查了把)

Back Propagation神经网络有一项重要的测试是梯度检查。其目的是检查验证反向传播过程中梯度下降算法是否正确。下面是近似求出梯度的方法:

Untitled

1.13 梯度检验

利用损失函数计算的梯度和反向传播之后参数变化曲线计算的梯度进行比较

Untitled

Untitled

Untitled

1.14 关于梯度检验实验的注记

在进行梯度检查的过程中有几点需要注意的地方:

Untitled