L1、L2正则化
L2正则化在神经网络中可能意义并不是很明确,有时候我们会在神经网络中选择其他方案。一个在神经网络中非常常用的方法:dropout
dropout
每次在网络中正向传递时,我们在每一层随机将一部分神经元置0,每次正向传递时,随机被置0的神经元都不是完全相同的,每次处理网络中的一层。
下图左侧为全连接神经网络,右边为dropout的版本。
dropout之后的网络规模变小,我们只使用其中一部分的神经元,每次遍历、每次正向传递,经过的神经元都是不同的部分。
为什么dropout?
有人认为dropout避免了特征间的相互适应,在某种程度上抑制了过拟合。
另一种解释是,这是在单一模型中进行集成学习。每次dropout过后,我们是在一个自网络中用所有神经元的子集进行运算。每一种可能的dropout方式都可以产生一个不同的子网络,所以dropout像是同时对一群共享参数的网络进行集成学习。
(dropout的可能性随神经元的个数呈指数型增长,所以穷举dropout是不可能的)
dropout使用对网络的改变
当我们使用dropout时,整个神经网络的基本运算被改变了。
-
使用dropout之前:我们的神经网络里有权重w的函数f,其输入为x,输出为y。
-
使用dropout之后:我们多了一个输入z,z表示dropout中被置0的项,z是一个随机数。
但是,在测试时引入一些随机性可能并不是一个好主意。假设我们在做图像分类的工作,如果有一张图我们今天认为是猫,明天认为不是了,这是一件很奇怪的事情。我们可能希望一旦这个网络训练好了,在测试的时候能够消除这种随机性。
于是我们就想要消除这个随机性,通过积分来边缘化随机性。但是在实践中,这个积分是难以处理的,我们不知道该如何求解这个积分。
我们可能会想通过采样来逼近这个积分,我们对z进行多次采样求平均,这其实还是引入了一些随机性,并不是很理想。
实际上我们可以使用一种更为简单的方法局部逼近这个积分。考虑单个神经元的输出是a,输入是x和y以及两个权重w1和w2,在测试时,我们得到的a值为a=w1x+w2y。训练时,我们使用丢失率0.5的dropout方法来训练这个网络,我们可以认为,训练时a的期望E[a]=21(w1x+w2y)。这看起来很奇怪,测试时的期望值是训练时的两倍。所以我们有一个简单的方法,在测试时,我们没有任何的随机性,而是直接使用dropout的概率乘以输出。
小结
总结来说,dropout在正向传播中非常简单,我们只需要在实现中添加少数的几行:i)随即对一些节点置0;ii)在测试时的预测函数内,添加一点乘法。
在训练期间,我们给网络添加一点随机性,以防止它过拟合训练数据,在一定程度上扰乱它、防止它完美地拟合训练数据;在测试的时候,我们要抵消掉所有的随机性,希望能够提高我们的泛化能力。
Batch Normalization
batch normalization是一个同样符合dropout思想的正则化方法。
训练时:一个数据点可能和其他不同的数据点出现在不同的小批量中。对于单个数据点来说,在训练过程中该点会如何被正则化具有一定的随机性
测试时:我们通过使用一些基于全局估计的正则化来抵消这个随机性,而不是采用每一小批量来估算。
反转dropout (inverted dropout)
也许在测试的时候我们会更关心效率,所以我们希望在测试的时候消除乘以p这一项乘法运算。
我们可以在测试时使用整个权重矩阵,在训练时除以p。因为训练可能发生在GPU上,我们不介意这个运算的消耗。
数据增强
在训练的时候,有一个最初的版本,我们有自己的数据,以及它们的标签,在每一次迭代中,我们使用它去更新我们的卷积神经网络。但是,我们可以做的是在训练过程中以 某种方式随机地转换图像,标签保留不变,然后用这些随机转换的图像进行训练,而不是原始图像。有时候是翻转,有时候是对局部进行大小上的缩放,有时候是色彩抖动,这样原来是只猫,随机转换后仍旧是一只猫。
在测试过程中,通过评估一些固定的剪裁图像来抵消这种随机性。
dropconnect
不是在每次正向传播中将激活函数置0,而是随机将权重矩阵的一些值置0。