吴恩达deep learning ai 笔记总结(2-1) 改善深层神经网络-深度学习的实践方面


已经学习了如何建立一个神经网络,或者浅层的,或者深度的。而这第二门课,着重讨论和研究如何优化神经网络模型,例如调整超参数,提高算法运行速度等等。

本篇介绍如何建立一个实用的深度学习神经网络。包括Train/Dev/Test sets的比例选择,Bias和Variance的概念和区别:Bias对应欠拟合,Variance对应过拟合。接着,我们介绍了防止过拟合的两种方法:L2 regularization和Dropout。然后,介绍了如何进行规范化输入,以加快梯度下降速度和精度。然后,我们介绍了梯度消失和梯度爆炸的概念和危害,并提出了如何使用梯度初始化来降低这种风险。最后,我们介绍了梯度检查,来验证梯度下降算法是否正确。

改善深层神经网络-深度学习的实践方面

训练、验证、测试集

对于一个需要解决的问题的样本数据,在建立模型的过程中,我们会将问题的data划分为以下几个部分:

  • 训练集(train set):用训练集对算法或模型进行训练过程;
  • 验证集(development set):利用验证集或者又称为简单交叉验证集(hold-out cross validation set)进行交叉验证,选择出最好的模型;
  • 测试集(test set):最后利用测试集对模型进行测试,获取模型运行的无偏估计。

选择最佳的训练集(Training sets)、验证集(Development sets)、测试集(Test sets)对神经网络的性能影响非常重要。
除此之外,在构建一个神经网络的时候,我们需要设置许多参数,例如神经网络的层数、每个隐藏层包含的神经元个数、学习因子(学习速率)、激活函数的选择等等。
实际上很难在第一次设置的时候就选择到这些最佳的参数,而是需要通过不断地迭代更新来获得。
这个循环迭代的过程是这样的:

  • 先有个Idea,先选择初始的参数值,构建神经网络模型结构;
  • 然后通过代码Code的形式,实现这个神经网络;
  • 最后,通过实验Experiment验证这些参数对应的神经网络的表现性能。

根据验证结果,我们对参数进行适当的调整优化,再进行下一次的Idea->Code->Experiment循环。
通过很多次的循环,不断调整参数,选定最佳的参数值,从而让神经网络性能最优化。

在这里插入图片描述
Train sets,Test sets和Dev sets的数量比例
在样本数量不是很大的情况下,例如100,1000,10000,

  • 无验证集的情况:70% / 30%;
  • 有验证集的情况:60% / 20% / 20%;

但是在如今的大数据时代,对于一个问题,我们拥有的data的数量可能是百万级别的,所以验证集和测试集所占的比重会趋向于变得更小。

验证集的目的是为了验证不同的算法哪种更加有效,所以验证集只要足够大能够验证大约2-10种算法哪种更好就足够了,不需要使用20%的数据作为验证集。如百万数据中抽取1万的数据作为验证集就可以了。

  • 100万数据量:98% / 1% / 1%;
  • 超百万数据量:99.5% / 0.25% / 0.25%(或者99.5% / 0.4% / 0.1%)

偏差、方差

偏差(Bias)和方差(Variance)是机器学习领域非常重要的两个概念和需要解决的问题。
在传统的机器学习算法中,Bias和Variance是对立的,分别对应着欠拟合(underfitting)和过拟合(overfitting),我们常常需要在Bias和Variance之间进行权衡。
而在深度学习中,我们可以同时减小Bias和Variance,构建最佳神经网络模型。

如下图所示,显示了二维平面上,high bias,just right,high variance的例子。
high bias对应着欠拟合,而high variance对应着过拟合。

在这里插入图片描述
欠拟合说明模型简单,情况单一;
过拟合说明模型复杂,情况分散;

通过两个数值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,是最好的情况。

机器学习的基础

在训练机器学习模型的过程中,是要解决High bias 和High variance 的过程,也就是避免上述情况发生。
避免High bias

  • 增加网络结构,如增加隐藏层数目,神经元个数;
  • 训练时间延长;
  • 选择其它更复杂的NN模型;

避免High variance

  • 增加训练样本数据;
  • 进行正则化Regularization;
  • 选择其它更复杂的NN模型;

这里有几点需要注意的。
第一,解决high bias和high variance的方法是不同的。实际应用中通过Train set error和Dev set error判断是否出现了high bias或者high variance,然后再选择针对性的方法解决问题。

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

正则化(Regularization)

利用正则化来解决High variance 的问题,正则化是在 Cost function 中加入一项正则化项,惩罚模型的复杂度。虽然扩大训练样本数量也是减小high variance的一种方法,但是通常获得更多训练样本的成本太高,比较困难。所以,更可行有效的办法就是使用regularization。

Logistic regression
加入正则化项的代价函数:
在这里插入图片描述
上式为逻辑回归的L2正则化。
在这里插入图片描述
这里有个问题:为什么只对w进行正则化而不对b进行正则化呢?其实也可以对b进行正则化。但是一般w的维度很大,而b只是一个常数。相比较来说,参数很大程度上由w决定,改变b值对整体模型影响较小。所以,一般为了简便,就忽略对b的正则化了。
与L2 regularization相比,L1 regularization得到的w更加稀疏,即很多w为零值。其优点是节约存储空间,因为大部分w为0。然而,实际上L1 regularization在解决high variance方面比L2 regularization并不更具优势。而且,L1的在微分求导方面比较复杂。所以,一般L2 regularization更加常用。

