欠拟合:
欠拟合表示模型在训练集上的表现比较差,具体表现就是模型在训练集上的误差比较大,原因就是模型表现不了数据
欠拟合的缓解办法:
- 采用更大的模型
- 使用更多的特征
- 使用更好的优化算法,比如说加入momentum或者RMSprop,或者使用更好的算法,比如Adam。
- 寻找更好的新神经网络架构,或者说更好的超参数。这些手段包罗万有,你可以改变激活函数,改变层数或者隐藏单位数,虽然你这么做可能会让模型规模变大。或者试用其他模型,其他架构,如循环神经网络和卷积神经网络。
- 注意使用更多的数据是不能缓解欠拟合的,毕竟现在数据少模型都表现不了数据,数据多了更表现不了,所以说增加更多的数据并不是万能的,得具体情况具体分析
过拟合:
过拟合表示的是模型在训练集上变现很好但是测试集上表现不行,可以看下面的吴恩达的课上的这个图,本来虚线就已经挺好的,但是模型为了在训练集上取得比较好的变现就产生了一个弯弯曲曲的分类面,但其实这个分类面反而不能很好的反应数据,那一个圆圈有可能都是异常点,所以就造成训练的时候loss很小,但是一测试误差就很大。
过拟合的缓解办法
-
采用更多的数据:这个一般是最管用的办法,数据少的时候训练出来的模型的泛化能力就很差,就会过拟合,数据多了这个问题就会缓解一点。
-
正则化:比如L1和L2正则化,L1正则化是在原来的损失函数后面加上一项
λ 2 m ∥ w ∥ \frac{\lambda}{2 m}\|w\| 2mλ∥w∥ L2正则化是在原来的损失函数后面加上一项
λ 2 m ∥ w ∥ 2 \frac{\lambda}{2 m}\|w\|^{2} 2mλ∥w∥2
直观上比较好理解为什么L1和L2正则化会有用:因为过拟合的模型一般都是比较复杂的,参数都是会比较大的,L1和L2正则化相当于加了一个惩罚项,告诉模型不要太复杂,而参数lamda其实就是用来控制这个惩罚项有多大来进行平衡的。这里要注意,如果用的是L1正则化,w最终会是稀疏的,也就是说w向量中有很多0,有人说这样有利于压缩模型,因为集合中参数均为0,存储模型所占用的内存更少。实际上,虽然L1正则化使模型变得稀疏,却没有降低太多存储内存,所以大家越来越倾向于使用L2正则化。 -
Dropout(随机失活),dropout做的就是以一定概率让一些节点失活,可以直接理解为以一定概率删除网络中的某一些节点,比如说下面的这张图,每一层以50%的概率让节点失活:
这里我们介绍一种常见的dropout方法:inverted dropout(反向随机失活),大概的做法就是我们设置一个概率keep-prob,这个概率表示保留多少节点,比如说第三层的keep-prob是0.8,那么我们就保留第三层80%的节点,具体操作我们可以产生一个向量d,这个向量里面的值都是0,1,1的个数占到了整个向量长度的keep-prob,然后我们用这个向量去乘以神经网络某一层的激活函数,比如说a3=np.multipy(a3,d3),这样我们就达到了让一些节点失活的目的,需要注意几点:
1、每一层都可以设置不用的keep-prob值,你如果觉得某一层不可能是过拟合的原因,你就可以把那一层的keep-prob设置为1,也就是不使用dropout
2、反向随机失活(inverted dropout)方法通过除以keep-prob,确保最后结果期望值不变
3、我们训练的时候,每一次遍历数据集,可能会让不同的节点失活
4、测试时我们不会使用dropout,因为在测试阶段进行预测时,我们不期望输出结果是随机的,如果测试阶段应用dropout函数,预测会受到干扰。
-
Dropout为什么有用:
1、在训练过程中会产生不同的训练模型,不同的训练模型也会产生不同的的计算结果。随着训练的不断进行,计算结果会在一个范围内波动,但是均值却不会有很大变化,因此可以把最终的训练结果看作是不同模型的平均输出。
2、它消除或者减弱了神经元节点间的联合,降低了网络对单个神经元的依赖(某个神经元或者特征随时可能被失活),从而增强了泛化能力。 -
dropout的缺点:dropout一大缺点就是代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。定义明确的代价函数J每次迭代后都会下降,因为我们所优化的代价函数J实际上并没有明确定义,或者说在某种程度上很难计算,所以我们失去了调试工具来绘制这样的图片。通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数,希望在dropout过程中,代码并未引入bug。
-
Data augmentation(数据增强):对数据进行一些旋转拉伸变换,生成更多的数据
-
early stopping:神经网络在变现的比较好的时候就让训练停下来
Early stopping的优点是,只运行一次梯度下降,你可以找出w的较小值,中间值和较大值,而无需尝试L2正则化超级参数λ的很多值。
缺点就是你不能独立地处理训练和测试这两个问题,因为提早停止梯度下降,也就是停止了优化代价函数J,因为现在你不再尝试降低代价函数J,所以代价函数J的值可能不够小,同时你又希望不出现过拟合,你没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题。