第八章:深度学习归纳

目录

➢Part One.正则化方法概述

➢一、数据集

➢1.数据集分类

➢二、过拟合和欠拟合

➢1.过拟合

➢2.欠拟合

➢三、误差分析

➢1.偏差

➢2.方差

➢3.泛化误差

➢四、深度学习的一般步骤

➢Part Two.参数范数正则化

➢一、正则化的概念

➢二、范数的概念

➢三、参数范数正则化的概念

➢四、L2正则化

➢五、L1正则化

➢六、L1与L2的区别

➢七、稀疏表示

➢Part Three.数据增强

➢一、数据增强的概念

➢Part Four.Batch Normalization

➢一、数据的预处理

➢1.Feature scaling

➢2.神经网络中的Feature scaling

➢Part Five.Bagging

➢一、集成学习

➢二、Boosting

➢1.Boosting分析

➢三、Bagging

➢1.Bagging分析

➢Part Six.Dropout和DropConnect

➢一、Dropout

➢1.Dropout的工作过程

➢2.Dropout的实现

➢3.Dropout的解释

➢4.DropConnect

➢5.DropConnect与Dropout的异同

➢二、提前终止概念

➢三、提前终止实现

➢四、提前终止算法:额外训练

➢Part Eight.中英文术语对照


这次的博客我们主要介绍一些Deep Learning训练方面的一些技巧,以便于提高模型的扩展性,避免overfitting等问题,以及可以提高训练的收敛速度,非常有用的是Batch Normalization和Dropout(都有现成的函数,直接调用即可)。

Part One.正则化方法概述

➢一、数据集

➢1.数据集分类

数据集一般会分为以下三个类别:

训练集(Training set)用于模型训练拟合的数据样本

验证集(Validation set):是模型训练过程中单独留出的样本集,它可以用于帮助调整模型的超参数和用于对模型的能力进行初步评估

   • 例如:SVM中参数c和核函数的选择,或者选择网络结构

   • 注意:我们在一般的实践过程中,验证集可能有,也可能没有,我们一般会从训练集中分出来一部分作为验证集

测试集(Test set)用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据

➢二、过拟合和欠拟合

大部分情况下我们喜欢在项目实践刚刚开始的时候就使用比较复杂的模型进行训练,所以,过拟合会比较常见。另外欠拟合现象比较少见的另一个原因是:因为在训练集上误差都很大的话,那我们就会认定这不是一个好的模型,所以欠拟合不常见;而训练样本上模型训练的很好,我们会习以为常的认为这就是一个很好的模型,所以过拟合较为常见。

➢1.过拟合

❑ 过拟合

– 是指模型能很好地拟合训练样本,而无法很好地拟合测试样本的现象,从而导致泛化性能下降

– 为防止“过拟合”,可以选择减少参数、降低模型复杂度、增加正则化项

➢2.欠拟合

❑ 欠拟合

是指模型还没有很好地训练出数据的一般规律,模型很简单,不足以拟合程度数据的规律

为防止“欠拟合”,可以选择调整参数、增加迭代深度(因为模型距离收敛还有一定的距离)、换用更加复杂的模型

下面我们用一个图来直观的说明一下:(疑问:应该是过拟合)

➢三、误差分析

误差分析当中常见的几个物理量:偏差、方差和泛化误差

➢1.偏差

 ❑ 偏差(bias)   

– 反映了模型在样本上的期望输出与真实标记之间的差距,即模型本身的精准度,反映的是模型本身的拟合能力

– 在训练集上,训练好的一个模型,来一个新的样本,我们就会得到一个估计值,这个估计值和真实值之间的差异就是偏差

➢2.

❑ 方差(variance)

– 反映了模型在不同训练数据集下学得的函数的输出与期望输出之间的误差,即模型的稳定性,反应的是模型的波动情况

– n个不同的训练集,对应我们得到n个不同的模型,现在来一个新的样本,在每一个模型都走一遍,我们就会得到n个估计值,对于这个新的样本估计值之间的方差比较大的话,则表明模型不是很稳定(疑问:这里的不同的数据集指的是什么???而下面又说方差是验证集的?????)

➢3.泛化误

❑ 泛化误差(Generalization Error)    

度量训练所得模型在总体数据上得到的预估值和标签值偏离程度的期望

– 总体数据在实际中我们是无法得到的,如果我们能够得到总体的数据的话,那么我们直接使用整体数据训练就可以了,因为可列举的数据也就没有必要分析模型的泛化能力了,所以我们通常会有一个测试集,来了一个新的样本,我们预估和标签之间的误差,取期望值,就是泛化误差。我们的期望就是泛化误差越小越好,我们实际在训练的时候是不使用测试集的,所以我们在训练的时候尽量的让训练集的误差小,但是训练集的误差越来越小的话,还会出现过拟合的问题。

我们对上述的情况做举例说明(训练集和验证集上的模型的分类的性能):

❑ ①、④两种情况模型在训练集误差都很小,这种就称为low bias,说明训练的很到位了,我们会认为模型比较好

❑ ②、③两种情况模型在训练集误差都很大,这就称为high bias,我们会认为这个模型不是很好

 ❑ ①情况下,验证集相比训练集误差上升了很多,这就是high variance  

刚才我们在介绍方差的时候,实际上要在不同的训练集上训练多个模型,然后计算方差。训练集的误差这么小,验证集的误差这么大,那么他们两个之间的差异就反映了方差,就说明了在不同的数据集上的波动是很大的

❑ ②情况下,虽然它的验证集误差更大,但是相比它的训练集误差,基本没太大变化

