目录
改善深层神经网络:超参数调试、正则化以及优化
训练,验证,测试集(Train/Dev/Test sets)
偏差和方差
权衡方差和偏差的问题
正则化
为什么只正则化参数?为什么不再加上参数 呢?
为什么正则化有利于预防过拟合呢?
为什么压缩2范数,或者弗罗贝尼乌斯范数或者参数可以减少过拟合?
dropout 正则化。
其他正则化方法
归一化输入
1.零均值
2.归一化方差。
为什么使用归一化处理输入?
梯度消失/梯度爆炸
神经网络的权重初始化
梯度的数值逼近
梯度检验
梯度检验应用的注意事项
深度学习的实践层面
Highly iterative process 高度迭代的过程
如果只有100条,1000条或者1万条数据,常见做法是将所有数据三七分,就是人们常说的70%验证集,30%测试集,如果没有明确设置验证集,也可以按照60%训练,20%验证和20%测试集来划分。
假设我们有100万条数据,其中1万条作为验证集,1万条作为测试集,100万里取1万,比例是 1%,即:训练集占98%,验证集和测试集各占1%。对于数据量过百万的应用,训练集可以占到99.5%,验证和测试集各占0.25%,或者验证集占0.4%,测试集占0.1%。
尽量要确保验证集和测试集的数据来自同一分布
假设这就是数据集,如果给这个数据集拟合一条直线,会出现高偏差的情况,我们称为“欠拟合”。拟合一个非常复杂的分类器,方差较高,数据过度拟合。最好的情况为适度拟合。
二维空间可以如上图可视化表示,但在多维空间数据中,绘制数据和可视化分割边界无法实现。
如果训练集误差和最优误差相差较大,则偏差较高,如果验证集误差和训练集误差相差较大,则方差较大
机器学习基础
针对过拟合(高方差)的问题:正则化、more data
这里对w进行L2正则化,是向量参数的欧几里德范数(2范数)的平方
因为通常是一个高维参数矢量,已经可以表达高偏差问题,可能包含有很多参数,b是否进行正则化已经无关紧要
1正则化:参数向量的1范数为绝对值求和
如果用的是1正则化,最终会是稀疏的,也就是说向量中有很多0,有人说这样有
利于压缩模型,因为集合中参数均为0,存储模型所占用的内存更少。实际上,虽然1正则化使模型变得稀疏,却没有降低太多存储内存,所以我认为这并不是1正则化的目的,至少不是为了压缩模型,人们在训练网络时,越来越倾向于使用2正则化。
在神经网络中进行正则化
矩阵范数被称为“弗罗贝尼乌斯范数”,它表示一个矩阵中所有元素的平方和
加入到dw中
权重衰减:进行化简推导得出,实则在原来的参数更新的基础上,先对w乘上一个小于1的系数。
如果正则化设置得足够大,权重矩阵被设置为接近于0的值,直观理解就是把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响。
整个神经网络结构是线性运算+激活函数,如果很大,则w会变得较小,对应的输入会很小,那么激活函数在某一段内会近似于线性函数,此时整个神经网络从非线性向线性转化。
在计算梯度下降时,使用新定义的代价函数,它应该包含第二个正则化项
还有一种方法也用到了正则化,就是dropout正则化
随机失活:遍历网络的每一层,并设置消除神经网络中节点的概率。
反向随机失活(inverted dropout)
将获取的激活函数与我们生成的对应维度的0-1矩阵相乘,会随机使一部分激活函数变为0,对于输出结果我们需要去补偿我们消失的部分,/ – , – 即消失的概率。
在测试时不需要dropout。
1.dropout 的功能类似于2正则化,与2正则化不同的是应用方式不同会带来一点点小变化,甚至更适用于不同的输入范围。
2.该单元的输入也都可能被随机清除。所以不会给任何一个输入加上太多权重,因为它可能会被删除,因此该单元将通过这种方式积极地传播开,并为单元的各个输入增加一点权重,通过传播所有权重,dropout 将产生收缩权重的平方范数的效果
1.数据扩增:对图片进行翻转剪裁,对文字进行旋转
2. early stopping: 在中间点停止迭代过程。
预防过拟合还有其他任务,换句话说就是减少方差,这一步我们用另外一套工具来实现,这个原理有时被称为“正交化”。
Early stopping 的优点是,只运行一次梯度下降,你可以找出的较小值,中间值和较大值,而无需尝试2正则化超级参数的很多值。
假设一个训练集有两个特征,输入特征为 2 维,归一化需要两个步骤:
归一化能够使我们的代价函数更加对称,这样我们在梯度下降更新的时候,能更快地收敛并且能够更准确地找到minimal。
在深度神经网络中,激活函数将以指数变化,同时与层数相关的导数或梯度函数,也是呈指数级增长或呈指数递减。
能够一定程度上解决梯度的问题。希望能够使得设置的权重矩阵既不会增长过快,也不会太快下降到0,从而训练出一个权重或梯度不会增长或消失过快的深度网络
在实施 backprop 时,有一个测试叫做梯度检验,确保backprop正确实施。
双边误差:[( + ) − ( − )] / 2
对approx[]和 []做运算,判断两者的接近程度来检验梯度是否计算正确