一、正则化方法
正则化方法的基本思想是,通过加入一个含有解的先验知识的约束来控制函数的光滑性,即为损失函数添加正则项来限制参数权值过大weight decay、降低模型复杂度,正则化方法主要有L1-norm、L2-norm两种方式:
1、L1-norm在参数w较小时能够直接缩减至0,相当于参数服从拉普拉斯先验分布,这种方法倾向于产生少量的特征,降低模型的复杂度,增加网络稀疏性,因此可以防止过拟合。L1-norm的损失函数为:
其中 表示原始的损失函数,n是样本总数或mini-batch等其他样本个数值,注意不要对 正则;λ是正则项系数,衡量正则项所占比重。更新w时对C求偏导可得:
其中α<0为学习率,β=αλ/n为常数。 的更新方式不包括最后一项正则项。sgn为符号参数,由于L1范数|w|在0处不可导,因此在w=0时使用原来未经正则化的更新方程对w进行更新,即:
2、L2-norm一般不会将参数缩减为0,而是一个接近于0的值,相当于参数服从高斯先验分布,这种方法倾向于选择更多的特征,但是参数小使得函数比较平滑,因此可以防止过拟合。L2-norm的损失函数及w更新方程为:
其中α<0为学习率,β=αλ/2n为常数。 的更新方式不包括最后一项正则项。神经网络需要每一层的神经元尽可能的提取出有意义的特征,因此L2正则用的比较多一些。
二、结合多种模型
根据集成学习的思想,训练多个模型,以每个模型的平均作为结果。考虑k个回归模型的例子,假设每个模型的误差为服从零均值、方差为 且协方差为 的多维正态分布,通过所有集成模型的平均预测所得误差、集成模型的MSE分别为:
,
在误差完全相关即c=v的情况下,MSE减小为v,则集成模型平均没有任何帮助。在误差完全独立即c=0的情况下,MSE仅为v/k,会随着集成的大小线性地减小。神经网络中随机初始化的差异、mini-batch的随机选择、超参数的差异或不同输出的非确定性的实现往往足以引起集成中不同成员的误差部分独立。
Bagging:采用有放回的bootstrap方式构造k个不同的数据集,每个数据集与原始数据集数量相同;训练得到k个模型,对这k个模型的输出使用加权平均法或投票法决定测试样本的输出。这种方法的计算成本增加,因此k值不能太大,一般为5-10。
三、dropout
一般对于同一组训练数据,利用不同结构的神经网络训练后,求其输出的平均值可以减少过拟合。dropout就是依据这个原理,每次训练随机删除一定比例(一般为一半)的神经元,相当于在不同结构的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能只依赖某几个神经元(指层与层之间相连接的神经元),使神经网络能学习到神经元间更加健壮的特征,强迫网络拥有冗余的表示、提高了泛化能力,因此dropout不但可以减少过拟合,还能提高准确率。
2种dropout训练方法:
(1)训练时按照一定的比例令隐藏层神经元节点失效,在后面benchmark实验测试时,部分实验在隐藏层失效的基础上,使输入数据也按一定比例(20%)失效,这样得到的效果更好。
(2)去掉权值惩罚项,改为限制权值范围,给每个权值设置一个上限,如果权值在更新的过程中超过了这个上限,则把权值设为这个上限的值。这样不但可以避免权值过大,还能够使用一个比较大的学习率加快学习速度。
Dropout的算法流程如下:
(1)对第 层第 j 个神经元产生一个随机数(掩码) ;
(2)将这个神经元乘以随机数作为新值 ;
(4)反向传播最小化 并更新权重。
由于真正运行整个神经网络时意味着两倍的隐神经元将被激活,为了抵消这个影响,需要将隐层权重减半后再进行测试——Inverted Dropout。
dropout类似Bagging采样过程近似实现,但训练时Bagging的所有模型是独立的,而dropout的所有模型共享一套参数。Bagging中每个模型在其相应的训练集上训练到收敛。dropout中大部分模型没有被显式地被训练,因为父神经网络通常很大,几乎不可能采样完指数级数量的子网络;取而代之的是,在单个步骤中训练一小部分子网络,通过参数共享使得剩余的子网络也有好的参数设定。
正则化是通过给损失函数添加正则项的方式减少过拟合,dropout是通过直接修改神经网络的结构来减少过拟合。
四、提前终止Early stopping
随着训练次数的增加,验证集的误差会先减小后增大。
在模型对训练数据集迭代收敛之前停止迭代来防止过拟合,即在每一个Epoch(一个Epoch为对所有的训练数据遍历一次)结束时,计算验证集数据的准确率,当准确率不再提高时停止迭代。在训练时要记录目前为止最好的准确率,当连续10次或更多次epoch准确率没有提高时,就可以停止迭代了。这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取10、20、30等。
五、噪声robustness
上一篇介绍过将噪声用于输入数据集的增强策略,还有其他一些添加噪音的正则化方法:
(1)向隐藏层单元添加噪音进行正则(如dropout等),这可以被看作是在多个抽象层进行的数据集增强,在噪声的幅度被仔细调整后,这种方法是非常高效的。
(2)将噪声加到权重上,主要应用于RNN,可以解释为一个关于权重的贝叶斯推断的随机实现,使用贝叶斯处理学习过程将权重视为不确定的、且能通过概率分布表示的值。这种正则化推动模型进入对权重小变化相对不敏感的区域,找到的点不只是极小点,而且是由平坦区域所包围的最小点。
(3)向输出目标注入噪声,大多数数据集的y标签都有一定错误,此时最大化logp(y|x)效果不好,可以使用label smoothing基于k个输出的Softmax函数把明确分类的0和1替换为概率形式,使用交叉熵损失函数、权重衰减的其他正则化策略,防止模型追求明确值而不妨碍正确分类。
六、半监督学习
在半监督学习的框架下,P(x)产生的未标记样本和P(x,y)中的标记样本都用于估计P(y|x),或者根据x预测y。在深度学习的背景下,半监督学习通常指的是学习一个表示h=f(x),学习表示的目标是使用相同类中的样例有类似的表示。
构建一个模型,其中生成模型p(x)或p(x,y)与判别模型p(y|x)共享参数,而不用将无监督和监督部分分离。可以对监督准则 与无监督或生成的准则 或 进行权衡。生成模型准则表达了对监督学习问题解的特殊形式的先验知识,即P(x)的结构通过某种共享参数的方式连接到P(y|x)。通过控制在总准则中的生成准则,可以找到比纯生成或纯判别训练更好的权衡。
七、多任务学习
多任务学习是通过合并几个任务中的样例(可视为对参数施加的软约束)来提高泛化能力的一种方式,额外的训练样本以同样的方式将模型的参数推向泛化更好的方向,当模型的一部分在任务之间合理共享时,模型的这一部分被更多地约束为良好的值。
上图为多任务学习中非常普遍的一种形式,其中不同的监督任务(给定x预测 )共享相同的输入x以及中间层表示,能够学习共同的因素池,该模型通常可以分为两个部分和相关参数:
(1)具体任务的参数,只能从各自任务的样本中实现良好的泛化,如图中上层部分。
(2)所有任务的共享参数,从所有任务的汇集数据集中获益,如图中下层部分。
因为共享参数的统计强度有很大的提高(共享参数的样本数量相对于单任务模式增加的比例),可以改善泛化和泛化误差的范围。从深度学习的观点来看,底层的先验知识为:能解释数据变化(在与之相关联的不同任务中观察到)的因素中,一些是跨两个或更多更任务共享的。
八、批量正则化Batch Normalization
在Google Inception V2中采用的BN方法是非常有效的正则化方法,可以加快模型的收敛速度,提高泛化能力以及收敛后分类的准确率。
BN方法在训练某层时,会对每一个mini-batch数据进行标准化处理,使得输出规范为(0,1)范围的正态分布,减少了内部神经元分布的改变。
变换重构步骤:,当, 时则神经元的输入在经过BN层后还原为原始的输入,这一步使神经网络在归一化后能够一定程度上还原为原始输入,提升模型的容纳能力。
传统的DNN每一层的输入的分布不是统一的,因此训练困难,只能选择用一个很小的学习率;但是每一层使用了BN后,就可以有效的解决这个问题,提升学习速率。
参考资料
deep learning http://chuansong.me/n/1388189552659
https://www.zhihu.com/question/59201590
https://blog.csdn.net/heyongluoyao8/article/details/49429629
https://blog.csdn.net/qq_36330643/article/details/78445130
https://blog.csdn.net/Left_Think/article/details/77684087?locationNum=5&fps=1
http://www.cnblogs.com/eilearn/p/9203186.html