两种误差都很大,既是high bias,又是high variance,这样的模型我们一看就知道不是好的模型

情况下,训练集误差大,验证集误差相比训练集误差更大

这是Low bias,又是high variance,这是最差的一种情况

❑ ④情况下,验证集误差相比训练集误差上升很小,我们说是Low variance   

两种误差都很小,既是Low bias,又是Low variance,这样的模型我们一看就知道是好的模型

通过下面这个图我们直观的看一下什么是过拟合,什么是欠拟合,我们通过两个数据集:训练集和验证集说明,这样我们就会比较容易的准确的判断出什么是过拟合什么是欠拟合

我们假设人类的判别的误差为0,性能最强。那么偏离人类判别的程度我们看做是bias, 在验证集上偏离训练集的程度的差异我们认为是variance

➢四、深度学习的一般步骤

基于以上的分析,我们在深度学习的过程中,就可以按照以下的过程来做:

先判断一下在训练集上训练的是否准确?训练误差是不是减小到很小的程度?如果是训练了很多次数,模型也收敛了,误差不减少了,但是仍然是high bias的情况,那么说明模型有问题,我们就需要增加网络层数、神经元的数量等等,如果说训练过程中误差还是在减小,说明没有收敛,所以我们就继续训练,增加迭代的次数就可以。另外一种情况就是high variance的情况,如果出现这种的情况,我们就很难通过前面的策略来解决了,我们只能增加正则化,或者增加数据量,或者减少网络参数以降低模型的复杂度。

➢Part Two.参数范数正则化

➢一、正则化的概念

❑ 好的模型

在训练数据上表现好(基本要求)

且在新输入(测试数据)上有较好的泛化性。(重点)因为我们应用的时候就是在测试数据上

– 训练数据上模型不好,测试数据上模型也一定不好,我们一般会使用调整网络结构的方法解决

– 在测试数据上的模型不好,我们一般会使用正则化的方法解决

