改善深层神经网络

来源:互联网 发布:网络教育专科学校 编辑:程序博客网 时间:2024/05/16 16:13

训练、验证、测试集

神经网络有多少层
每层含有多少隐藏单元
学习率
激活函数

实际上 应用型机器学习是一个高度迭代的过程
一开始我们需要设定好配置信息,并运行代码,得到这些配置信息运行的结果。根据输出结果重新完善自己的想法,改变策略。或者为了找到跟好的神经网络不断迭代更新自己的方案。

因而,循环该过程的效率是决定项目进展速度的重要因素

一般把数据分为,训练集,简单交叉验证集或者验证集和测试集
这里介绍下三种数据集:
假设建立一个BP神经网络,对于隐含层的节点数目,我们并没有很好的方法去确定。此时,一般将节点数设定为某一具体的值,通过训练集训练出相应的参数后,再由交叉验证集去检测该模型的误差;然后再改变节点数,重复上述过程,直到交叉验证误差最小。此时的节点数可以认为是最优节点数,即该节点数(这个参数)是通过交叉验证集得到的。而测试集是在确定了所有参数之后,根据测试误差来评判这个学习模型的。所以,验证集主要主要是用于模型的调参。

当数据规模较小的时候,小数据集的时候比如10000下,一般按照70%训练集,30%测试集;60%训练集,20%验证集20%测试集。
当在大数据时代时,验证集合测试集占数据总量的比例会趋向于变得更小,因为验证集的目的就是验证不同的算法,检验那种算法更有效。比如2个甚至10个不同的算法并迅速判断出哪种算法更有效。我们可能不需要拿出20%的数据作为验证集。,比如100万条数据,我们只需要1万条数据就能找出其中表现最好的1-2种算法。
这样的话即训练集98%,验证集1%,测试集1%。

经验法则:
构建模型的时候保证,验证集和测试集的数据来自同一分布。

偏差、方差

沿用识别猫的分类模型,这里有一张猫(y=1)一张狗的(y=0)
这里写图片描述
假定训练集的错误率是1%
验证集的错误率为11%
这里可以看出训练集可能出现了过度拟合。某种程度上,验证集并没有充分利用交叉验证集的作用。这种情况我们称之为“高方差”。

假定训练集的错误率是15%
验证集的错误率为16%
这里可以看出训练集可能出现了欠拟合。这种情况我们称之为“高偏差”。然而它对于验证集产生的结果却是合理的,因为它甚至不能甚至拟合训练集。

假定训练集的错误率是15%
验证集的错误率为30%
这种情况成为高偏差高方差

总结:
至少对于训练数据讲,通过训练集的误差,我们可以判断数据拟合情况,可以判断是否有偏差问题,然后查看错误率有多高。当完成训练后,开始验证集验证时,从训练集到验证集这个过程中,我们可以判断方差是否过高。以上分析的前提都是假设基本误差很小,训练集和验证及数据来自相同分布。

机器学习基础

评估训练模型偏差—->high选择新网络构建更大的模型,花费更多时间训练算法或者尝试更先进的优化算法
当模型的偏差降下去,直到至少可以拟合训练集。
评估训练模型方差——>high最好的方法时采用更多的数据去训练,通常会采用正则化来减小方差
直到找到一个低偏差,低方差的框架。

通常会根据训练验证集来检验模型偏差方差问题。

正则化

L2正则化介绍
用神经网络举例:

J(w[i],b[i],.....,w[L],b[L])=1mi=1mL(y^(i),y(i))+λ2ml=1L||w(L)||2
||w(L)||2=i=1n[L1]j=1n[L](w[L]ij)2
其中L为神经网络的层数
n[L]为L层的节点数
反向传播迭代w,其中backpop为未加正则项的结果,加上正则项dw为:
dw[L]=backpop+λmw[L]
w[L]=w[L]αdw[L]
w[L]=1αλmwLαbackpop
1αλmwL可以看到w[L]乘小于1的数会减小,因此L2范数正则化也被称为权重衰减。

为什么正则化可以预防过拟合

J(w[i],b[i],.....,w[L],b[L])=1mi=1mL(y^(i),y(i))+λ2ml=1L||w(L)||2
由这个公式直观上去看可以看出,当λ取值为特别大的时候,要向成本函数降低到最小,需要w[L]0
举个例子,假如一个神经网络模型为过拟合状态,然后我们给它设定一个大的λ值这时候会使得原有的神经网络大大简化,如图:
如图
有点类似于逻辑回归,但这些别x掉的节点并没有消失,只是影响变小了。神经网络变得简单了。这样的话会使得过拟合的神经网络更接近于欠拟合状态。这样看来中间会有一个λ会使得模型最优。

总结一下就是:如果λ增大那么w[L]减小,z[L]减小,这个激活函数在这个范围内,会相对成线性,比如tanh函数,这样就不会出现过拟合。

Dropout正则化

