改善深层神经网络
来源:互联网 发布:网络教育专科学校 编辑:程序博客网 时间: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正则化介绍
用神经网络举例:
其中L为神经网络的层数
反向传播迭代w,其中backpop为未加正则项的结果,加上正则项dw为:
由
为什么正则化可以预防过拟合
由这个公式直观上去看可以看出,当
举个例子,假如一个神经网络模型为过拟合状态,然后我们给它设定一个大的
有点类似于逻辑回归,但这些别x掉的节点并没有消失,只是影响变小了。神经网络变得简单了。这样的话会使得过拟合的神经网络更接近于欠拟合状态。这样看来中间会有一个
总结一下就是:如果
Dropout正则化
这个正则化是在每个神经网络层中,随机失活某个节点
举个例子:
这里我们拿第三层的网络节点来举例,首先介绍以下要用到的参数,keep-prob设置失活因子;
keep-prob=0.8
d3=np.random.rand(a3.shape[0],a3.shape[1])<keep-prob
a3=np.multply(a3,d3)
a3/=keep-prob
由于
问题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]
那么
假如x为[[1],[900]],假如da=[1]那么
如果在此时运行梯度下降法,需要一个小的学习率,并可能需要多次迭代过程,延切线方向走,直到找到最小值。而进行归一化处理后,使得J图像更加圆,运行梯度下降法的时候,不论从哪个位置开始,梯度下降法,可以直接找到最小值。
梯度消失与梯度爆炸
超参数调试正则化以及优化
单层神经元举例;
有四个特征输入x1,x2,x3,x4
由上式可以看出为了使z不过大,n越多我们越希望w越小
最合理的方法就是设置wi=1/n就是设置某层权重矩阵
对于relu函数一般
对于tanch函数
梯度的数值逼近
利用双边误差
梯度检验
假设你的网络中含有
- 改善深层神经网络
- 吴恩达 改善深层神经网络 第一周
- 改善深层神经网络第一周-Initialization
- 改善深层神经网络第一周-Regularization
- 改善深层神经网络第一周-Gradient Checking
- 改善深层神经网络第二周-Optimization methods
- DeepLearing学习笔记-改善深层神经网络(第一周作业-1)
- 改善深层神经网络:超参数调节(第一周)笔记
- 改善深层神经网络第一周-Regularization 若干错误修正
- 改善深层神经网络第二周-Optimitation and methods 错误修改
- DeepLearing学习笔记-改善深层神经网络(第三周- 将batch-norm拟合进神经网络)
- 深层神经网络
- 第2次课改善深层神经网络:超参数优化、正则化以及优化
- 第2次课改善深层神经网络:超参数优化、正则化以及优化
- DeepLearing学习笔记-改善深层神经网络(第一周作业-2-正则化)
- DeepLearing学习笔记-改善深层神经网络(第一周作业-3-梯度校验)
- DeepLearing学习笔记-改善深层神经网络(第二周作业-优化方法)
- DeepLearing学习笔记-改善深层神经网络(第三周- 超参数调试、正则化)
- 欢迎使用CSDN-markdown编辑器
- 阿里云ECS Java运行环境(Centos7 64 | JDK8|Tomcat8)搭建网站过程记录
- Android硬件访问服务
- C/S架构程序设计
- 浅谈MySQL字符集
- 改善深层神经网络
- 多重背包二进制分组优化
- 作业1
- Android ANR Trace 详解
- dubbo源码 学习笔记(六)
- js延迟加载的方式有哪些
- Java static静态方法 静态变量
- 目标跟踪算法——KCF 进阶
- c语言错误 error: stray '\240' in program|