深度学习《CNN架构续篇 - 正则化》

前言:
这篇是在前面CNN博文的基础上扩展出来写的,前面也说了这一篇需要单独拿出来。
正则化就是为了防止模型过拟合。在机器学习的篇幅分类里也有一片是讲正则化的,那一篇是专门只讲解了L2正则化,而且也写出了在线性回归,逻辑回归,神经网络的代价函数的表达式。

一:L2正则化
这里再次简要提一下,最常见的正则化方式就是L2正则化,在代价哈数后面加上正则项式子,作为对参数的“惩罚”。
在这里插入图片描述

求导也很简单,这里不再赘述之前所讲了。这里主要想讲一下一个新的防止过拟合的方法。

二:Dropout
这个思想来自遗传学,好吧,当我看到这个的时候我突然觉得,这就是常人和大神的区别,同样是学过同样的东西,但是大神就是能从中得到一些灵感并且运用到另一个领域。也许自然界真的还有很多很多我们可以学习的,也许是熟能生巧,当我们对一个事物钻研的越多,越能分析出其中的内涵,越能得到很多新的灵感和感悟,触类旁通。

回到正题,这个想法来自于无性繁殖和有性繁殖,无性繁殖就是将父辈的基因全部继承,有性繁殖就是孩子的基因一部分来自父亲一部分来自母亲,这样不断地重新组合最后无重大的基因是很混乱的。

也就是说按道理来讲,无性繁殖能把父类的基因全部继承,优良的基因也能全部继承,但是自然界为什么选择了有性繁殖作为主要的繁殖方式呢?

原因可能是,无性繁殖正是由于全部继承了父辈的基因,基因变化不大,越稳定,越完美,个体结构越稳定于某个环境。当环境变化的时候,可能就会受到巨大冲击。
而有性繁殖虽然不能大部分继承全部的优良基因,也就是没有全部拟合,降低了个体的完美继承,但是却提高了整体族群的适应能力,在不断变化的基因组合中不断发展,基因突变,群体更加稳定。也许就是男女性别的由来吧。

类比于全连接的神经网络,我们每一层每一个节点的输入都来自于上一层节点的输出,参数过于多的话,容易过拟合,但是却也能完美匹配数据集。这就好比是无性繁殖,毫无丢弃地全盘接受来自上层的输入(基因)。
也是dropout的思想就是,在每一轮迭代中,在每一层的节点中,按照某一个概率随机丢弃或者关闭掉一些节点,随机失活掉。

请注意这段话,在每一次迭代中,也就是每一轮迭代,失活的对象都是不一样的,随机选择的,怎么选择呢?按照概率来选择,按照多大的概率呢?我们观察网络,某一层如果参数过多,可以稍微设置一个大的概率失活,小一点的层,设置小一点的失活概率,也可以简单一点,全部节点是全部一样的失活概率。

在这里插入图片描述

在训练阶段,为了保证前后传递的能量不损失,在L层执行概率P存活策略后,传递到下一个节点的时候,输入值应该除以P,这样能大致保留原始的能量,这样做的最大好处就是保证传递过程中仿佛没有失活一样,输出给出大致相当的能量给下一层。然后在测试阶段就可以完全不用做任何变化,保留所有的节点,也不用做任何多余特殊运算,直接按照正常的前向传播进行运算。

比如:训练阶段,有点点变化,在L层随机选择失活掉一些节点,存活率是P。
Z(L+1) = W(L)*X(L) / P,(这一步骤也叫做反向失活)

在测试阶段,不需要多余考虑按照没有dropout时候的网络进行正常的前向传播运算。

听说这个是很厉害的一个防止过拟合的方法,在网上也看到了有dropout的和没dropout的实验对比,这里我就不做对比了,我再后面用DeeplearningTool的时候做个实验吧,总之使用dropout后,训练误差会上升一点,但是泛化误差就会下降一些。这是好消息啊,对于一个模型来说。

而且dropout有优点就是,每次都是得到一个更瘦一点的网络,对于训练来说也能节省运算时间。模型变得简单一些,就会越能降低过拟合的可能,这个之前也讲过。

三:其他方法
除了如上所述方法,还可以增加数据量来防止过拟合,因为数据量太少的话,很容易让模型学到片面的数据特征,增加数据量就是增加数据特征的多样性,降低拟合。至于数据怎么来呢?比如图片数据,我们可以对原有的图像进行翻转,放大缩小,截取等自己造出图片。
此外呢,观察cost代价的下降曲线图,看到cost不再下降的时候,基本已经处于匹配饱和状态了,此时可以赶紧停止训练了,这个叫做early stop。

猜你喜欢

转载自blog.csdn.net/qq_29367075/article/details/108898012