1.数据划分
将数据分成三部分:训练集,验证集(dev set),测试集
我们开始对训练执行算法,通过验证集选择最好的模型,经过充分验证,我们选定了最终模型,然后就可以在测试集上进行评估了。
传统的划分比例:(适用于数据集规模较小的)
70%验证集,30%测试集
60%训练,20%验证,20%测试
数据集规模较大的,验证集和测试集要小于数据总量的20%或10%。
要保证验证集和测试集的数据来自统一分布。
如果不需要无偏评估算法性能,那么也可以不设置测试集,可以再训练集上训练,尝试不同的模型框架,在验证集上评估这些模型,然后迭代选出适用的模型。
2.bias & variance
如果训练集的误差很小,而验证集的误差比较大,那么也就意味着我们可能过拟合了训练集,验证集在某种程度上没有充分利用交叉验证的作用,这种情况称为“高方差”。
查看数据集的拟合情况的误差,可以看出是不是“高偏差”。
初始模型训练完成后,首先看一下算法的偏差高不高,如果偏差的确很高,尝试换个模型,比如含有更多的隐藏层或隐藏单元,或花费更多的时间训练网络,或采用更好的优化算法。当偏差降下来之后,意味着当前这个模型可以拟合或者过拟合训练集,接下来检查一下方差有没有问题,如果方差高,有两种方式,一是采用更多的数据,二是正则化减少过拟合。
3.正则化
正则化 L1和L2:
1.在代价函数的基础上再加上λ/2m*范数,其中λ为正则化参数,我们通常使用验证集来配置这个参数。
神经网络中的正则化:弗洛贝尼乌斯范数,表示一个矩阵中所有数的平方和(矩阵L2范数)
L2范数正则化被称为“权重衰减”,因为我们加上正则化之后,对权重的更新相当于乘了(1-aλ/m)的权重,在此基础上再减去未加正则化之前的梯度下降的部分,见下图:
2.为什么正则化能避免过拟合?
如果正则化参数λ很大,那么参数W就会很小,相应的Z=WX+b,Z也会变小,当Z的范围落在下面这个图的红色部分时,g(z)大致呈线性,而线性的激活函数我们通过前一章知道它并不能用于复杂的决策,本质上和Logistic回归是一样的。
Dropout正则化
1.dropout会遍历网络的每一层,并设置消除神经网络中节点的概率。
最常用的是inverted dropout, 会除以一个keep-prob(代表每一层上保留单元的概率)的值,测试过程中不要用drouput,因为在测试阶段进行预测时,如果应用dropout预测会受到干扰。
2.为什么dropout有效?
主观上看,它意味着这个神经网络不依赖于任何一个特征,因为该单元的输入可能随时被清除,该单元就会通过这种方式传播所有的权重,会产生收缩权重的平方范数的效果,类似于L2正则化。
3.实施dropout中有两个技巧,且大多用于计算机视觉领域。①如果担心某些层比其它层更容易过拟合,可以把某些层的keep-prob值设置的低一些。②在某些层上应用dropout,有些层不用dropout。
4.采用dropout带来的缺点是代价函数J不再被明确定义,很难检查梯度下降的值。
其他正则化方法
数据增强(Data Augmentation)
1⃣️从数据源头采集更多数据复制2⃣️原有数据并加上随机噪声3⃣️重采样4⃣️根据当前数据集估计数据分布参数,使用该分布产生更多数据等。
Early stopping(绘制验证集误差会发现验证集误差通过先呈下降趋势然后在某个节点处开始上升,于是我们在这个地方停止训练)。Early stopping的缺点是过早了停止了梯度下降,不能独立的处理方差和偏差的问题。
5.神经网络的权重初始化tips
如果用的激活函数是relu,方差设置为2/n^([l−1])
如果用的激活函数时tanh,方差设置为√(1/n^[l−1] )(这种叫Xavier初始化)
6.梯度检查
把网络中的参数W1,W2,W3…b1,b2,b3等转换成一个巨大的向量θ,那么代价函数J就是θ的函数。
如何定义这两个向量是否真的接近彼此?我们使用下面的数学公式
如果这个值在10^(−7)或更小,就意味着导数逼近是正确的。(使用np.linalg.norm(...))
注意事项:①不要再训练中使用梯度检验。调试的时候才需要。
②如果算法的梯度检验失败,要检查每一项找出Bug。
③如果代价函数有正则化的形式,那么在实施梯度检验时一定要注意包括这个正则项。
④梯度检验不能和dropout同时使用。一般是先关闭dropout,用梯度检验进行检查在没有dropout的情况下算法是正确的,再打开dropou
7、mini-batch
1.batch梯度下降
假设X的维度是(nx,m),Y的维度是(1,m)。之前的向量化能够让我们相对较快的处理m个样本。但如果m很大,处理的速度仍然很慢,这意味着我们必须处理整个训练集才执行一次梯度下降。
2.mini-batch
如果将训练集分成小一点的子集训练,在每一个子集训练后执行一次梯度下降,那么这些子集就是mini-batch。在每一个Mini-batch上进行前向传播、计算损失函数、反向传播更新参数的过程就叫做一个epoch。
Mini-batch相比于batch梯度下降来说,代价函数会有更多的噪声,大趋势上代价函数会随着每次迭代而减小。
我们需要确定mini-batch的大小,假设训练集的大小是m:
Mini-batch数量=m 即Batch gradient descent(batch梯度下降),遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。太慢。
Mini-batch数量=1 即stochastic gradient descent(随机梯度下降),每看一个数据就算一下损失函数,然后求梯度更新参数。
3.如何选取mini-batch的大小?
m<2000时,直接用Batch梯度下降;m数量较大时,mini-batch的大小一般设置为2的次方,一般64-512的mini-batch比较常见。
8.指数加权平均
但是使用指数加权平均的方法在前期会有很大的偏差,为此我们引入了偏差修正的概念:
带修正偏差的指数加权平均
9.使用momument的梯度下降法
更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。
白话解释:
在对应上面的计算公式中,将Cost function想象为一个碗状,想象从顶部往下滚球,其中:微分项dw,db想象为球提供的加速度;动量项vdw,vdb相当于速度;
- 若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度。
- 若当前梯度与历史梯方向不一致,则梯度会衰减。
小球在向下滚动的过程中,因为加速度的存在速度会变快,但是由于ββ的存在,其值小于1,可以认为是摩擦力,所以球不会无限加速下去。
其中的超参数为:α,β
10.RMSProp
如下图,我们想要减缓纵轴方向的浮动幅度,同时加快横轴方向的学习。假设纵轴是b,横轴是W,那么RMSprop有以下的公式
我们希望Sdw较小,这样在更新的时候除以一个较小的数就可以加快横轴的学习;===> dw较小
同时希望Sdb较大,在更新b的时候除以一个较大的数就可以减缓纵轴上的变化。===>db较大
RMSprop将微分项进行平方,然后使用平方根进行梯度更新,同时为了确保算法不会除以0,平方根分母中在实际使用会加入一个很小的值如ε
11.Adam
一个结合了momentum和RMSprop的自适应学习率的方法。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
权重更新:
其中的超参数有:
α:需要进行调试;
β1:常用缺省值为0.9,dw的加权平均;
β2:推荐使用0.999,dw2的加权平均值;
ε:推荐使用10^−8
12.学习率衰减
- 常用
- 指数衰减
- 离散下降:discrete stair caese(不同阶段使用不同的学习速率)
-
其他
13.局部最优问题
在高纬度的情况下:
- 几乎不可能陷入局部最小值点;
- 处于鞍点的停滞区会减缓学习过程,利用如Adam等算法进行改善
14.超参数调试
经常调试的有α,mini-batch的大小,隐藏单元。当应用Adam算法时,不需要调试β1,β2,ε
在深度学习领域,由于不知道哪个超参数更重要,推荐采用随机选择点,还有就是考虑使用由粗糙到精细的搜索过程。
在超参数选择时,一些超参数是在一个范围内进行均匀随机取值的,但还有一些参数均匀随机取值不合适,这就需要使用对数标尺搜索超参数。
①如超参数α学习速率,使用对数标尺搜索超参数:代码中可以r=-4*np.random.rand()
在对数坐标系中取值,取最小的对数得到a的值,取最大值的对数得到b值,现在在对数轴上的10a~10b区间取值,在a,b之间随意均匀的选取r,超参数设置为10^r。
②假设我们现在调整β的值,我们认为β的取值在0.9~0.999之间,那就可以让1-β落在0.001-0.1之间,从而调整β的值。
15.归一化
归一化输入需要两个步骤:零均值,归一化方差,我们希望训练集和测试集都是通过相同的μ和σ^2定义的数据转换。
我们归一化的是输入的特征值,不是y。
网络中激活值的归一化:Batch Norm
1.公式
其中gamma和β是可以更新学习的参数,两个参数的值来确定z~的分布。
2.意义
当对隐藏层的输出值z进行归一化以后,我们得到的是一个均值为0方差为1的分布,但是,假设这一层的激活函数是sigmoid,这个分布就意味着所有的值都集中在sigmoid在原点附近近似线性的一段了,因此,使用上面的公式重新对其赋予我们想要的任意值。
3.将batch norm拟合进神经网络
对每一个mini-batch,使用z = WX+b计算出每一个隐藏层的输出,对其进行batch norm(BN)后继续送入下一个隐藏层…一直到输出层,之后进行一步梯度下降法(可以采用之前说的momentum,rmsprop,Adam梯度下降法)。其中在对z进行BN时,由于要计算z的均值再减去平均值,所以z中的任何常熟都会被抵消,因此b这个参数是无用的,可以设置为0。
4.Batch norm为什么有用?
①类似于前面的归一化,可以改变cost function的形状,使得每一次梯度下降都可以更快的接近函数的最小值点,从而加速模型训练的过程。只不过batch norm不是单纯的将输入的特征进行归一化,而是将各个隐藏层的激活函数的激活值进行的归一化,并调整到另外的分布。
②限制了前层的参数更新导致对后面网络数值分布程度的影响,使得输入后层的数值变得更加稳定。
5.在训练数据上使用Batch norm
训练过程中,我们是在每个Mini-batch使用Batch Norm,来计算所需要的均值μ和方差σ^2。但是在测试的时候,我们需要对每一个测试样本进行预测,无法计算均值和方差。
此时,我们需要单独进行估算均值μ和方差σ^2。通常的方法就是在我们训练的过程中,对于训练集的Mini-batch,使用指数加权平均,当训练结束的时候,得到指数加权平均后的均值μμ和方差σ2σ2,而这些值直接用于Batch Norm公式的计算,用以对测试样本进行预测。
16.softmax
1.作用:将所有可能的输出归一化,输入一个向量,输出一个向量。
softmax回归相比于hard max(将最大元素位置放1,其余放0)更加的温和,将Logistic regression推广到了两种分类以上。
2.怎么训练带有softmax输出层的神经网络?
损失函数一般选取的是交叉熵
所以为了最小化Loss function,我们的目标就变成了使得y^2的概率尽可能的大
对应的Cost function
3.Softmax 的梯度下降
在Softmax层的梯度计算公式为: