您的位置:首页 > 其它

2016.3.25 正则化

2016-05-08 17:43 246 查看
过拟合

网络中存在大量参数,而训练数据如果太少的话,那么这些参数会好尴尬,因为就这么点儿数据还做不好不行啊,于是学啊学啊学,最后就会这么一个了,而且还非常敏感,其他的就学不会了,就好像做数学题就做这么一种题型,考试就好尴尬。

尽管在训练数据集上看上去loss和accuracy都很好,但是在最后的测试集上,这些东西就坑啊坑啊坑。因为学傻了都。

我们观察测试集合的loss会发现和accuracy不同步,即使loss在下降,但是accuracy其实到了之后才会稳定下来,说明这个loss不太合适,和最后的结果不同步,不过这不是关键,loss是为了观察最后的accuracy的,所以accuracy才是幕后的关键。

所以在大网络和小数据集的情况下,容易发生的事情是训练数据集合的准确率都飙飞了,但是测试集合的准确率渣渣的。

所以在训练的时候,即使loss在减少,但是accuracy基本上不变了,这时候就停了就可以了,这个技巧叫做early stopping

还有一点就是如果我们总用test
data来测试accuracy,最后的准确率还是在test data上面的,这就会导致我们的结果以test data为标准,还是过拟合,换了一个数据及可能就不管用了。

所以还有一个技巧就是hold
out,也就是train data,validation data和test data分开,在用train data训练完了之后,使用validation data作为测试,如果效果好了,stop了之后表示这个网络训好了,然后再用test data作为测试。

所以把test data收好,用train
data训练,用validation data看训练是否可以结束了。

那么我们有什么技巧能够避免过拟合呢?

一般有四种方法,分别是l1
l2 dropout和增大数据量

下面先说l2,l2就是在损失函数c的最后添加上对于网络中所有的w的平方项,这就意味着每次w进行学习的时候,要等比例减小,最后减小到能够被应该学习的部分补偿回来就可以了。所以就是这么一种感觉:decay想要w拼命的小,一直到0,但是因为要根据训练数据进行学习,所以其中的一部分可以被训练数据的结果补偿回来,于是就是w尽可能的小,但是也不会太小,基本上和训练数据正相关关系。W小了的好处多多,因为这样就不会因为某个区域特别的大或者特别奇葩,最后影响到整体的结果,因为整体上每一部分都尽可能的减少自己的影响力。

所以l2是一种点到为止的学习方法,差不多就得,别别的都不会了,就会这么一个。

L1和l2稍有不同。

L1增加得是对于|w|的求和,l1和l2的区别就是在update w的时候,到底w的减少是等比例减少还是一个常熟减少,这是根本的差别。

Dropout就是另一个特殊的方法,就是我假设网络的某一部分是可以去掉的,或者说我的网络只有一部分,这样每个网络可以看成是这个一部分网络,最后的结果相当于是每一部分过拟合之后的结果,或者可以说是相互抵消。或者说是多种投票。

最后就是增大数据量,这可以可靠的增强网络的扩展性。因为这实际上是对于实际情况的一种模拟。而且有的时候简单算法+大量数据>复杂算法+少量数据。

相比于没有正则化的c,正则化之后的c能够通过这种方法减少卡在局部最优的结果。

为啥这能够比较好呢?如果用一般性的思考来说,对于一些数据点,如果我们要拟合的话,数据点会有一些噪声,那么这些噪声在高维的拟合中会被拟合住,使得最后的结果受到了噪声的影响。而如果加入了正则化,则会减少权重,实际上是减少了对于特殊值的特别拟合。

问题来了:

1. 如果网络已经确定了参数,能够不用数据算出扩展性。或者使用训练样本+网络来度量出网络的泛化能力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: