正则化Regularization
正则化方法:防止过拟合,提高泛化能力
training data少的时候,或者overtraining时,常常会导致overfitting(过拟合)(即在training上的结果好,但是在testing上的结果却很差)。
通常我们会将数据集分为training data、validation data、testing data
如下图,一般取得最好的training效果时的testing效果都不是最好的,因此我们需要提前stopping training
validation data是用来确定early stopping的,以及确定learning rate 的
避免过拟合的方法有很多:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)包括L1、L2(L2 regularization也叫weight decay),dropout。
L1regularization:
L1正则化就是在代价函数后面再加上一个正则化项:
这里可以不用1/2
上图,L1。当w为正时,更新后的w变小。当w为负时,更新后的w变大。这样使得w接近0
当w等于0时,|W|是不可导的,
所以我们可以规定sgn(0)=0,这样就把w=0的情况也统一进来了。
(在编程的时候,令sgn(0)=0,sgn(w>0)=1,sgn(w<0)=-1)
L2 regularization(权重衰减):
L2正则化就是在代价函数后面再加上一个正则化项:
ηλ比较小,closer to zero ,所以 1−ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。
当然考虑到后面的导数项,w最终的值可能增大也可能减小。
Early Stopping:
Early Stopping也是一种正则化的方法,
目的
为了获得性能良好的神经网络,网络定型过程中需要进行许多关于所用设置(超参数)的决策。
超参数之一是定型周期(epoch)的数量:亦即应当完整遍历数据集多少次(一次为一个epoch)?
如果epoch数量太少,网络有可能发生欠拟合(即对于定型数据的学习不够充分);
如果epoch数量太多,则有可能发生过拟合(即网络对定型数据中的“噪声”而非信号拟合)。
Early Stopping在解决epoch数量需要手动设置的问题。它也可以被视为一种能够避免网络发生过拟合的正则化方法(与L1/L2权重衰减和丢弃法类似)。
根本原因就是因为继续训练会导致测试集上的准确率下降。
原理
将数据分为训练集和验证集
每个epoch结束后(或每N个epoch后): 在验证集上获取测试结果,随着epoch的增加,如果在验证集上发现测试误差上升,则停止训练;
将停止之后的权重作为网络的最终参数。
这种做法很符合直观感受,因为精度都不再提高了,在继续训练也是无益的,只会提高训练的时间。
一般的做法是,在训练的过程中,记录到目前为止最好的验证集精度,当连续10次Epoch(或者更多次)没达到最佳精度时,则可以认为精度不再提高了。
Dropout:
这种方法很具有deep learning的特点。
其运作方式:随机抽取神经元network nueral将其丢掉,用新的network来training。
在每次参数更新之前,都需要进行一次Dropout,也就是对每个mini-batch进行一次Dropout
输入层和输出层的神经元是不变的,只是Dropout隐藏层的神经元。
使用dropout的流程: 假定dropout的比例为0.5,首先随机删掉网络中一半的隐藏层神经元;然后将输入数据进入到被Dropout的网络中前向传播,然后将得到的损失结果通过修改的网络反向传播;一小批训练样本执行完这个过程后就按照随机梯度下降法更新保留的神经元对应的参数;(一个batch对应更新一次参数),
记住:
1.是在training的时候Dropout,在testing时是不需要的!!!
2.在训练时Dropout的概率设为p%的话,那么在testing时所有的w都要乘上1-p%,然后再测试。

为什么有用呢?

对于m各神经元,就有2的m次方种神经网络结构,一种神经网络用一个mini-batch来训练。
在test的时候,不是像下图左边那样把所有神经网络的训练结果取平均,而是像右边那样直接把所有w参数乘上1-p%。我们发现这样的结果和左边得到的结果几乎是近似相等的。
小结:
其实L1、L2和Early Stopping在一定程度上是在做相同的事情,而且L1、L2有时候的使用会有一定的限制。
一般我们初始化参数都是接近于0 的,这时候再使用L1、L2的话反而会使参数变大。
对于Dropout,即使是对于非线性的神经网络,这种方法也是起作用的。