深度学习与神经网络-吴恩达(Part2Week1)-神经网络的实用层面

来源:互联网 发布:易酷cms包含漏洞维护 编辑:程序博客网 时间:2024/06/08 08:22

一,神经网络的实用层面

1.1 训练/开发/测试集

超参数是与深度神经网络结构相关但我们事先无法确定的经验参数,包括层数,神经元数目,学习效率等,超参数的选择决定我们模型的性能,因此我们希望通过实验来确定这些参数,深度学习是一个高度迭代的过程。



通常将数据集划分为三个部分,即训练集,验证集及测试集。通过训练集进行模型的训练,通过验证集或简单交叉验证集选择最好的模型,最后将模型在测试数据上进行评估。对于传统机器学习而言,由于所获得的数据集较小,一些经验做法可以将数据集按70%训练集,30%测试集划分,或者60%训练集,20%验证集,20%测试集比例划分。但在大数据时代,一般我们所获得的数据都是海量数据(百万级别),那么验证集、测试集的比例会相应变小,一般训练集会占到98%左右。例如:一百万的原始数据,我们选择一万条数据(1%)作为测试集进行模型评估就绰绰有余。
另外值得注意的是,训练集和验证集(或测试集)应该来自同一分布。例如,对于猫识别的问题,训练集来自于网络上相当高清的图片,而验证或者测试集则是用户随意拍的照片(分辨率较低),这两者就是不匹配的。
最后一点,如果实际过程中并不需要进行无偏估计(模型对数据的拟合性能估计),那么没有测试集也是可行的,这样条件下的验证集也就称为测试集。

1.2 偏差/方差

这两个概念在机器学习里是很容易混淆的,让我们看一个例子来加深对偏差和方差的理解。



上图中我们希望找到一个分界面将红叉和圆形能够分开,这里的分界面即对应我们的模型。对于最左边的图,我们可以看到只有一个接近线性的分界面,训练集中大部分红叉和圆形不能得以彻底分开,模型对训练数据的拟合程度不好,一般称之为过拟合。再来看看最右边的图,这是一个相当复杂的界面,界面将两类图形能够完全分开,对于训练数据能够完美拟合,这种在训练集看似很好的分界面实际上并不是最优的,其结构过于复杂,在测试集上一般表现并不好,这类情况一般称之为过拟合。而我们所期望的其实是复杂度、拟合度都适中的模型,这样的模型往往在新的测试集上表现更好,如中间图所示。
上面例子中,如果模型对训练数据拟合不够,则会存在较大的训练集误差和验证误差,称之为高偏差;例如,训练误差为15%,但验证误差为16%;如果模型对训练集过度拟合,训练集误差往往特别小,但验证集误差会较大,对于这种情况我们称之为高方差;例如训练误差为1%,但验证误差为11%。如果训练误差较高,验证误差更高,对于这种情况,我们称之为高偏差、高方差;例如,训练误差15%,验证误差30%。如果训练误差和验证误差都比较小,例如训练误差0.5%,验证误差1%,那么称之为低偏差、低方差,这也是我们所期待的优质分类器模型。

1.3 机器学习基础

初始模型训练完成后,我们对模型的偏差会有一定了解。如果偏差过高,甚至无法拟合训练数据,那么我们可以尝试新的神经网络结构,比如改变隐层数或者神经单元数(通常网络足够大可以很好的拟合训练数据),或者花更多时间来训练,尝试新的优化方法等。一旦偏差降到可以接受的范围,那么我们就需要用验证集来评估方差。如果方差过高,那么我们可以采用更多的数据来训练,如果训练数据暂时无法扩充,那么可以通过正则化来避免过拟合,或者反复尝试新的网络结构,有可能一箭双雕哦!

1.4 正则化

对于已经过拟合的神经网络,在无法获得更多数据的情况下,所能采取的最有效的手段就是正则化,下面以最简单的Logistic Regression为例来进行说明。

对于多层的神经网络,对应的成本函数如下:



通过正则化之后便得到我们新的目标函数(一般越来越倾向于应用L2正则化),那摆在前面的难题当然是如何利用梯度下降法最小化成本函数(Cost Function),也就是如何推导反馈传播(Back Propagation)的梯度项(回想下推导过程),这里直接给出最后的参数梯度项及参数迭代更新公式:

