深度学习实战 第4章深度学习正则化笔记
第4章 深度学习正则化
1.机器学习的两个核心任务:
- 尽可能地降低训练错误率
- 提高模型的泛化能力(避免过拟合)
2.可以使用正则化来尽可能地使训练错误率与测试错误率之间的差距变小。
3.正则化就是降低验证错误率(有时需要牺牲训练错误率)的一系列方法。
4.从降低泛化错误率的角度出发,伟大的前人们已经提出了大量的正则化策略,这其中最重要的方法就是限制学习能力。参数范数惩罚便是最具有代表性的通用参数惩罚措施。
5.有时这些限制与惩罚是我们对于某些任务的先验知识编码,比如图像识别需要旋转、平移不变性。因此哦我们使用卷积、池化、参数共享等限制措施去构建网络。参数绑定与参数共享措施,在特定的任务中加入先验知识去限制网络。
6.我们可以使用伪造的数据来进行数据扩充来帮助网络训练。为了避免训练时间过长,我们可以使用早停(Early-Stopping)的技术去提前终止学习。
4.1 参数范数惩罚
1.机器学习中常用的正则化措施是去限制模型的能力,而这其中最著名的方法便是L0、L1与L2范数惩罚。
2.我们将参数不等于0的个数控制在以内来达到限制模型的目的,这种方法就被称为L0范数惩罚。
3.不要求参数的非零数量被限制在某个范围内,但要求参数数值的总和要小于某个数值,这种方法就叫做L1范数惩罚,也被称为参数稀疏性惩罚。
4.对参数的平方求和进行限制,这就是L2范数惩罚,也就是权重衰减惩罚。
5.我们可以通过的值来控制学习算法模型的能力,越大模型能力就越强,越小模型能力就越弱。该条件极值可以使用拉格朗日乘子法来求解。
6.引入L2正则化的代价函数为
拉格朗日乘子控制着机器学习算法模型的能力,如果=0,则退化为原始模型,值越大,则惩罚越严重,模型的能力越弱。过小,容易发生过拟合现象,而过大,容易发生欠拟合现象。
7.稀疏性的一大好处就是有利于特征选择(Feature Selection),由于大多数参数都为0,而这些0参数对应的特征就没有被使用,实际上我们就选出了一些重要特征对数据进行预测,并自动筛选掉一些无用的特征,这些无用特征很大程度上也有可能是噪声特征。
4.2 参数绑定与参数共享
1.在正则化中,我们经常需要添加一些先验知识去限制参数。虽然我们并不能精确地知道参数需要什么值,但对于特定的领域与特定的模型结构,模型参数之间存在着某些依赖。
2.在机器学习中,某个模型可以完美地识别“猫”,按通过训练,它也可以非常好地识别出“狗”。更具体些,识别“猫”使用的参数和识别“狗”使用的参数会比较接近。因此我们在训练其识别“狗”时,就可以利用识别“猫”的参数进行训练,这种重复利用参数在不同任务中的方法也被称为多任务学习(Multi-task Learning)。
3.在图像识别领域,图像应该具有平移、旋转等空间不变性特征;而对于时间序列数据,数据与数据之间应该具有时间不变性特征。为了提取到这种不变性特征,我们迫使相邻数据特征参数相同,而这种正则化方法也称为参数共享(Parameter Sharing)。
4.卷积神经网络(Convolutional Neural Network, CNN)是目前最流行的一种神经网络,广泛应用于计算机视觉领域。而该网络的核心——卷积操作,其实就是参数共享。参数共享使得卷积网络极大地降低了参数的规模,并且在不增加训练数据量的前提下,增加了网络的尺寸。
4.3 噪声注入与数据扩充
1.想要降低泛化错误率最好的方法是训练更多数据。一个有效而高效的方法就是生成伪造数据(fake data),然后将这些数据添加到训练集中进行数据扩充(Data Augmentation)。
2.生成伪造数据最佳的应用场景是一类特定的分类任务——对象识别,图片是一种高纬复杂的数据,并且有着平移、旋转不变性等特点。我们可以将这些先验知识加到数据中去,即平移、旋转、拉伸之后的图像数据依然是原数据对象。
3.比较算法A与算法B时,我们需要确保这两种算法使用相同的手工设计数据扩充,假设算法A在没有数据扩充时表现糟糕,而算法B在加入人工合成数据后性能优越,这说明不了什么。因为很有可能是合成数据造成了性能的提高,而不是算法B本身具有更好的性能。
4.注入噪声的几种方式:
- 在输入中注入噪声:如数据扩充,主要是迫使算法拥有更强的健壮性。具体应用可以见降噪自编码器(Denoising Autoencoder)。
- 在隐藏层注入噪声:注入噪声也就相当于对参数进行范数惩罚。
- 在类标中注入噪声
4.4 稀疏表征
1.当信息输入进神经网络时,只有关键部分神经元才能够处于激活状态,这就是稀疏表征(Sparse Representations)。
2.如同在参数中使用L1惩罚,通过限制参数的总数之来诱使参数稀疏化一样。在表征惩罚中我们也可以使用相同的方式来诱使表征稀疏化。KL散度(KL divergence),又称相对熵(Relative Entropy)也是一种十分常用的方式。
4.5 早停
1.我们针对过拟合现象所做的正则化措施总结起来有两点:
- 限制模型能力
- 不断加入噪声,给自己增加麻烦
2.真实环境中的验证错误率一般不会随着训练次数的增多而减少,而是形成了一种“U型”曲线,验证错误率先减少后上升。我们期待能在验证错误率的最低点(或最低点附近)停止训练算法,这就是所谓的早停(Early Stopping)。
3.早停算法作为一种超参数。选择超参数其实就是去寻找过拟合与欠拟合的最佳折中点,权重衰减中惩罚因子的取值,梯度下降中步长的选择都被称为超参数。
4.早停的训练过程可以分为两个阶段:第一阶段,划分训练集与验证集,使用验证集监控训练,适当的时候就停止训练;第二阶段就是我们就利用所有的训练数据再次训练模型。
第二阶段利用所有数据的策略:
- 再次初始化模型,然后使用所有的训练数据再训练。
- 利用最佳参数,然后在其基础上使用所有训练数据持续地训练。
4.6 Dropout
1.集成学习通过构建并结合多个学习器来完成学习任务,通常先训练一组个体学习器(individual learner),然后再用某种策略将它们结合起来。个体学习器可以相同也可以不同,如果个体学习器相同,集成就称为是同质的(homogeneous),同质集成中的个体学习器就称为基学习器(base learner),如神经网络就是典型的神经元集成起来的;如果个体学习器不相同,那我们的集成就称为是异质的(heterogeneous),异质集成的个体学习器由不同的学习算法生成,而此时的个体学习器被称为组件学习器(component learner)。
2.集成学习与神经网络对比
集成学习是一种“自底向上”的构建方式,我们先要获得学习器,然后再关注如何将其组织起来形成一个整体。而神经网络通常是一种“自顶向下”的构建方式,我们先将各学习器构建起来,再关注如何学习调整结构内的每个学习器。
3.集成学习最重要的核心思想在于:集体比个体好。集体为什么比个体好?我们需要想到机器学习中的两个核心问题,欠拟合与过拟合问题。对应到集成学习领域也有两个主要的应对措施,那就是Bagging思想与Boosting思想。
4.欠拟合是因为模型能力不足引起的,换言之是因为学习器只能学习到一部分特征,这些特征不足以解释所有的数据特性。这种“弱弱联合”变强的方式在继承学习中就被称为Boosting。
同样地,过拟合问题是因为模型能力太强导致的,换言之就是我们的学习器不仅能学习到数据的特征,还能学习到数据的噪声特征。我们将学习器组合起来形成“强强制约”的情况,这就是集成学习中Bagging的思想。
5.无论是“弱弱联合”的Boosting,还是“强强制约”的Bagging都有一个核心,那就是学习器应该尽可能多样。这里所谓的“多样性”,不仅指集成学习器的数量越多越好,更重要的是学习器之间应该尽可能“不同”,学习器的不同其实就是学习到的数据特征的不同。
6.对于Bagging而言,想要获得多样性的学习器,我们就通过从训练数据中随机采样一定的子数据集进行训练。训练得到学习器后,再将数据放回原始训练集中进行下一次随机采样来训练下一个学习器。如此重复进行,直到学习器的数目达到预设数量为止,这种方法叫自助采样法(Bootstrap Sampling)。这种方法的关键点在于采样率的选择,如果采样率过高,采样数据集的相似性也就过高,学习器的“不同”就很难保证;如果采样率过低,那训练数据不足,个体学习器的性能就较差。在实践经验中,常采用63.2%的采样率,但这并不是一条铁律,最佳的采样率还需要根据具体数据,具体问题进行实验。
对于Boosting而言,我们首先会使用所有训练数据去训练第一个学习器,但该学习器只会对某些数据识别较好,对于另一些数据识别较差(如果都好,就是强分类器了,不需要集成了)。接下来我们就使用下一学习器,着重地学习前一个学习器识别较差的数据,而忽略之前识别较好的数据。如此重复进行,当学习器的数目达到预设数量后停止学习。
7.如何将集成学习与神经网络结合起来?
一个很自然的想法就是将神经网络当作基学习器(个体学习器)来训练,然后再将每个神经网络集成起来,这种方法最大的问题在于需要极大的训练时间及足够的内存消耗。
你能很容易想到,我们会将神经元当作个体学习器进行学习。但如果那样,我们其实又回到传统的同质集成循环中去了。而Dropout所做的就是将神经网经中的弱子神经网络集成起来。我们通过设置激活概率来使Dropout构造若神经网络,该弱神经网络的神经元数量及参数数目(连接权重数量)都被极大的限制了。
8.Dropout分为训练阶段与测试阶段(执行阶段),训练阶段相比于传统的前馈神经网络,只是多了一个神经元采样过程,而训练则采取随机梯度下降或最小批量梯度下降的方式进行。其实就是随机激活一定数量的神经元,然后执行一条或一小批数据,对激活的神经元进行误差反向传播修正权重,然后再次随机激活神经元训练网络。在测试或执行阶段,将神经元采样过程移除,退化为传统的神经网络进行测试。
Dropout可以看作是集成学习中Bagging的一种形式,通过神经元采样构造不同的网络结构,然后通过采样出不同的数据来训练不同的弱神经网络。但这其中和Bagging还有一个非常不一样的地方,那就是神经元共享。
9.在长期的生物进化中,自然选择的评价标准可能不只是个体的适合度,更需要考虑基因的混合能力。这种能力使得一组基因和另一组基因组合起来能够很好地工作,使基因间的组合更具健壮性。由于基因不能总是依赖父母遗传,其被迫从自身中学习获取优点,或者和其他的基因进行合作。根据这一理论,有性生殖的角色不仅仅是让新基因在种群中传播,而且也有利于降低基因间相互适应的复杂度。
同理,神经网络中的每个隐藏单元经过Dropout训练后,它也必须学习与不同采样的神经元间的合作,这使得神经元具有更强的健壮性,并且驱使神经元通过自身获取到有用特征,而不是依赖其他神经元去纠正自身的错误。在Dropout中,我们引入了一个神经元采样概率p超参数,在默认情况下该值设置为0.5,但这不是一个定量,根据数据和网络的不同,还需要在试验中反复地测试。