前面的部分我们学了怎么构建神经网络以及如何训练,但有时候我们发现结果不如意,那么该怎么办呢?这部分就学习一些解决方法
使用测试集(验证集)
下面哪个模型更优呢?
其实肉眼是不太看的出来的,就算右边的模型好像所有点都分类正确了,但也有可能过拟合,所以我们可以引入测试集(或者验证集),先训练一部分,然后进行测试
结果发现,第一个模型有一个分类错误,第二个模型有两个分类错误,所以跟我们的直觉还是不相符的
因此在机器学习中,我们就是这么做的,每当我们要在可以完成工作的简单模型和复杂模型中选时,我们更倾向于简单模型
例如下图,左边欠拟合,中间刚刚好,右边过拟合
但是现实情况是,我们很难在真实情况下刚好达到一个just right的模型,要么就是欠拟合,要么就是过拟合,我们通常的做法就是在过于复杂模型的一侧犯错,然后通过一些技巧来避免过拟合
早期停止
例如训练一个模型,不同的epoch时模型从欠拟合到过拟合
我们就加一些测试集的数据,分别在这些epoch期测试,然后把训练error和测试error画出来
所以在训练的时候,当testing error开始升高了,我们就停下来,这种方法就叫做早期停止
正则化(Regulation)
这里有个问题,考虑最简单的情况,我们有两个点,一个蓝色的(1,1),一个红色的(-1,-1),对他们进行分类,现在有两个答案,那么下面两个答案哪个的误差更小呢?
答案是第二个,我们用上sigmoid函数,可以进行计算
因为10x1+10x2的函数更窄,其实这在某种程度上算是过拟合,而且它的导数非常大
如何避免这种情况呢?最简单的就是在原来的物产函数基础上对weights加上惩罚系数,可以是加上绝对值和,也可以是平方和。如果是绝对值和,就是L1正则化,如果是平方和,就是L2正则化
一般情况下我们都使用L2
Dropout
假如你要运动,周一打球,周二举铁,周三……,最后你会发现自己有一个非常强壮的右臂
那么假如你周一打球,周二把右手绑起来只练左手,周三把左手绑起来只用右手打球……最后你两个手臂都很发达
神经网络也是这样,有时一些部分的权重会变得很大,而另一些部分得不到训练
因此我们在训练的时候,会选择性关闭一些节点,让剩下的节点得到锻炼,担起责任。在每一轮epoch中,关闭一些节点,就像是给这些节点一个参数,这个参数就是每个节点在特定epoch被drop的概率,这个过程反复进行,最后每个节点都得到相同的处理,这个方法就叫做dropout
随机重新开始
在梯度下降算法中假如存在局部最低点,那么很有可能模型会达到一个局部的最低点,而不是全局的最低点,如何解决这个问题呢?
一个解决办法就是随机从不同的地点开始下降,
本系列笔记来自Udacty课程《Intro to Deep Learning with Pytorch》
全部笔记请关注微信公众号【阿肉爱学习】,在菜单栏点击“利其器”,并选择“pytorch”查看