训练集 验证集 测试集
有助于提高训练效率
通常流程
所有数据分为三种:训练,验证,测试
先用训练集训练网络,使用验证集在多种算法中,选择最好的模型,最终在测试集中,评估算法运行情况
小数据量的划分
- 70%训练集 + 30%测试集
- 60%训练集 + 20%验证集 + 20%测试集
大数据量的划分
- 98%训练集 + 1%验证集 + 1%测试集
- 99.5%训练集 + 0.25%验证集 + 0.25%测试集
- 99.5%训练集 + 0.4%验证集 + 0.1%测试集
训练集和验证集分配不对应
例如训练集是高像素图片,验证集是低像素图片
请确保验证集和测试集数据来自同一个数据源
即使没有测试集也没关系,因为测试集是为最终选定的神经网络做无偏评估,如果不需要评估,可以不设置测试集
如果只有训练集和验证集,没有独立测试集,我们一般称这个验证集为测试集
偏差/方差
Bias(偏差): 训练过程中所有模型的预测输出与模型的真实输出值之间的差异。
Variance(方差)是不同的训练集训练出的预测输出值(预测结果) 之间的离散程度,方差小,则模型稳定性更好。
高方差:过拟合
靶心是完美预测值,蓝色点是某个模型的预测值
可以通过观察训练集误差率,判断数据拟合情况。
训练错误率低,验证错误率高,高方差:过拟合
训练错误率和验证错误率差不多高,高偏差:欠拟合
机器学习基础
若训练集出现高偏差:更大的网络/更长的训练时间。
若验证集出现高方差:更多的数据/正则化减少过拟合 。
哪种处理方法都要记得找更合适的网络结构
正则化
处理高方差的过拟合问题
过拟合的原因一般是:模型太复杂 / 特征(参数个数)选的太多了 / 测试数据很少 / 参数范围太大
正则化就是通过对我们的参数进行约束,而使我们的模型更加的简单,使我们对训练集合的拟合更加的平滑
L1和L2正则化: 在代价函数计算中,添加 L1正则化项 or L2正则化项,因为:在训练过程中,我们通常期望损失函数越来越小,添加正则化项后,需要连同正则化项也越来越小,因此可以降低参数w的大小范围,降低模型复杂度
为什么只拟合参数w: 因为b只是一个偏移量(上下平移),并不能改变函数拟合的形状
范数
高维空间中,某个点到原点的距离
- L1范数
- L2范数
- p范数
L1正则化和L2正则化的直观感受
紫色圆圈是损失函数loss的等高线,每一圈的loss值都相同,中心误差最小;
假设 θ = 1,这两种正则化都能实现相交部分w1和w2较小。
区别在于:L1正则化可能会出现只有w2参数被保留的情况(焦点位于y轴上)。而L2正则化能保证w1和w2都较小且不为0。 相比之下,L2正则化更加稳定可靠
莫烦老师对L1,L2正则化的解释
视频只有3分钟,可以看一看
什么是 L1 L2 正规化 正则化 Regularization (深度学习 deep learning)
逻辑回归中的正则化
omit对参数b的正则化。
分别列出 L2正则化 和 L1正则化的公式,其中正则参数λ通常使用验证集或交叉验证配置这个参数
神经网络中的正则化
L2范数正则化(即 权重衰减)
这部分展示了神经网络中多个w和b的情况,后面添加的正则化项中,使用F范数,表示矩阵W中的所有元素平方再求和
如何实现梯度下降:
反向传播中获得dw[l],在后面添加正则项。在根据学习率更新的那一步中,w[l]的更新变成了右下角绿色的公式,并且发现w[l]是一定会变小,即实现权重衰减
正则化为什么可以减少过拟合
在神经网络的正则项中,若正则参数λ足够大,根据梯度下降那里的解释,权重矩阵W将设置为接近0的值,直观理解就是把一些隐藏单元的权值置为0。
以tanh()函数为例:
当λ增大,某层的w会接近极小值,根据公式,z也会接近较小值,在tanh()函数中,z较小的区域可以视为线性函数;之前有讲过,网络会趋向于成为一个较深,但是趋近线性的网络,降低拟合能力。
dropout正则化(反向随机失活)
对每层的结点进行随机的保留和消除
设置一个阈值和随机数矩阵,保留低于该阈值的随机数,实现随机失活/保留神经元
这里假设本层网络有3个结点,keep-prob为0.8,即80%的概率保留结点。
- 随机生成和a3同尺寸的随机矩阵d3,且 < keep-prob ,生成由True和False组成的矩阵d3(运算中True和False会自动转换为0和1)
- a3与d3相乘,实现矩阵部分置0(失活)
-
最后a3 = a3 / keep-prob , 这步是因为本层20%的结点被置0,使a[3]的期望减小20%,进而导致z[4]的期望值变小;我们希望不影响z[4]的期望值,所以将dropout处理后的a[3]除以0.8。(但是我们要知道,即使修正也无法完全恢复期望值)
-
同时,也可以通过d矩阵,实现失活某些特定结点
测试阶段进行预测时候,不要使用dropout函数,以免干扰预测
理解dropout
为什么dropout能够生效
任何输出结点都有可能出现:某个输入结点被失活的情况,因此,我们不希望在某个输入节点上赋予过大的权重。
dropout将产生 降低权重的平方范数 的效果:权重变小,范数减小(范数是权重的平方和),因此降低权重就可以防止过拟合。
功能类似于L2正则化:减小w范围,降低模型复杂度
每层的keep-prob值都有可能不同,我们倾向于对尺寸更大的W矩阵进行更强的dropout处理(因为更容易发生过拟合),例如途中W[3]矩阵的尺寸较大:7x7,因此选用keep-prob=0.5进行更强的失活处理。
切记,除非过拟合,一般不要使用dropout方法
其他正则化方法
数据集扩增
简单有效避免过拟合方法(除了增加训练量)
early stopping
同时打印训练集损失率和验证集损失率,通常情况下验证集误差都会先下降,后来在某个节点上升,这个训练节点就是可以试着停下来的节点。
有效原因:在训练开始之前,w矩阵较小(初始化一般都会非常小),经过多轮训练,w矩阵会变大,early stopping可以获得一个中等大小的F范数,类似L2正则化,选择了参数w范数较小的矩阵。
缺点:不能同时实现“优化代价函数”和“避免过拟合”,因为一旦early stopping就意味着停止对代价函数J进行优化,如果没有进行early stopping,就容易过拟合。
归一化输入
为什么要归一化
将坐标中的w和b视为特征w1和特征w2,取值分别为:w1∈[1,100],w2∈[0,1]
有助于加速训练:如果没有进行归一化,在左边这个图上运行梯度下降法就只能采用非常小的学习率,否则会走许多弯路;而右边将数据归一化处理后,可以利用较大步长的梯度下降法,更直接到达最小值。
因此,如果特征值的范围差异不大时,就不是一定要进行归一化:例如:x1∈[0,1],x2∈[-1,1],x3∈[1,2]
归一化训练集
下面以这组数据为例,每个点是一个样本,特征是坐标x1和x2的值:
第一步:零均值化
可以实现移动训练集,直到完成零均值化
第二步:归一化方差
上一步完成后,发现x1 比 x2的方差大得多
最后x1 和 x2的方差都为1
归一化测试集
一定要用与归一化训练集时相同的 u 和 σ 进行归一化
梯度消失与梯度爆炸
当网络深度较大时(例如L层),若某层w矩阵的值大于1(例如1.5),经过多层传递,会变成1.5L-1,值极大,同时也会导致梯度函数极大,产生梯度爆炸。
反之,若某层w矩阵的值小于1(例如0.8),最后也会导致值极小,产生梯度消失
合理初始化网络权重
可以有效缓解梯度消失与梯度爆炸问题,更谨慎地选择初始化参数
为了预防z值过大或过小,当n越大的时候,我们希望wi越小,因为z是wixi的和。所以我们倾向于设置wi的方差为1/n,n是输入本神经元的特征数量。初始化时,设置某层权重为随机值后,再乘以输入本神经元的标准差(np.sqrt:1/n[L-1]),如果激活函数是ReLU函数的话,绿笔部分的分子为2
tanh:是√(1/n^([l-1]) ),被称为Xavier初始化
梯度的数值逼近
在反向传播时,梯度检验来确保反向传播正确。
说一下什么是单边,双边是什么:
单边:f(θ+ϵ) - f(θ)
双边:f(θ+ϵ) - f(θ-ϵ)
在上面的三角形中,使用三角形高/宽,得到导数关系,右边列出双边误差时,求得导数值为3.0001 - 3 = 0.0001。同样的导数定义公式,单边误差求得为3.0301 - 3 = 0.0301。
因此双边误差公式结果更准确。
梯度检验
- 首先将所有W和b的参数转换为一个大向量 θ ,使用前几章反向传播的做法,获取dW和db参数并转换为向量dθ,这两个向量形状一致
- 然后,用下标i遍历θ的每个元素,得到dθ[i]的逼近值:dθapprox[i]
- 通过求欧几里得范数,判断逼近值与实际值差距。这里用分数是为了求一个比值,求出来的值如果10-7数量级是可以的,若10-3数量级则大概率有bug问题,应该仔细检查θ的,查看是哪个下标i导致逼近值与实际值差距太大
梯度检验实现技巧和注意事项
- 不要在训练中使用梯度检验,它只用于调试。因为计算dθapprox[i]的过程十分漫长,调试结束后就关闭梯度检验
- 如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出bug,也就是说,如果dθ[i]和dθapprox[i]的值相差很大,我们要做的就是查找不同的 i 值,看看是哪个地方导致值相差这么多
- 在实施梯度检验时,如果使用正则化,请注意不要忘记正则项
- 梯度检验不能与dropout同时使用,因为每次迭代过程中,dropout会随机消除隐藏层单元的不同子集,难以计算dropout在梯度下降上的代价函数J