这个正则化是在每个神经网络层中,随机失活某个节点
举个例子:
这里我们拿第三层的网络节点来举例,首先介绍以下要用到的参数,keep-prob设置失活因子;a3是经过第三层后的输出值,下面一起看下dropout
keep-prob=0.8
d3=np.random.rand(a3.shape[0],a3.shape[1])<keep-prob
a3=np.multply(a3,d3)
a3/=keep-prob

z4=w4a3+b4
由于a3中有20%的元素被归零,为了不影响z4的期望值,我们需要用w4a3/0.8,这样它将会修正或弥补我们所需要的那20%,a3的期望值不会变。
问题1:那么为什么要/o.8保证期望值保持不变呢?
因为每个样本在训练的时候,被随机消失的节点都是不同的那么成本函数公式中的/m的时候,如果不保证期望值不变的话,那么最后除样本的个数会很麻烦。
问题2:为什么drop-out可以防止过拟合?
拿一个单层的神经元来讲,它不能依赖于输入的特性,因为所有输入的特性都有几率被删除,所以它只会给给个输入分配小一点的权重。由上面的正则化L2同理,都是通过缩减权重。并完成一些预防过拟合的外层正则化。

归一化

训练神经网络,其中一个加速训练的方法就是归一化输入。
归一化输入有两个步骤,零均值化归一化方差,这里用代码说明一下:

from sklearn import datasetsimport numpy as npx1=np.array([[2,1,3,2,4,3,2],[50,65,70,90,100,89,77]])print('元数据:')print(x1)a=np.sum(x1,axis = 1,keepdims = True)/7print('平均数:')print(a)b=x1-aprint('零均值化:')print(b)fangcha=np.sum(b**2,axis = 1,keepdims = True)/7print('方差:')print(fangcha)print('归一化方差后:') fangchac=b/fangchaprint(fangchac)

输出结果为:

from sklearn import datasetsimport numpy as npx1=np.array([[2,1,3,2,4,3,2],[50,65,70,90,100,89,77]])print('元数据:')print(x1)a=np.sum(x1,axis = 1,keepdims = True)/7print('平均数:')print(a)b=x1-aprint('零均值化:')print(b)fangcha=np.sum(b**2,axis = 1,keepdims = True)/7print('方差:')print(fangcha)print('归一化方差后:') fangchac=b/fangchaprint(fangchac)​元数据:[[  2   1   3   2   4   3   2] [ 50  65  70  90 100  89  77]]平均数:[[  2.42857143] [ 77.28571429]]零均值化:[[ -0.42857143  -1.42857143   0.57142857  -0.42857143   1.57142857    0.57142857  -0.42857143] [-27.28571429 -12.28571429  -7.28571429  12.71428571  22.71428571   11.71428571  -0.28571429]]方差:[[   0.81632653] [ 251.91836735]]归一化方差后:[[ -5.25000000e-01  -1.75000000e+00   7.00000000e-01  -5.25000000e-01    1.92500000e+00   7.00000000e-01  -5.25000000e-01] [ -1.08311730e-01  -4.87686325e-02  -2.89209332e-02   5.04698639e-02    9.01652625e-02   4.65003240e-02  -1.13415424e-03]]

归一化输入特征的原因

数据归一化后,最优解的寻优过程明显会变平缓,更容易正确收敛到最优解:
比如有两个变量x1,x2,共同影响结果值y,然而x1介于0到1之间,x2介于900到1000之间,用单层感知器单个样本为例,激活函数采用线性。w=[w11,w12]
那么a=z=wx那么代价函数J为
J=12ay2
da=ay
dw=xda
假如x为[[1],[900]],假如da=[1]那么dw=[1,900],这样看来,其实w11随着反向传播变化很小w12则变化相当大。这样造成J像很像一个狭长的碗,原因就是J变化一点,而w11变动范围小,而e12变动范围特别大,所以图像会扁。
如果在此时运行梯度下降法,需要一个小的学习率,并可能需要多次迭代过程,延切线方向走,直到找到最小值。而进行归一化处理后,使得J图像更加圆,运行梯度下降法的时候,不论从哪个位置开始,梯度下降法,可以直接找到最小值。

梯度消失与梯度爆炸

超参数调试正则化以及优化

单层神经元举例;
有四个特征输入x1,x2,x3,x4
z=w1x1+w2x2+....+wnxn
由上式可以看出为了使z不过大,n越多我们越希望w越小
最合理的方法就是设置wi=1/n就是设置某层权重矩阵w[L]=np.random.randn(shape)1n[L1]
对于relu函数一般
w[L]=np.random.randn(shape)2n[L1]
对于tanch函数
w[L]=np.random.randn(shape)1n[L1]

梯度的数值逼近

利用双边误差fθ+ϵf(θϵ)2ϵ逼近梯度

梯度检验

假设你的网络中含有w[1]...w[L]b[1]...b[L],为了执行梯度检验,首要的是把所有参数转换成一个巨大的向量数据。需要先把w矩阵转化成向量,转成后做链接运算得到一个巨型向量θ

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