那么正则化为什么可以减少过拟合了,一个直观的理解是如果labda取值过大,也就是成本函数中后一项较大,那么优化算法就会尽量使后一项变小(因为优化的目标就是使成本函数最小化),如果达到一定极限的话,优化算法最终会将后一项(参数项)尽量置零,这是神经网络结构中大多数神经元实际上是不起作用的,从另一个角度来说就是网络结构便简单了。接下来给出更严格一点的证明,首先我们来观察下我们的激活函数,以tanh双曲函数为例:

如果λ取值较大,那么W^l 在优化过程中会变小,由于在神经网络的正向传播中,Z^l 随着W^l单调变化,因此Z^l也会变小。最终Z^l会集中在中间括号这个区域,而我们观察到在这个区域激活函数是接近线性的,这会导致几乎每层都是线性的,那么整个网络就是一个线性网络,即使非常深的深层网络,因为只有线性激活单元,也只能计算线性函数。


1.5 dropout正则化

除了经典的正则化方法,还有一种在深度学习中应用得比较多的正则化方法-dropout正则化(也称“随机消失”)。dropout会遍历左边神经网络的每一层,并设置消除神经网络中节点的概率。假设每层神经网络的每个节点都以抛硬币的方式设置概率,每个节点得以保存和消除的概率都是0.5,设置完节点概率我们会消除一些节点,然后删除该节点进出的连线,进而得到右图比较精简的神经网络。
下面以一个3层的神经网络来详细介绍dropout在某一层的处理方式,首先定义向量d3,其表示一个三层的dropout向量,向量大小和输入数据a3一样,d3=np.random.rand(a3.shape[0],a3.shape[1]),然后将d3中的值与keep-prob(我们事先设定的概率值,表示保留某个节点的概率)进行比较d3<keep-prob,如果该值小于keep-prob,则将该值置换为1,否则,置换为0,。



1.6 其他正则化方法

1.数据扩增:对于图片数据,可以对已有的训练集图片进行水平饭转、随机裁剪、扭曲等处理来获得新的训练集,虽然效果不如全新的训练集扩充,但是在一定程度上还有是改良效果。



2.early-stopping:在梯度训练的过程中,观察成本函数随迭代次数的单调变换是一个评价训练效果的指标,但一般迭代次数是我们认为确定的,训练得到的模型并不一定最优。我们还可以引入训练集分类误差或者损失函数和对数损失随迭代次数的变化作为评价标准,一般,训练集成本函数随迭代次数单调递减,但验证集分类误差起先随着迭代次数递减,随后会随着迭代次数递增,我们可以选择这个拐点作为迭代终止点。


1.7 正则化输入-加速训练过程

由于我们的输入数据每个维度特征的取值可能相差很大,例如x1取值在0-1之间,x2取值在0-1000之间,这就导致其成本函数整体呈现窄而细长的形态(如下图左部分所示),学习效率取值必须取得较小,因为如果学习效率过大,极可能会导致梯度下降的方向错误,进而降低训练的效率,归一化之后,其成本函数整体呈现均匀而圆的形态(如下图右部分所示),梯度过大不会影响最终的优化效果,优化效率得以提升。



训练集归一化包括两步。第一步,零均值化;第二步,归一化方差,具体计算公式如下图所示。值得注意的是测试集和训练集应该采用同样的均值和方差进行归一化,保证对两部分数据的处理是一致的。





1.8 深度神经网络存在的主要问题

1.8.1 梯度消失与梯度爆炸

在深度神经网络中,梯度消失与梯度消失是一个无法避免的问题,然后给我们首先来分析产生这两种现象的原因。以下图所示的深度神经网络为例,假设激活函数为relu(g(z)=z),神经元偏置b(l)=0,根据神经网络的正向传播,我们可以得到如下推导:





我们可以看到,正向传播的最终结果是一个每层权重参数矩阵乘的形式,如果初始化的权重w(l)比1大,为1.5(即权重w(l)是单位矩阵的1.5倍),所以激活函数的值将以指数增长,那么np.power(w(l),L-1)将会是一个很大的值,这时就会造成梯度爆炸。相反的,如果权重w(l)比1小,为0.5(即权重w(l)是单位矩阵的0.5倍),所以激活函数的值将以指数下降那么np.power(w(l),L-1)将会是一个很小的值,这时就会造成梯度消失。

1.8.2 解决办法

想要解决梯度消失和梯度爆炸的问题,主要在于权重参数初始化,保证权重参数初始化可以随着输入数据的大小而调整,进而稳定权重参数的值,不至于过小或过大,下面是公式上的解释。









阅读全文
2 0
原创粉丝点击