正则化(Regularization

广义正则化:通过某种手段使学习算法在训练误差变化不大的情况下,使得泛化误差显著降低的方法

– 狭义正则化:不减少网络参数,只约束网络参数,进行参数范围调整的方法。即“给损失函数加一个正则化项(挂坠)”

正则化相当于挂坠”

➢二、范数的概念

❑ 机器学习中,很多时候都需要衡量一个向量的大小,此时便需要用到范数的知识

❑ 范数是将向量映射到非负值的函数,它满足三条性质:

常用范数:L_{p}范数是使用最为广泛的一种范数,|| \overrightarrow{x} ||_{p}=(\sum_{i} |{x_{i}}|^p)^\frac{1}{p},其中p=2 时,该范数等价于向量和原点的欧

几里得距离,也就是2范数

有时候也需要衡量矩阵的大小,在深度学习中,最常见的做法便是使用Frobenius范数(F范数),即||\mathbf{A}||_{\mathbf{F}}=\sqrt{\sum _{i,j}\mathbf{A}_{ij}^\mathbf{2}}

关于范数的更加详细的介绍可参见:https://zhuanlan.zhihu.com/p/26884695

➢三、参数范数正则化的概念

通过简单地在原来的损失函数J(\cdot )后添加一个参数范数正则化项\Omega (\theta )来限制模型的学习能力,正则化后的损失函数可表示为\widetilde{J}:

加上这样的正则化项,实际上就是起到了一个约束的作用,这样我们就是在一定程度上限制了模型在训练集上的学习能力,因为我们的模型的最好的学习能力应该是损失函数最小(蓝色部分),但是我们现在又加入了正则化项,相当于我们不仅是要让蓝色部分尽可能的小,还有就是这个参数不能太大(红色部分),所以在一定程度上限制了学习能力。

其中,α是正则项系数,它是一个超参,需要我们自己确定,用来权衡惩罚项Ω对损失函数的贡献。

– 若α0,表示无正则化;α越大,正则化惩罚越大。

我们希望正则化后的训练误差(第一项,蓝色)最小,又希望模型尽量简单(第二项,红色)

❑ 当最小化正则化后的损失函数时候,其实是同时降低原有损失函数J(\cdot )和正则化项Ω(θ)的值,一定程度减少了过拟合的程度

❑ 为什么会有这样的作用呢?通俗来说,正则化就是让参数,如权重w多几个等于0,或者接近于0,说明该节点影响很小,如果是神经网络相当于在神经网络中删掉了一些节点,这样模型就变简单了

❑ 我们给参数加了一个范数约束,例如:L_{2}范数,我们最小化参数的话,参数的正则化最小就是0,我们的正则化就是把参数往0的方向拉。而我们原有的损失函数就是让模型往训练样本的节点上逼近,因此这两种情况会达到一个折中,即:不仅让这些网络中的某些参数变得非常小,接近于0,使得模型变得简单一些;还会使得原有的损失函数的让其本身不要偏离样本值太远

❑ 为了让参数多几个为0,对于正则化项Ω, 定义如下3种范数:

L_{0}范数是一个非常直观的表达模式,因为就是非0的个数尽量的少,0.1和0.001在L_{0}范数上是没有变化的,除非是0,L_{0}范数才会小。L_{0}是计数的,是非0项数的个数,没有办法求导。

➢四、L2正则化

L_{2}正则化主要用于线性回归,又称为岭回归(Ridge Regression) 或权重衰减(Weight decay),添加的正则化项形式如下:

我们通常是用L_{2}范数的平方,这样做是为了求导方便,前面的\frac{1}{2}是为了消去求导出现的常数2。这样的话,损失函数就是在原有的损失函数之上再加上L_{2}范数,损失函数如下:

 L_{2}参数正则化分析(单步)  

对于某一模型,假设要对其所有的参数进行参数正则化,则正则化后的整体损失函数\widetilde{J}如下:

– 公式里面的w是向量,行向量w乘以列向量w^{T}得到的就是每一个元素的平方再求和

计算梯度,沿着梯度的负方向,更新参数

使用单步梯度下降更新权重:

w需要沿着负梯度的方向进行更新,\lambda是学习率。这样在更新的时候,正则化会把权重往小变一些,不让他变得特别大

在进行每步梯度更新前,先对参数w进行了缩放。因此,这也是权重衰减名称的来源

 ❑ L2参数正则化分析(整个训练过程)

  w^* :未正则化的损失函数J得到的最小损失权重向量,即:

w^* 附近对损失函数做二次近似(展开到二次项即可),近似的\hat J(w)如下:

HJw^*处计算的Hessian矩阵。当\hat J(w) 取得最小值时,其梯度应为0,即②=0;然后\hat J(w)w求导以后得到的结果如下:

引入L_{2}正则化项的梯度,设变量\widetilde{w}使得\hat J(w)最小

– 求得:

因为𝑯是对称矩阵,可分解为H=Q\Lambda Q^{T} Q^T=Q^{-1},所以带入得到:

前面这部分\Lambda是由特征值构成的一个对角矩阵;后面这部分\alpha I是由正则系数构成的对角矩阵,这两部分求和在取逆得到绿色部分。其中的\lambda _{1},\lambda _{2}...\lambda _{n}是特征值,\Lambda =\begin{bmatrix} \lambda _{1} & 0& ...& 0&\\ 0& \lambda _{2} & ...& 0& \\ ...& ...& ...& ...&\\ 0& 0& 0& \lambda _{n} \end{bmatrix},一个对角矩阵求逆矩阵就是在求矩阵里面的元素的倒数。对角矩阵和对角矩阵相乘就是对角线元素相乘。

后面的橙色的部分中的\Lambda Q^T表示特征矩阵和特征向量的标准正交积所定义的一个变换,w^*参数向量,这个变换乘以参数向量,相当于把参数向量w^*变换到特征矩阵和特征向量的标准正交基所定义的空间上

当特征值\lambda _{i}比较小时,对角线上的元素\frac{\lambda _{i}}{\lambda _{i}+\alpha }比较接近于0;

当特征值\lambda _{i}比较大时,对角线上的元素\frac{\lambda _{i}}{\lambda _{i}+\alpha }比较接近于1;

可见,权重衰减是沿着𝑯的特征向量的标准正交基所定义的轴缩放w^*

对于特征值\lambda _{i}比较大的那些值对应的参数,其收缩程度是比较小的,因为\frac{\lambda _{i}}{\lambda _{i}+\alpha }比较接近于1

对于特征值\lambda _{i}比较小的那些值对应的参数,其收缩程度是比较大的,因为\frac{\lambda _{i}}{\lambda _{i}+\alpha }比较接近于0,此时\alpha的分量大

相当于:当原损失函数在特征值大的方向进行下降时,正则化项对其影响较小;在特征值小的方向进行下降时,正则化项会对其进行限制。也就是说,保证了原损失函数沿着损失下降最大的方向下降

进一步通过下面的图说明带正则化的损失函数和原来的损失函数有怎样的折中的过程:我们且先认为参数是二维的,椭圆形代表原来的损失函数的等值线,其最优点就是点w^*,它的优化过程就是沿着最优的方向(负梯度的方向:红线)。如果我们在损失函数上面没有加入正则化的话,那么最优的就是w^*,但是如果有了正则化项,那么新的目标损失函数的最优值应该是在椭圆等值线上;过原点的虚线的圆的等值线是L_{2}范数,折中在这里的体现就是两个圆圈的交点(椭圆代表原损失函数,稍微取值大一些,不应该在w^*点上就行,虚圆代表正则化项,不应该为0,因为这样会导致原损失函数的取值比较大,各自折中,逐渐扩大,交点就是带有正则项的最优点)

交点就是带有正则项的最优点,这个最优点究竟是在哪里,是由正则化系数\alpha决定的。如果\alpha比较大:那么虚圆小,椭圆大;如果\alpha比较小:那么虚圆大,椭圆小(极限的情况就是特别小,小到\alpha =0,此时最优点是w^*

这个时候我们可以从图中直观的看出,新的最优点\widetilde{w}相对于原最优点w^*w_{1}的方向上收缩的是比较明显的;新的最优点\widetilde{w}相对于原最优点w^*w_{2}的方向上收缩的是不太明显的。这个时候我们可以看出来,其实在w_{2}的方向上,原来的损失函数下降的是比较快的;在w_{1}的方向上,原来的损失函数下降的是比较慢的,也就是说:w_{1}对原来的损失函数的影响是比较小的;w_{2}对原来的损失函数的影响是比较大的。L_{2}的正则约束实际上是把原来对损失函数影响小的那些参数尽可能的给你缩小,缩小到0,相当于去掉它们,使的模型变得简单一些。而对于原来那些比较大的重要的参数,收缩的程度是比较小的,这样就保证原来的损失函数也是沿着损失下降最大的方向在下降。(疑问:为什么在1这个方向上,原来的损失函数下降的比较慢呢?????)

总之,我们要知道L_{2}范数是让不重要的参数要尽可能的小,重要的参数也减小,只不过是减小的相对弱一些

❑ 特征选择\overrightarrow{x_{i}}的大部分元素(也就是特征)都是和最终的输出y_{i}没有关系;但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确y_{i}的预测。稀疏规则化算子的引入就是为了完成特征自动选择,它会学习去掉这些没有作用的特征,也就是把这些特征对应的权重置为0

❑ 可解释性: 患病回归模型y=w1*x1+w2*x2+…+w1000*x1000+b通过学习,如果最后学习到的w*就只有很少的非零元素,例如只有5个非零的w_{i},也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了

对于这种的问题,我们一般采用的是L_{1}范数,因为L_{0}范数是计数的一个范数,非0系数的个数,但由于其优化求解再用梯度下降法求解的时候不是很好求解,所以我们更多的是用L_{1}范数代替L_{0}范数,L_{1}范数可以认为是L_{0}范数的一个很好的近似

➢五、L1正则化

❑ L1正则化又称为Lasso回归(Lasso Regression),在损失函数中添加带有正则化参数wL1-范数(即w所有参数绝对值之和)作为正则化项

损失函数:

 ❑ L1参数正则化分析  

– 求最优参数的时候,计算梯度:

–  L_{1}范数是一个绝对值||w||,在等于0的那个点是不可导的,在大于0和小于0的区间上是可导的,所以我们一般会把这部分的求导写成符号函数的形式。其中,sign(w)只是简单的取w各个元素的正负号。L1正则化与L2不大一样,不一定能得到J(w,X,y)二次近似的直接算术解

w* :未正则化的损失函数J得到的最小损失权重向量,即:

w* 处对正则化后的损失函数进行二次泰勒展开:

– 𝐻是Jw*处计算的Hessian矩阵。当\hat J(w)取得最小值时,其梯度应为0:

– 和L2范数的处理过程不同的是:L1正则项在完全一般化的Hessian矩阵无法得到清晰的代数表达式,进一步假设Hessian为对角矩阵,即𝐇 = diag([H_{1,1}, ⋯ ,H_{n,n}]) ,且H_{i,i}> 0 。(如果线性回归问题中的数据已被预处理,去除输入特征之间的相关性,那么这一假设成立,这一假设指的就是Hessian矩阵变为对角矩阵)

可将目标函数二次近似分解为关于参数的总和

最小化这个近似损失函数可得

这里我们在直观的再次说明一下:

首先解释一下“符号应该一致才合理”的原因:

假设w_{i}^{*}在原点的右边,正则项是找一个在w_{i}^{*}附近的w_{i},使得w_{i}w_{i}^{*}之间的距离尽可能小,同时w_{i}的绝对值也是尽可能的小。所以说我们不可能在原点的左边找w_{i},因为我们如果在原点的左边找到一个w_{i},那我们一定总会在原点的对称的右边找到一个w_{i},右边的w_{i}更符合。w_{i}w_{i}^{*}应该是同样的符号。

其次我们对分类的结果做进一步的说明:

得到的参数\widetilde{w}的各个元素可能为0。因此,与L2正则化相比,得到的参数更加稀疏.

原来的损失函数用椭圆表示,最优点在w^*的位置。L_{1}范数在二维图形上面就是四边形。同理,四边形一点一点的向外扩,椭圆也是一点点的向外扩,最先相交的很大程度是相交在坐标轴上,这样的话,L_{1}范数比L_{2}范数可以更好的实现稀疏性的约束。对原来的损失函数影响小的那些系数,尽可能的降为0;而对原来的损失函数影响大的那些系数,收缩的尽可能的慢一些。

➢六、L1与L2的区别

 ❑ L2范数更有助于计算病态的问题(病态的问题指的是方程有小的扰动,会使得求解有较大的波动,这个系统也会被认为是不稳定的系统)

 ❑ L1相对于L2能够产生更加稀疏的模型

❑ 从概率角度进行分析,很多范数约束相当于对参数添加先验分布,其中L2范数相当于参数服从高斯先验分布;L1范数相当于拉普拉斯分布   

➢七、稀疏表示

❑ 数据集可视为矩阵𝑆,其中矩阵的行数表示样本的数量,矩阵的列数则表示对应的特征。在很多应用中,矩阵𝑆中存在很多零元素,但这些零元素并不是以整列、整行形式存在

如在文档分类领域,我们将每一篇文档作为一个样本,那么数据集可表示为每一行表示为一个文档,每一列为一个字(词),行列交汇处就是某字(词)在某文档中出现的频率

❑ 如果矩阵𝑆是普通的非稀疏矩阵,稀疏表示目的是为这个普通稠密表达的样本𝑆找到一个合适的字典,将样本转换为疏表示(Sparse Representation)形式,从而在学习训练的任务上得到简化,降低模型的复杂度。亦被称作字典学习Dictionary Learning)

稀疏表示的本质是使用尽可能少的数据表示尽可能多的特征,并且同时也能带来计算效率的提升

 稀疏表示学习

– 给定数据集为x_{1},x_{2},...,x_{n} ,我们要学习一个字典,把样本变换到一个稀疏的空间。字典学习可表示为

其中𝐵∈R^{d\times k} ,𝑘为字典的词汇量, a_{i}R^{k}则是样本x_{i}R^d的稀疏表示。找到字典B,把原来的非稀疏的样本数据集x_{i}变换成稀疏的形式;变成稀疏的形式的同时我们要约束变换之后的系数\alpha,也就是保证这个样本数据可以在字典上找到稀疏的表达。即:第一项保证能够通过字典𝐵由稀疏表示a_{i}重构样本数据x_{i} ,第二项保证a_{i}尽可能稀疏。学习任务则是求解字典𝐵,以及x_{i}稀疏表示{\color{Red} a_{i}} ,可采用变量交替优化的策略进行学习———固定一个,求解另一个。

变量交替优化的策略

– 第一步,初始化一个固定字典𝐵,按照LASSO解法求解下式,从而可为每一个样本x_{i}求得对应的a_{i}

第二步,利用求得的a_{i}更新字典𝐵,求解下式进行更新

其中X=(x_{1},x_{2},...,x_{m})R^{d\times m}A=(\alpha _{1},\alpha _{2},...,\alpha _{m})R^{k\times m}||\cdot ||_{F}为矩阵的Frobenius范数

对字典矩阵𝐵进行初始化之后反复迭代上述两步,最终则可求得字典𝐵和样本x_{i}对应的稀疏表示a_{i}

Part Three.数据增强

数据增强是非常好理解的。如果我们的模型发生过拟合,最直接有效的方式就是数据增强:增加训练的数据量。但是这样的最有效而直接的方法是不容易做到的。比如我们做分类问题时候,会涉及到给很多的数据做标注,其实是很难得。但是我们要知道有这样的方法。有条件可以做到的时候,我们去标注数据,会有很好的效果。

一、数据增强的概念

 ❑ 数据增强(Data Augmentation)  

可以简单的理解为对训练数据数量的扩充, 利用已有的有限数据产生更多的有效数据 。如图像空间变换、像素颜色变换。
原因:深度学习离不开大规模标签数据集的出现,如果数据量太少,极有可能使得模型陷入过拟合之中。
目的:避免过拟合、提高泛化性
实现: OpenCV PIL 及深度学习框架内嵌方法,都有现成的函数,直接调用即可

基于图像处理的方法

空间变换 :最常见也是最直观的图像增强手段之一,如对图像进行 随机翻转、旋转、平移、裁剪等操作 ,在实际进行数据增强操作时,可以同时进行多种操作。
像素颜色变换 :对图像像素值进行修改,如在原始图片基础上进行 对比度扰动、饱和度扰动、颜色变换、噪声扰动等操作

基于深度学习的方法

基于 GAN 的数据增强( GAN-based Data Augmentation ):使用 GAN 生成模型来生成更多的数据,可用作解决数据不足,类别不平衡问题的过采样技术
神经网络风格转换( Neural network Style Transfer ):通过神经网络风格迁移来生成不同风格的数据,防止模型过拟合

❑ 基于图像处理的数据增强方法

示例:如在深度学习框架Keras中有一个专门ImageDataGenerator类可用于进行简单的数据增强,其参数如下

可以自定义参数:

❑ 基于深度学习的方法

– 对抗生成网络数据增强

– 风格转换网络数据增强(不同风格的同一个图像,应该是对应相同的label)

❑ 需要指出的是,对数据进行数据增强也需要视情况而定。如在人脸检测任务中,则不太适合对数据进行垂直翻转;

❑ 在手写数字识别任务中,为了区别69的区别,也不适合对数据进行垂直翻转以及旋转过大角度  

所以,具体的数据增强的方式,我们要根据具体的情况进行数据增强。

Part Four.Batch Normalization

Batch Normalization是目前在深度学习训练中被广泛使用的技巧

一、数据的预处理

1.Feature scaling

❑ Feature scaling

如果我们的数据有很多的feature的话,那么我们会对这些feature进行调整,有一种调整方式就是去掉feature的均值。每个feature会被normalize到一个0均值、标准差为1的范围内,这个就是对feature做了一个scaling,通常处理后会使得训练收敛加快。

例如:特征在不同的scale上。x_{1}的范围可能是在1,2……这样的范围上;而x_{2}的范围可能是在100,200……这样的范围上。这样的话,在神经网络中,参数w_{1}的变化对损失函数的影响是比较小的;而参数w_{2}的变化对损失函数的影响是比较大的,w_{2}的梯度会非常大,如果此时我们的学习率也是比较大,那么它会在最优点附近来回的跳动,无法很好的收敛。这种的现象我们可以通过调低学习率来解决,但是由于w_{1}的梯度比较小,学习率又很小,这个时候的收敛速度会非常慢,出现了顾此失彼的现象。另外一种解决办法就是接下来要说的feature scaling,通过feature scaling我们把scale限制在相同的方向。这样参数w_{1}w_{2}的变化对损失函数的影响是相同的,这个时候我们就可以使用稍微大一些的学习率,加速收敛。所以feature scaling有助于我们的训练

2.神经网络中的Feature scaling

 ❑ 神经网络中的feature scaling  

现在的处理中,为了充分的利用并行的计算资源,都是基于batch的求解。每次都是输入一批特征向量,然后并行处理。在神经网络内部做feature scaling的时候,可以在输入和权重相乘产生的特征z^i上做feature scaling,也可以在经过激活函数Sigmoid之后产生的特征a^i上做feature scaling。两个位置都是可以的。但是更多的人趋向于在进入激活函数之前的位置做feature scaling。好处是对于一些激活函数,例如Sigmoid,这个激活函数在0附近的梯度是比较大的。我们在做feature scaling的时候就是将均值变为0,方差变为1,这样的话,它(附近的梯度)会在一定程度上抑制梯度消失的问题,因为在0附近的梯度是比较大的。所以人们考虑的是在加权之后做feature scaling

(疑问:特征向量就是样本吗?????)

求feature的均值\mu和方差\theta,我们是希望求得的这种均值和方差是近似于整个训练样本的大量数据的均值和方差,所以在应用Batch normalization的时候,Batch是不可以选择得太过于小的。选择的Batch Size需要比较大,否则没有意义了。

./就是每个元素做除法。

在测试阶段如何得到µ和σ?刚才介绍的是有Batch normalization的时候我们如何去训练,如何在每一层做Batch normalization,在测试阶段我们也是需要有µ和σ。

比较理想的情况是,我们对所有的训练集,再做一遍网络,得到每一层的特征z^i,然后在计算均值和方差,但是这样的话,复杂度会很高,因为训练集的样本的个数很多,训练完以后还需要从头到尾过一遍,计算代价会比较高。

在实际的情况中,我们更常用的是基于滑动平均的方式来计算,即:在开始的时候,计算每一个Batch的时候,我们会记录下其均值和方差,下一个Batch的时候,我们也记录下其均值和方差,然后计算二者的平均,这样滑动平均,一步步地每一个Batch,所有的Batch计算完了以后,其的平均值也就得到了。这个过程中有一个问题,就是整个网络在训练的过程中,参数W^i时是不断在变化的,网络是在慢慢的趋于收敛,在开始的Batch计算的特征z^i,其实不是我们最终得到的那个特征z^i,所以在开始的时候使用特征z^i计算的µ不是很准,随着训练的迭代次数的增加,µ才渐渐的趋于准确。这样的话,我们在使用滑动平均的时候,可能要加一些权重,保证当前时刻的权重要比上一时刻的权重要大一些,越往后,慢慢的这个µ才收敛了。最终得到的µ和σ我们在测试的时候使用就可以了

以上便是Batch normalization在训练和测试的时候的简单的过程

 ❑ Batch Normalization的流程 

 ❑ Batch Normalization的优势  

可以加速训练,使用相对较大的学习率(不存在不同的参数处于不同的level的现象)

降低梯度消失的风险

特别对于sigmoid这种函数

学习过程受初始化影响较小

• 例如我们的W^i在初始化的时候,初始化成0.1或者0.k,这样的话,通过Batch Normalization就可以被消除了,因为z^i\mu\sigma都是扩大了k倍,分子分母约掉k。也就是不管是使用W^i还是W^i\times k,最终的结果是一样的。所以在一定程度上可以降低初始化影响。

Part Five.Bagging

一、集成学习

后面将要介绍的Dropout和DropConnect使用了集成学习的思想。集成学习将多个弱学习器进行结合,通过对样本加权、学习器加权,获得比单一学习器显著优越的泛化性能的强学习器的学习方法

有2种方式:Boosting和Bagging

二、Boosting

 ❑ 个体学习器间存在强依赖关系、必须串行生成的序列化方法 

1.Boosting分析

先训练第一个学习器,经过第一个学习器之后,我们可以有多种处理方式,例如:这个学习器预测出来的结果和样本做差。然后后面的学习器就在这个传参域上进行学习;或者我们根据第一个样本调整权重;对于一些特别难分的,把其权重增大一点,使得第二个学习器有效分类;第二个学习器分类以后再进行调整训练样本的权重,保证下一个学习器能够有效区分。这样的话,多个学习器联合起来。

三、Bagging

❑ 个体学习器间不存在强依赖关系、可同时生成的并行化方法

训练样本是随机采样产生,导致每一个学习器都是在不同(尽管有部分训练样本会有overlap)训练样本上进行训练。这样就会训练出来多个不同的学习器 

❑ Bagging是一种集成学习算法,设计用来改进统计分类与回机器学习算法的稳定性和精确度。它也用来降低方差以帮助避免过拟合(但是不会降低偏差,高偏差模型不适Bagging。即对整体的误差的降低主要是对里面的方差的降低)。

❑ Bagging通常应用在决策树算法, 但是它也可以应用到其他算法中。Bagging模型平均方法的一个特例,当然也可以用投票的方式。

❑ Bagging基于自助采样法(Bootstrap Sampling),给定包含m个样本的初始训练集S,我们进行m次放回采样,得到包含m个样本的采样集S’,用每一个采样集训练一个学习器

因此在采样数据集中会缺少一些来自原始训练集中的样本,同时也会包含一些被多次选中重复的样本

❑ 在含m个样本的训练集中,计算一个样本在m次放回采样中始终不被选中的概率:

❑ 通过自助采样法,数据集中约有36.8%的数据不会被选中到采样集中

❑ 基于自助采样法构造𝑘个含有𝑚个训练样本的采样集,并在每个采样集上进行训练得到𝑘个模型

❑ 每个采样集之间所含样本的差异会导致𝑘个模型之间存在差,在测试集上产生的误差就不同,而这也是Bagging方法能够起作用的原因

❑ 如果是分类算法,则𝑘个模型投出最多票数的类别或者类别之一为最终类别;如果是回归算法,对𝑘个模型得到的回归结果进行算术平均得到的值为最终的模型输出

1.Bagging分析

❑ 假设构造的第i个模型在每个样本上的误差是\epsilon _{i},并且\epsilon _{i}从均值为零、方差为E[\epsilon _{i}^2]=v,且协方差为E[\epsilon _{i},\epsilon _{j}]=c的多维正态分布

❑ 所有模型的平均预测误差的平方,可以写成是期望的形式,是:

如果我们构造的模型非常的好:每个模型之间都是独立的。那么此时会有协方差c=0,平均预测误差的平方是\frac{1}{k}v,也就是变为原来的\frac{1}{k},即方差变为原来的\frac{1}{k},也就是说Bagging的方式构造的模型是独立的话,那么可以有效的改善预测误差,降低方差的这部分,变为原来的\frac{1}{k}

对上面的分析进行总结:

❑ 如果误差完全相关( 𝑐 = 𝑣 ),均方误差减少到 𝑣 ,因此模型平均没有任何帮助
❑ 在误差完全不相关( 𝑐 =0 )的情况下,该集成平方误差的期 望即为 𝑣 /𝑘
❑ 因此, 集成平方误差的期望会随着集成规模增大而线性减 。集成至少会和它的任何成员表现得一样好,并且如果成员的误差是独立的,集成将显著地比其成员表现得更好
❑ 神经网络 能找到足够多的不同的解,意味着他们可以从模 型平均中受益 ( 即使所有模型都在同一数据集上训练),也可以使用Bagging让神经网络得到更好的预测,即使我们是使用相同的训练集进行训练。
❑ 神经网络中 随机初始化的差异、小批量的随机选择、超参 数的差异或不同输出的非确定性实现 往往足以使得集成中的不同成员具有部分独立的误差。
❑ 神经网络中我们采用不同的初始化,会得到不同的模型;还有我们采用不同的Batch去训练不同的模型的话,也可能会得到神经网络的不同的参数,等等……

因此,基于以上的内容,人们就提出了,在神经网络中利用Bagging这种的集成思路的方式来提高模型的性能,避免overfitting。

Part Six.Dropout和DropConnect

一、Dropout

Dropout计算简单、功能强大,大多数神经网络模型都可以使用,目前为止,大多数的深度神经网络都使用了Dropout正则化方法。我们需要掌握好这种方法。

➢1.Dropout的工作过程

❑ 训练深度神经网络的一种技巧(Trick),在每个训练批次中,删掉部分的神经元节点,即在网络前向传播的时候,让某些神经元的激活值以一定的概率p 输出为0

输入层和隐藏层都可以 dropout 一些神经元
隐藏层概率通常取 0.5
输入层 dropout 概率通常取 0.2,因为输入层比较重要,不能丢掉太多

❑ 这种方式可以减少层间节点的相互作用,因此可以明显地缓和过拟合现象

❑ 使模型泛化性更强,因为它不会太依赖某些局部的特征

❑ Dropout改变网络结构  

相当于训练一个简化的网络” thinned network”瘦身网络

➢2.Dropout的实现

❑ 训练过程

将网络中的隐层神经元的 激活值 输出 )以概率 p 随机置 0 每次迭代激活值置零的神经元是不同的,是随机的
对网络进行正向、反向传播,即训练网络 (反向 传播时激活值被置0神经元的参数保持没有被删除前的值,其他神经元的参数被更新。相当于对瘦身后的网络正常的训练即可,删掉的神经元删掉就删掉了,不用管了。
重复这一过程,直至训练结束

标准的网络结构和Dropout网络训练过程中前向计算

我们主要对Dropout网络训练过程中前向计算进行说明:以一定的概率p,产生mask,产生的这个mask对前面的神经元有一个随机的Drop。例如以50%的概率dropout一些神经元。那么r_{j}^{(l)}中会有一半为0,第l层的神经元的输出有50%的为0,到下一层(l+1)的时候,有一半的神经元对l+1层有输入,这样的话,相当于Drop掉了一些神经元

标准的网络结构和Dropout网络结构计算过程对比

在Dropout网络结构计算中:前一层的神经元的输出y_{j}^{(l)}上直接乘上mask的值r_{j}^{(l)}

测试阶段

以上我们说的是在训练阶段,在测试阶段:不再使用丢掉神经元的带有Dropout的瘦身网络,而是所有的神经元都使用,即完整的网络。

测试时使用所有神经元;
所有神经元的激活值(即权重)需要乘以 1- p;
这样的话,就近似的实现了Bagging的Average的效果

我们来分析一下,为什么乘以1-p会有这个效果

如果测试的时候,对w_{1},w_{2},w_{3},w_{4}不作任何处理的话,那么近似得到的z值是2倍,即{z}'=2z。因为w_{1},w_{3}是可以预测出来一个z,w_{2},w_{4}y也是可以预测出来一个z。这个时候,乘以1-p就是相当于对其进行了一个规范化,调整到相同的level上

➢3.Dropout的解释

也有很多人从不同的角度对Dropout进行解释:

❑ 有效性的解释

不同的解释角度:数据增广,稀疏约束……

集成学习(Ensemble learning)

Dropout可以视作一种高效的近似Bagging的集成方法,并且是共享隐层单元的集成方法。可以理解为每次训练随机丢弃节点值,使得模型前后存在差异。即:在隐藏层单元是参数共享的,每次训练的时候,会随机丢掉一些神经元,使得模型之间有差异。

❑ Dropout使得隐层节点不一定每次都出现,减少了隐层节点之间的复杂的共适应关系:神经网络中高层和低层之间具有比较紧密的依赖关系,丢掉一些节点的话,会使得高层对低层的依赖降低,因为恰好依赖的那个节点就有可能丢掉了

❑ 这样权值的更新不再依赖于有固定关系的隐层节点的共同作用,阻止了某些特征仅仅在特定特征下才有效果的情况,迫使网络去学习更加鲁棒的特征

❑ Dropout的近似Bagging集成方法解释

在训练的时候:将训练数据集,分成多个mini-batch,每个网络相当于Dropout掉一些神经元,变成不同的网络

在测试的时候:每一个网络产生一个输出y,然后Average取平均求得\overline{y},但是现实中,我们的网络个数可能很多,我们不可能把每一个y存放下来,在求的其平均值。所以实际操作是无法做到的

因此提出了下面的这样的方法:用每一个mini-batch去训练一个网络的时候,每一个mini-batch去训练一个子网络。不同子网络之间的神经元参数共享,所谓的参数共享就是说:在子网络A中的某个神经元a是没有被Dropout掉的,那么这个神经元a会在这个子网络中被更新参数,然后在子网络B中假设也有这个神经元a(未被Dropout),那么这个子网络B中更新参数的时候会使用之前在子网络A中被更新的值上,继续更新。

这种方法之所以有效是因为,没有采用平均的方式,而是采用完整的网络结构,所有的神经元都在权重上乘以1-p,实现了所有的瘦身网络平均的一个效果。

我们再用线性的网络稍微简单的解释一下:我们假设以50%的概率Dropout掉一些神经元对该网络进行训练,有4种可能的情况,采用Bagging方式进行平均,我们最终得到的训练出来的权重是\frac{1}{2}(w_{1}x_{1}+w_{2}x_{2})。 1-DropRate=1-50%=\frac{1}{2}

即:在神经网络接近lineardropout性能会好,比如ReLUMaxout激活函数。但是我们的神经网络一定不是线性的,也就说明一定不会等于\frac{1}{2}(w_{1}x_{1}+w_{2}x_{2}),但是是会得到一个很好的近似。

➢4.DropConnect

❑ DropConnect也是通过舍弃一部分单元来防止过拟合问题的方法

– DropConnect 可以认为是 Dropout 的扩展。 它是丢掉神经元和神经元之间的连接,包含权重和偏置 ,即不需要进行激活操作前的线性变换
它比 Dropout 效率更高且性能得到提升,但两者还是比较相似,差别不大

➢5.DropConnect与Dropout的异同

左边是Dropout的结构,它对于激活函数的输出,在进行一定概率的关闭部分神经元

右边是DropConnect的结构,它不是关闭神经元;而是丢掉的是权重

Dropout可以看做是DropConnect的一个特例,因为如果我们把x_{1}的权重连接1,2,3都置为0,那么相当于神经元m被丢掉了,所以权重边实际上是可以实现更细粒度的控制。虽然DropConnect的识别性能优于Dropout ,但是其训练难度也高于Dropout。人们更多的使用的是Dropout,因为训练起来更简单一些

二、提前终止概念

 ❑ 随着训练迭代次数的增加,训练误差也在逐步降低。但是会发现验证集损失先下降后在某个节点开始上升的现象  

提前终止( Early stopping )目的则在于 找到这个上升的时间点,并及时终止模型的训练,降低过拟合的现象
提前终止是深度学习中最常用的正则化方法,可单独使用或与其他正则化策略结合使用
– 开始的时候模型是比较好的拟合数据,随着迭代次数的增加,模型越来越接近于拟合噪声,出现过拟合现象

三、提前终止实现

我们需要注意的是,并不是在验证集上,当前这一轮的误差上升了,我们就立即终止,因为我们在训练过程中的误差是波动的,不会是像上面的这个图一样,非常平滑的下来,在训练集上也是具有波动的,需要尽量避免训练波动导致的提前终止

四、提前终止算法:额外训练

❑ 使用提前终止策略过程中需要使用到验证集(Validation Set),这也就意味着在训练过程中会有一部分数据无法进行训练。

❑ 数据宝贵,为了更好地利用验证集中的数据,我们可以 完成提前终止后将验证集中的数据加入到训练集中,进行额外的训练 。

由于训练集我们要从中分出来一部分验证集,这个数据非常宝贵的,我们为了充分利用这些数据,有的时候我们还会加上一些额外的训练,把这些验证集加进来,然后再重新训练一下这个网络。在进行额外训练的时候会有不同的策略。

❑ 策略一

在进行额外训练前,已经通过提前终止确定了训练的 最佳步数 。使用 所有的数据 进行训练时,在确定的 最佳步数 时终止训练。
但是值得指出的是,我们 不能确定按照提前终止确定的训练最佳步数再次训练时仍能得到一个最佳的训练 ,因为在进行额外训练时训练集变大了(因为我们在额外训练的时候,把所有的数据集都放在一起了),因此在训练过程中对参数的更新次数也会变多
– 我们在额外训练的时候,把所有的数据集都放在一起了,我们在提前终止得到的最佳步骤,和我们现在得到的最佳步骤,显然不是一样的,因此这种方法有时候不是很有效,了解即可。

❑ 策略二

在提前终止时得到的模型的 基础上fine-tune,即: 再次利用所有的训练集进行训练,在这种情况下我们已经没有验证集可以供我们判断何时终止训练, 但是我们可以 通过监控验证集的平均损失函数 ,直到它 低于之前提前终止时在训练集上的目标损失值,只要低于这个值的时候,我们就终止训练
这个策略相较于上一个策略 避免了重新训练模型 ,但是这种策略甚至无法保证继续训练是否能达到之前的目标值,因为验证集和训练集是不一样的训练集合,我们在训练集上可以达到的误差范围\epsilon,并不能保证在验证集上即使收敛了也能达到比它还小的误差值,所以有可能一直达不到\leq \epsilon
– 是在原来的模型的基础上训练的,复杂度比较低,相当于是fine-tune的结果

 

Part Eight.中英文术语对照

❑ 偏差:Bias           

❑ 方差:Variance

❑ 泛化误差:Generalization error

❑ Lp范数:Lp Norm

❑ Frobenius范数: Frobenius norm

❑ 正则化:Regularization

❑ 岭回归:Ridge Regression

❑ 权重衰减:Weight decay

❑ 数据增强:Data Augmentation

❑ 模型平均:Model averaging

❑ 自助采样法:Bootstrap Sampling

❑ 提前终止:Early Stopping

❑ 稀疏表示:Sparse Representation

❑ 字典学习:Dictionary Learning          

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bertama

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值