训练、开发、测试集
目前超参数的确定依赖于实验迭代调整,将数据集划分为:训练、开发(验证)、测试集会使迭代效率更高。
如果数据少的时候用传统的分割方法:60/20/20,数据量大的时候则都可以。
确保开发和测试集的数据分布相同。
偏差-方差
目前关于偏差-方差的权衡讨论很少。
高偏差--欠拟合
高方差--过拟合
机器学习的基本原则
当模型训练好的时候:
- 检查模型是否高偏差,即模型在训练集数据上的表现,如果存在高偏差的情情况,可以尝试选择其他更合适的网络,如有更多隐藏层和隐藏单元的,或延长训练时间,选用其他优化方法
- 当偏差降低到可接受范围内后,判断方差,需要在开发集上判断,看模型是否具有一般化的能力,如果方差高,解决方法最好时取得更多的数据,有时候无法获取更多的数据,可以尝试正则化,或者更适合的网络
正则化:
如果出现方差过高,即过拟合情况,可以考虑使用正则化方法
在逻辑回归代价函数中加入正则化项:
在神经网络中:
矩阵的范数:
权重衰减:
加入正则化项之后,梯度变为:
梯度更新公式变为:
其中,<1,会给之前的权重矩阵一个衰减参数。
为什么正则化可以缓解过拟合
加入正则化项,正则化因子λ设置的足够大的情况下,为了使代价函数最小化,权重矩阵W就会被设置为接近于0的值。则相当于消除了很多神经元的影响,大的神经网络就会变成一个较小的网络.
对于激活函数而言,加入正则化项之后,z的值变小,近似于线性变换,整个网络就成为一个简单的近似线性的网络,从而不会发生过拟合。
dropout正则化(随机失活)
假如上述神经网络过拟合,随机失活技术遍历网络每一层,为dropout网络中的某个结点,设置一个概率值,50%概率被丢弃,消除那些结点的运算,得到一个相对小的神经网络。小的网络可以达到正则化的效果。
随机失活的方法:反向随机失活
理解dropout:
单个神经元的工作就是接收输入,并产生一些有意义的输出,加入了Dropout后,输入的特征都是有可能会被随机清除的,所以神经元不会再特别依赖于任何一个输入特征,因此给每一个输入较小的权重,可以达到收缩权重防止过度拟合的目的。如果某一层的参数过多,更容易发生过拟合,给这一层设置更低的留存率。
缺点是,这样做使得在交叉验证搜索时会有更多的超参数,因此可以对一些层使用dropout,其他不用,且dropout相同,这样就只产生了一个超参数。另一个缺点是,让代价函数不明确,去验证梯度下降算法时,不能依据随着迭代,代价函数值变小,不能用绘图方式判断迭代结果
PS:在测试阶段不要用dropout,因为那样会使得预测结果变得随机。
其他正则化方法:
扩增训练集:将图片数据水平翻转、随机裁剪图片(旋转放大)
早终止法 :在运行梯度下降时,画一个训练误差的图,同时画出开发集误差
缺点:机器学习有很多步骤,其中获取代价函数最小有很多方式实现,即便优化了成本函数,我们希望不会过拟合,可以通过正则化等步骤实现,现在机器学习中增加了很多超参数。早终止的话,即增加超参数,又想避免过拟合,用一个工具解决两个问题,考虑的更复杂。
输入归一化:加速训练过程
以两个特征的训练集为例,需要两步实现
训练集和测试集应该以同样的方式实现归一化
1、中心化:计算每一个特征样本的数据均值,样本减去均值
2、方差归一化
归一化之前,需要较小的学习率多次迭代次数找到全局最优解
归一化之后,可以设置更大的学习效率,较少的迭代次数就能找到全局最优解
梯度的消失和爆炸
在训练深度神经网络时,损失函数的导数或者斜率很大,或者很小,导致训练变得很困难
出现的原因:在一个很深的网络,权参数系数矩阵只比单位阵大一点点,激活函数的值将以指数级递增,激活函数就会爆炸,只比单位阵小一点点就会消失,导致梯度下降超级缓慢
神经网络权重初始化
输入的数量n较大时,我们希望每个w i的值都小一些,这样它们的和得到的z也较小。
设置,
梯度的数值近似:
双侧差值:
梯度验证:可以找出反向传播中的错误
将网络中的参数全部连接起来,转换成一个向量
- 梯度验证不能在训练中使用,只能调试的时候用
- 如果梯度检验出问题,逐个检查看看哪个差距最大
- 不要忘记加入正则化项
- 梯度检验不能与随机失活一起使用,因为每一次迭代中随机失活随机消除,这时是难以计算dropout在梯度下降上的代价函数J;
- 最后虽然很少发生,但也是有可能的,当参数w和b接近0时,梯度下降是正确的,但是随着梯度下降的进行,w和b会增大,算法的精度有所下降,可以尝试在随机初始化的时候,运行梯度检验,之后训练网络一段时间,w和b将会在0附近摇摆一段时间,即很小的随机初始值,在进行几次训练的迭代后,再与运行梯度检验。吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(2-1)-- 深度学习的实践方面_cousera deeplearing笔记-CSDN博客