第一节 深度学习的实用层面
一、训练开发测试集
应用机器学习是一个高度迭代的过程
Data 数据一般被分成以下三类:
-
训练集 -
-
交叉验证集
-
测试集
在训练集上训练数据,在交叉验证集检验选出效果最好的模型,在测试集上进行无偏评估。
当数据不多的时候,一般把数据按照70/0/30分或者60/20/20分。
但是数据过多的时候,dev集和test集有10000条左右就可以了,所以98/1/1的分配或者99.5/0.4/0.1的分配也是可以的。
交叉验证集和测试集要来自于同一个分布
二、偏差和方差
1.偏差:bias && 方差:variance
欠拟合和过拟合以上三种是欠拟合、适度、和过拟合的情况。
假设人眼辨别的错误率0% 或贝叶斯误差趋近于0%
理解偏差和方差贝叶斯误差(bayes error rate) 是指在现有特征集上,任意可以基于特征输入进行随机输出的分类器所能达到最小误差。也可以叫做最小误差。
在上图的情况下,train set error低而dev set error高,就是高方差现象,通常意味着过拟合。如果train set error和dev set error高,但是数值趋近,那么意味着偏差比较高,欠拟合的情况可能会出现。最糟糕的情况是高方差+高偏差,这意味着数据拟合程度不高,而在特殊的位置因为曲线过于灵活而出现了过拟合。
如果贝叶斯误差接近15%而train set error 也在15%左右,那么相比而言偏差和方差都不高。
2.如何解决机器学习中高偏差和高方差的问题:
解决高偏差和高方差问题三、正则化Regularization
1.逻辑回归的正则化
以逻辑回归的cost function函数为例:
我们通过调整w,b以寻找的最小值,其中在逻辑回归的cost function中加入正则化
其中
上述方法叫做L2正则化,因为用到了二阶范数。
为什么只对w做正则化,而不对b正则化呢?
原因:也可以对b做正则化,因为w通常是一个高维参数矢量,已经可以表达高偏差问题,w几乎涵盖所有参数而b只是一个变量,因此b的影响不大。
上述是L1正则化,使用了一阶范数。如果使用L1正则化,则w最终是稀疏的(有很多0),据说可以压缩模型(实际影响不大)。
λ是正则化参数,一般使用dev set或者交叉验证集来调整λ。
2.神经网络的正则化
被称作Frobenius norm
其中w的维度是分别指各层隐藏单元的数量。
我们将正则化的使用折射到是算法中,当我们通过反向传播算出后,将,再对通过学习率进行更新。L2正则化通常被称作“weight decay”权重衰减,因为在更新的过程中,相当于对乘以了的权重。
3.L2正则化的原理
减少隐藏单元的影响
如果正则化参数λ增大,则激活函数的参数会相对小,因为代价函数中的参数变大了。由于, 也会很小,而在接近于0的区间内,激活函数基本呈线性,神经网络会被简化,不易发生过拟合。
4.Dropout随机失活
反向随机失活(Inverted Dropout)
dropout以一个三层的神经网络为例:
定义向量d d3表示一个三层的dropout向量
d3 = np.random.rand(a3.shape[0],a3.shape[1]) < keep-prob
keep-prob 表示保留某个隐藏单元的概率
如果keep-prob=0.8的话,意味着每个隐藏单元在d3中对应值为1的概率都是0.8,为0的概率为0.2
从第三层中获取激活函数,a3包含激活函数
a3 = np.mulitply(a3,d3),过滤d3中所有等于0的元素,乘法运算把d3中相应元素置0
a3 /= keep-prob 确保a3的期望值不变
Dropout的原理:压缩权重+完成一些预防过拟合的外层正则化
在使用中,如果某一层不必考虑过拟合的问题,那么可以设置keep-prob为1,这意味着在本层不筛除任何节点。
Dropout一般在计算机视觉领域使用较多,因为缺乏数据等原因,更易出现过拟合。在不出现过拟合的情况下,并没有使用dropout的必要。
5.其他正则化方法
图片:水平翻转图片+裁剪图片
光学字符识别(OCR):旋转或扭曲数字
Early Stopping :
在绘制train set error的同时绘制dev set error,dev set error通常先减少后递增。early stopping要做的是在中间点停止迭代过程。它的缺点是:提早停止迭代有可能会使代价函数的优化不彻底。
四、归一化输入
零均值化:
归一化方差:
(**表示结点y的平方)
当特征在相似的范围内,便于优化
归一化五、梯度爆炸和梯度消失
1.梯度爆炸和梯度消失
为什么会出现梯度消失的现象呢?因为通常神经网络所用的激活函数是sigmoid函数,这个函数有个特点,就是能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是f′(x)=f(x)(1−f(x))。因此两个0到1之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新,这就是梯度消失。
那么什么是梯度爆炸呢?梯度爆炸就是由于初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。
解决方式:我们要保证将权重的初始值赋值近似于1。例如对各个权重矩阵赋值时乘以一个超参数进行调节。
例如:对于ReLU函数 每个权重矩阵*
对于tanh函数 每个权重矩阵* (Xavier Initiation)或者 *
2.梯度检验 :采取双边检测
将所有参数reshape成一个大的向量
for each i:
check -great
其中
梯度检测的使用:
-
用于debug而不是训练
-
如果差距大,检查各个元素来看bug在哪里
-
正则化
-
不可与dropout一起使用
-
(随机初始化)
Reference:
梯度消失和梯度爆炸部分参考了下列文章。如果想要更详细地了解的话推荐阅读。
[1]https://blog.csdn.net/qq_25737169/article/details/78847691
[2]https://blog.csdn.net/weixin_37933986/article/details/69255863
网友评论