训练、验证、测试集
神经网络有多少层
每层含有多少隐藏单元
学习率
激活函数
实际上 应用型机器学习是一个高度迭代的过程
一开始我们需要设定好配置信息,并运行代码,得到这些配置信息运行的结果。根据输出结果重新完善自己的想法,改变策略。或者为了找到跟好的神经网络不断迭代更新自己的方案。
因而,循环该过程的效率是决定项目进展速度的重要因素
一般把数据分为,训练集,简单交叉验证集或者验证集和测试集
这里介绍下三种数据集:
假设建立一个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 datasets
import numpy as np
x1=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)/7
print('平均数:')
print(a)
b=x1-a
print('零均值化:')
print(b)
fangcha=np.sum(b**2,axis = 1,keepdims = True)/7
print('方差:')
print(fangcha)
print('归一化方差后:')
fangchac=b/fangcha
print(fangchac)
输出结果为:
from sklearn import datasets
import numpy as np
x1=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)/7
print('平均数:')
print(a)
b=x1-a
print('零均值化:')
print(b)
fangcha=np.sum(b**2,axis = 1,keepdims = True)/7
print('方差:')
print(fangcha)
print('归一化方差后:')
fangchac=b/fangcha
print(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函数
梯度的数值逼近
利用双边误差
梯度检验
假设你的网络中含有
2.优化算法
2.1Mini-batch梯度下降法
梯度下降算法又成为batch梯度下降法。
向量化能让你有效的对所有m个例子进行计算,允许你处理整个训练集。所以我们要把样本组建成一个大的矩阵。假设一个样本有m个,如果m很大的话,处理速度仍然缓慢。比如说m=500万,在进行梯度下降法的时候你必须处理整个训练集,然后才能进行下一步的梯度下降。
看下面这个例子:
把训练集分割为小一点的子训练集,这些子集被取名为mini-batch,假设每一个子集中只有1000个样本。那么
mini-batch算法每次同时处理里的是单个的mini-batch
mini算法原理:
for t=1...5000:
forward prop on $x^{\{t\}}
z^{[1]}=w^{[1]}x+b^{[1]}
A^{[1]}=g^{1}(z^{[1]})
.....
A^{[L]}=g^{L}(z^{[L]})
cos(j)j^{[t]}=对1000个样本也就是mini- batch求代价函数
backprop
使用x^{t},y^{t},然后更新加权值
w^{[L]}=w^{[L]}-dw
对b做相同的处理
理解mini算法
左边图为正常的梯度下降法
右边图为mini-batch梯度下降法
出现波动的原因是因为取得有的mini-batch比较好算,直接下降,但是因为是多个变量共同影响梯度,所以有的mini-batch 可能陷入局部最优。
那么如何选择mini-batch的大小呢?
如果数据量不是很大的话,直接用梯度下降法就可以直接处理数据集,不是很大(2000以内);如果数据集特别大的时候,一般mini-batch大小为64到512(考虑的电脑内存设置如果mini-batch的大小为2的几次方速度更快)
指数加权平均
我理解的指数加权平均就是计算数据的一种趋势。
下面是一个伦敦的气温
计算该温度的趋势也就是温度的局部平均值或者移动平均值
首先使
…
大体公式就是某天的v等于前一天v值的0.9,加上当日温度的0.1,用红线画出来如图
得到了移动平均值每日温度的指数加权平均值
之前我们使用的数为0.9.现在我们把它成
在计算时可以把
当
当
将v_{100}展开得到
可以看到计算第100天的温度的时候包含了前100天的温度,而系数之和约等于1称之为偏差修正,因为有偏差修正,才是指数加权平均数。
那么到底需要平均多少天的温度?
实际上
而大体上说如果有
画出系数的图像100的时候为0.1,也就是就是当处于第90天的时候,图像下降到峰值的1/3
本质是在1/e之前它是一个下降幅度很快的函数
得出结论我们平均大约
而加权平均与传统的计算平均数来讲在计算机中占用的内存极少,只占用一个v每天进行不断更新就可以。虽然准确度不如传统的计算平均快。
指数加权平均的偏差修正
当
因为一开始我们
得到
解决这个为题可以不用
动量梯度下降法
动量梯度下降法Momentum就是在迭代过程中
移动平均dw
1、理解的话可以将动量看成平均数,当下降速度很快且方向不变的时候,动量平均使得它下降速度变得更快,当反向的时候,会发现动量平均后使得原先的下降幅度变小。
2、如果一开始学习率设定的很大的时候,使用动量平均能更好的约束原先很大的下降幅度,大大减小迭代次数。
并且让
特点:前后梯度方向一致时,能够加速学习
前后梯度方向不一致时,能够抑制震荡
RMSprop(不太明白)
原理:在梯度下降的过程中