Neural network

加入正则化项的代价函数:
在这里插入图片描述
L2 regularization也被称做权重衰减(weight decay)。
在加入正则化项后,梯度变为:
在这里插入图片描述
代入可得:
在这里插入图片描述
为什么正则化可以减小过拟合

加入正则化项,直观上理解,正则化因子λ设置的足够大的情况下,为了使代价函数最小化,权重矩阵WW就会被设置为接近于0的值。则相当于消除了很多神经元的影响,那么大的神经网络就会变成一个较小的网络。
当然上面这种解释是一种直观上的理解,但是实际上隐藏层的神经元依然存在,但是他们的影响变小了,便不会导致过拟合。

Dropout 正则化

除了L2 regularization之外,还有另外一种防止过拟合的有效方法:Dropout(随机失活)。
Dropout是指在深度学习网络的训练过程中,对于每层的神经元,按照一定的概率将其暂时从网络中丢弃。也就是说,每次训练时,每一层都有部分神经元不工作,起到简化复杂网络模型的效果,从而避免发生过拟合。
使用dropout训练结束后,在测试和实际应用模型时,不需要进行dropout和随机删减神经元,因为那样会使得预测结果变得随机,所有的神经元都在工作。

为什么dropout能够有效防止过拟合
优点
对于某个神经元来说,某次训练时,它的某些输入在dropout的作用被过滤了。而在下一次训练时,又有不同的某些输入被过滤。经过多次训练后,某些输入被过滤,某些输入被保留。这样,该神经元就不会受某个输入非常大的影响,影响被均匀化了。也就是说,对应的权重w不会很大。这从从效果上来说,与L2 regularization是类似的,都是对权重w进行“惩罚”,减小了w的值。
对于同一组训练数据,利用不同的神经网络训练之后,求其输出的平均值可以减少overfitting。Dropout就是利用这个原理,每次丢掉一定数量的隐藏层神经元,相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其他的神经元(指层与层之间相连接的神经元)。

缺点
dropout的一大缺点就是其使得 Cost function不能再被明确的定义,以为每次迭代都会随机消除一些神经元结点,所以我们无法绘制出每次迭代J(W,b)下降的图

其他正则化方法

除了L2 regularization和dropout regularization之外,还有其它减少过拟合的方法。

  • 数据扩增(Data augmentation):通过图片的一些变换,得到更多的训练集和验证集
    因为获得额外的训练样本成本较高,所以对已有的训练样本进行一些处理来“制造”出更多的样本,称为data augmentation。例如图片识别问题中,可以对已有的图片进行水平翻转、垂直翻转、任意角度旋转、缩放或扩大等等。虽然这些是基于原有样本的,但是对增大训练样本数量还是有很有帮助的,不需要增加额外成本,却能起到防止过拟合的效果。

  • Early stopping:在交叉验证集的误差上升之前的点停止迭代,避免过拟合。这种方法的缺点是无法同时解决bias和variance之间的最优。

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

然而,Early stopping有其自身缺点。通常来说,机器学习训练模型有两个目标:一是优化cost function,尽量减小J;二是防止过拟合。这两个目标彼此对立的,即减小J的同时可能会造成过拟合,反之亦然。我们把这二者之间的关系称为正交化orthogonalization。在深度学习中,我们可以同时减小Bias和Variance,构建最佳神经网络模型。但是,Early stopping的做法通过减少得带训练次数来防止过拟合,这样J就不会足够小。

与early stopping相比,L2 regularization可以实现“分而治之”的效果:迭代训练足够多,减小J,而且也能有效防止过拟合。而L2 regularization的缺点之一是最优的正则化参数λ的选择比较复杂。对这一点来说,early stopping比较简单。总的来说,L2 regularization更加常用一些。

标准化输入

在训练神经网络时,标准化输入可以提高训练的速度。标准化输入就是对训练数据集进行归一化的操作。

对数据集特征x1,x2归一化的过程:

在这里插入图片描述

  • 计算每个特征所有样本数据的均值:
    在这里插入图片描述
  • 减去均值得到对称的分布:
    -
  • 归一化方差:
    在这里插入图片描述
    为什么要对输入进行标准化操作
    在这里插入图片描述
    由图可以看出不使用归一化和使用归一化前后Cost function 的函数形状会有很大的区别。之所以要对输入进行标准化操作,主要是为了让所有输入归一化同样的尺度上,方便进行梯度下降算法时能够更快更准确地找到全局最优解。

梯度消失与梯度爆炸

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

利用初始化缓解梯度消失和爆炸问题

当输入的数量n较大时,我们希望每个wi的值都小一些,这样它们的和得到的z也较小。
如果激活函数的输入x近似设置成均值为0,标准方差1的情况,输出z也会调整到相似的范围内。虽然没有解决梯度消失和爆炸的问题,但其在一定程度上确实减缓了梯度消失和爆炸的速度。

不同激活函数的 Xavier initialization:
在这里插入图片描述

发布了45 篇原创文章 · 获赞 4 · 访问量 2518

猜你喜欢

转载自blog.csdn.net/keke_Memory/article/details/102762285