FightingCV

V1

2022/10/11阅读:27主题:默认主题

【CV知识点汇总与解析】| 正则化篇

【CV知识点汇总与解析】| 正则化篇

【写在前面】

本系列文章适合Python已经入门、有一定的编程基础的学生或人士,以及人工智能、算法、机器学习求职的学生或人士。系列文章包含了深度学习、机器学习、计算机视觉、特征工程等。相信能够帮助初学者快速入门深度学习,帮助求职者全面了解算法知识点。

1、过拟合(Over fitting)的定义

为了更好的描述欠拟合和过拟合,先借用一下吴恩达课程中的一张图来描述一下。

对于一个简单的数据集(x,y),x代表特征,y代表结果。 上图中的左边这幅图,它采用了只有两个参数的hypothesis: 。我们可以看到这个函数不能很好的拟合所有的点,也称这个模型欠拟合

对于中间这幅图,它加了一个特征,从而得到有三个参数的hypothesis: 得到图中的一条曲线,我们可以看到其拟合效果还算可以。

对于最右边的这幅图,我们在最左边的图的基础上给它添加了多个参数是hypothesis变成了一个五次多项式: 。我们可以看到这个曲线穿过了图中所有的点,但是用于测试数据时,其正确率可能会很低,因为他过分拟合了测试集中的数据而使假设变得过度严格,这种情况可称之为过拟合。过拟合的征兆一般是在训练集上正确率很高,但是在测试集上正确率很低。

2、出现过拟合的一些原因

(1)建模样本抽取错误,包括(但不限于)样本数量太少,抽样方法错误,抽样时没有足够正确考虑业务场景或业务特点,等等导致抽出的样本数据不能有效足够代表业务逻辑或业务场景;

(2)样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系;

(3)建模时的“逻辑假设”到了模型应用时已经不能成立了。任何预测模型都是在假设的基础上才可以搭建和应用的,常用的假设包括:假设历史数据可以推测未来,假设业务环节没有发生显著变化,假设建模数据与后来的应用数据是相似的,等等。如果上述假设违反了业务场景的话,根据这些假设搭建的模型当然是无法有效应用的。

(4)参数太多、模型复杂度高

(5)决策树模型。如果我们对于决策树的生长没有合理的限制和修剪的话,决策树的自由生长有可能每片叶子里只包含单纯的事件数据(event)或非事件数据(no event),可以想象,这种决策树当然可以完美匹配(拟合)训练数据,但是一旦应用到新的业务真实数据时,效果是一塌糊涂。

(6)神经网络模型

a.由于对样本数据,可能存在隐单元的表示不唯一,即产生的分类的决策面不唯一.随着学习的进行, BP算法使权值可能收敛过于复杂的决策面,并至极致.

b.权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征.

3、解决模型训练过拟合有哪些思路?

(1)权值衰减. 主要应用在神经网络模型中

它在每次迭代过程中以某个小因子降低每个权值,这等效于修改E的定义,加入一个与网络权值的总量相应的惩罚项,此方法的动机是保持权值较小,避免weight decay,从而使学习过程向着复杂决策面的反方向偏。

(2)适当的stopping criterion

在二次误差函数的情况下,关于早停止和权值衰减类似结果的原因说明。椭圆给出了常数误差函数的轮廓线,Wml表示误差函数的最小值。如果权向量的起始点为原点,按照局部负梯度的方向移动,那么它会沿着曲线给出的路径移动。通过对训练过程早停止,我们找到了一个权值向量w。定性地说,它类似于使用检点的权值衰减正则化项,然后最小化正则化误差函数的方法得到的权值。

(3)验证数据

一个最成功的方法是在训练数据外再为算法提供一套验证数据,应该使用在验证集合上产生最小误差的迭代次数,不是总能明显地确定验证集合何时达到最小误差.

(4)交叉验证

交叉验证方法在可获得额外的数据提供验证集合时工作得很好,但是小训练集合的过度拟合问题更为严重.原理图

(5)添加正则项

L1正则更加容易产生稀疏解、L2正则倾向于让参数w趋向于0.

(6)针对树模型

a.在树过于大之前便停止生长每个叶中至少需要多少个数据(threshold)如何判断这个阈值(threshold)是重点【可以考虑用假设检验/P-值

b.等树生长到足够大之后进行修剪修剪枝叶,直到任何改动都会降低正确率

(7)防止过拟合用到一些方法** early stopping数据集扩增(Data augmentation)正则化(Regularization)Dropout**。

4、什么是正则化

首先了解一下正则性(regularity),正则性衡量了函数光滑的程度,正则性越高,函数越光滑。(光滑衡量了函数的可导性,如果一个函数是光滑函数,则该函数无穷可导,即任意n阶可导)。

机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1和ℓ2中文称作L1正则化和L2正则化,或者L1范数和L2范数。L1,L2其实就是数学里面范数,用范数刚好可以达到我们想要的目的。1范数的定义就是绝对值的和,2范数就是平方和

L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)

正则化是为了解决过拟合问题。在Andrew Ng的机器学习视频中有提到。解决过拟合的两种方法:

方法一:尽量减少选取变量的数量。人工检查每一个变量,并以此来确定哪些变量更为重要,然后,保留那些更为重要的特征变量。显然这种做法需要对问题足够了解,需要专业经验或先验知识。因此,决定哪些变量应该留下不是一件容易的事情。此外,当你舍弃一部分特征变量时,你也舍弃了问题中的一些信息。例如,也许所有的特征变量对于预测房价都是有用的,我们实际上并不想舍弃一些信息或者说舍弃这些特征变量。最好的做法是采取某种约束可以自动选择重要的特征变量,自动舍弃不需要的特征变量。

方法二:正则化。采用正则化方法会自动削弱不重要的特征变量,自动从许多的特征变量中”提取“重要的特征变量,减小特征变量的数量级。这个方法非常有效,当我们有很多特征变量时,其中每一个变量都能对预测产生一点影响。正如在房价预测的例子中看到的那样,我们可以有很多特征变量,其中每一个变量都是有用的,因此我们不希望把它们删掉,这就导致了正则化概念的发生。

5、L1和L2正则化的直观理解

右上角那个彩色的一圈圈的就是误差项的函数。最小化的时候就是这两个相交的时候。左边的L1函数图像是带一个尖角的。明显更容易相交在数轴上,就是为整数的点上,这样就会有更多的刚好为0的解。而L2相交在圆弧上,各种位置都有可能。

上图代表的意思就是目标函数-平方误差项的等值线和L1、L2范数等值线(左边是L1),我们正则化后的代价函数需要求解的目标就是在经验风险和模型复杂度之间的平衡取舍,在图中形象地表示就是黑色线与彩色线的交叉点。

彩色线就是优化过程中遇到的等高线,一圈代表一个目标函数值,圆心就是样本观测值(假设一个样本),半径就是误差值,受限条件就是黑色边界(就是正则化那部分),二者相交处,才是最优参数。

左图中这个顶点的值是(w1,w2)=(0,w)。可以直观想象,因为L1函数有很多『突出的角』(二维情况下四个,多维情况下更多),没有加正则项的损失函数与这些角接触的机率会远大于与L1其它部位接触的机率,而在这些角上,会有很多权值等于0,这就是L1可以产生稀疏模型的原因,进而可以用于特征选择。

右图中二维平面下L2正则化的函数图形是个圆,与方形相比,被磨去了棱角。因此没有加正则项的损失函数与L相交时使得w1或w2等于零的机率小了许多,这就是L2正则化不具有稀疏性的原因。

L2正则化相当于为参数定义了一个圆形的解空间,而L1正则化相当于为参数定义了一个菱形的解空间。L1“棱角分明”的解空间显然更容易与目标函数等高线在脚点碰撞。从而产生稀疏解

L1 regularization

在原始的代价函数后面加上一个L1正则化项,即所有权重w的绝对值的和,乘以λ/n(这里不像L2正则化项那样,需要再乘以1/2)

同样先计算导数:

上式中sgn(w)表示w的符号。那么权重w的更新规则为:

比原始的更新规则多出了η * λ * sgn(w)/n这一项。当w为正时,更新后的w变小。当w为负时,更新后的w变大——因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合

另外,上面没有提到一个问题,当w为0时怎么办?当w等于0时,|W|是不可导的,所以我们只能按照原始的未经正则化的方法去更新w,这就相当于去掉ηλsgn(w)/n这一项,所以我们可以规定sgn(0)=0,这样就把w=0的情况也统一进来了。

(在编程的时候,令sgn(0)=0,sgn(w>0)=1,sgn(w<0)=-1)

L2 regularization(权重衰减)

L2正则化就是在代价函数后面再加上一个正则化项:

C0代表原始的代价函数,后面那一项就是L2正则化项,它是这样来的:所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。另外还有一个系数1/2,1/2经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与1/2相乘刚好凑整。

L2正则化项是怎么避免overfitting的呢?我们推导一下看看,先求导:

可以发现L2正则化项对b的更新没有影响,但是对于w的更新有影响:

在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为 1−ηλ/n ,因为η、λ、n都是正的,所以 1−ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。

另外,需要提一下,对于基于mini-batch的随机梯度下降,w和b更新的公式跟上面给出的有点不同:

对比上面w的更新公式,可以发现后面那一项变了,变成所有导数加和,乘以η再除以m,m是一个mini-batch中样本的个数。

到目前为止,我们只是解释了L2正则化项有让w“变小”的效果,但是还没解释为什么w“变小”可以防止overfitting?一个所谓“显而易见”的解释就是:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。当然,对于很多人(包括我)来说,这个解释似乎不那么显而易见,所以这里添加一个稍微数学一点的解释(引自知乎):

过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。

而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。

6、 L1和L2正则化的区别

  1. **L2 regularizer **:使得模型的解偏向于 norm 较小的 W,通过限制 W 的 norm 的大小实现了对模型空间的限制,从而在一定程度上避免了 overfitting 。不过 ridge regression 并不具有产生稀疏解的能力,得到的系数 仍然需要数据中的所有特征才能计算预测结果,从计算量上来说并没有得到改观。因为L1范数正则化项的“稀疏解”特性,L1更适合用于特征选择,找出较为“关键”的特征,而把一些不那么重要的特征置为零。

  2. L1 regularizer : 它的优良性质是能产生稀疏性,导致 W 中许多项变成零。 稀疏的解除了计算量上的好处之外,更重要的是更具有“可解释性”。L2范数正则化项可以产生很多参数值很小的模型,也就是说这类的模型抗干扰的能力很强,可以适应不同的数据集,适应不同的“极端条件”。

一般回归分析中回归w表示特征的系数,从上式可以看到正则化项是对系数做了处理(限制)。

L1正则化和L2正则化的说明如下:

  • L1正则化是指权值向量w中各个元素的绝对值之和,通常表示为||w||1

  • L2正则化是指权值向量w中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为||w||2

那添加L1和L2正则化有什么用?下面是L1正则化和L2正则化的作用,这些表述可以在很多文章中找到。

  • L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择

  • L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合

7、知道BN吗?有什么作用与优势?

BN(Batch Normolization)是Google提出的用于解决深度网络梯度消失梯度爆炸的问题,可以起到一定的正则化作用。我们来说一下它的原理:

批规范化,即在模型每次随机梯度下降训练时,通过mini-batch来对每一层卷积的输出做规范化操作,使得结果(各个维度)的均值为0方差为1

BN操作共分为四步。输入为 ,第一步计算均值:

第二步计算数据方差:

第三步进行规范化:

第四步尺度变换和偏移:

表示mini-batch中的数据个数,可以看出,BN实际就是对网络的每一层都进行白化操作白化操作是线性的,最后的“尺度变换和偏移”操作是为了让BN能够在线性和非线性之间做一个权衡,而这个偏移的参数 是神经网络在训练时学出来的。

经过BN操作,网络每一层的输出小值被“拉大”,大值被“缩小”,所以就有效避免了梯度消失和梯度爆炸。总而言之,BN是一个可学习、有参数(γ、β)的网络层

8、BN训练和测试有什么不同?

训练时,均值和方差针对一个Batch

测试时,均值和方差针对整个数据集而言。因此,在训练过程中除了正常的前向传播和反向求导之外,我们还要记录每一个Batch的均值和方差,以便训练完成之后按照下式计算整体的均值和方差

上面简单理解就是:测试模型中,对于均值来说直接计算所有batch 值的平均值;然后对于标准偏差采用每个batch 无偏估计(无偏估计是用样本统计量来估计总体参数时的一种无偏推断)

最后测试阶段,BN的使用公式就是:

9、介绍一下BN和LN?有什么差异?LN是在哪个维度上进行归一化?

LN:Layer Normalization,LN是“横”着来的,对一个样本,经过同一层的所有神经元归一化

BN:Batch Normalization,BN是“竖”着来的,经过一个神经元的所有样本归一化,所以与batch size有关系。

二者提出的目的都是为了加快模型收敛,减少训练时间。

10、 要同时使用BN和dropout该如何使用?

同时使用BN和dropout时,可能存在方差偏移的问题

针对方差偏移,论文给出了两种解决方案:

  1. 拒绝方差偏移,只在所有BN层的后面采用dropout层(现在大部分开源的模型,都在网络的中间加了BN,我们也就只能在softmax的前一层加加dropout了,效果还行,至少不会比不加dropout差。还有另外一种方法是模型训练完后,固定参数,以测试模式对训练数据求BN的均值和方差,再对测试数据进行归一化,论文证明这种方法优于baseline)

  2. dropout原文提出了一种高斯dropout,论文再进一步对高斯dropout进行扩展,提出了一个均匀分布Dropout,这样做带来了一个好处就是这个形式的Dropout(又称为“Uout”)对方差的偏移的敏感度降低了

11、两个正则化的参数分布

L1正则化假设参数分布为Laplace分布;L2正则化假设参数分布为正态分布

12、在预测的时候,是使用dropout训练出的权重还是要乘以keep-prib呢,为什么?

要乘以keep-prib

因为神经元预测的时候就没办法随机丢弃,一种”补偿“的方案就是每个神经元的权重都乘以一个p,这样在“总体上”使得测试数据训练数据是大致一样的。保证测试的时候把这个神经元的权重乘以p可以得到同样的期望

注:目前主流是采用inverted dropout替代dropout,inverted dropout不需要乘以keep-prib。它的做法是在训练阶段对执行了dropout操作的层,其输出激活值要除以keep_prob,而测试的模型不用再做任何改动。

13、L1正则化为什么能缓解过拟合

L1是模型各个参数的绝对值之和 ,那么对目标函数经过优化后,一部分参数会变为0,另一部分参数为非零实值。这样就起到了筛选特征的作用。过拟合是由于特征过多,L1可以筛选特征,所以能够缓解过拟合

14、BN+CONV融合公式及作用

网络完成训练后,在inference阶段,为了加速运算,通常将卷积层和BN层进行融合:

inference阶段,E[x]为滑动均值Var[x]为滑动方差

将BN层融合到卷积层中,相当于对卷积核进行一定的修改,没有增加卷积的计算量,同时整个BN层的计算量都省去了。

15、还有什么Normalization方法?

1 Layer Normalization

为了能够在只有当前一个训练实例的情形下,也能找到一个合理的统计范围,一个最直接的想法是:MLP 的同一隐层自己包含了若干神经元;同理,CNN 中同一个卷积层包含 k 个输出通道,每个通道包含 mn 个神经元,整个通道包含了 km*n 个神经元;类似的,RNN 的每个时间步的隐层也包含了若干神经元。那么我们完全可以直接用同层隐层神经元的响应值作为集合 S 的范围来求均值和方差。这就是 Layer Normalization 的基本思想。下图 分示了 MLP、CNN 和 RNN 的 Layer Normalization 的集合 S 计算范围,因为很直观,所以这里不展开详述。

前文有述,BN 在 RNN 中用起来很不方便,而 Layer Normalization 这种在同隐层内计算统计量的模式就比较符合 RNN 这种动态网络,目前在 RNN 中貌似也只有 LayerNorm 相对有效,但 Layer Normalization 目前看好像也只适合应用在 RNN 场景下,在 CNN 等环境下效果是不如 BatchNorm 或者 GroupNorm 等模型的。从目前现状看,动态网络中的 Normalization 机制是非常值得深入研究的一个领域。

2 Instance Normalization

从上述内容可以看出,Layer Normalization 在抛开对 Mini-Batch 的依赖目标下,为了能够统计均值方差,很自然地把同层内所有神经元的响应值作为统计范围,那么我们能否进一步将统计范围缩小?对于 CNN 明显是可以的,因为同一个卷积层内每个卷积核会产生一个输出通道,而每个输出通道是一个二维平面,也包含多个激活神经元,自然可以进一步把统计范围缩小到单个卷积核对应的输出通道内部。图 14 展示了 CNN 中的 Instance Normalization,对于图中某个卷积层来说,每个输出通道内的神经元会作为集合 S 来统计均值方差。对于 RNN 或者 MLP,如果在同一个隐层类似 CNN 这样缩小范围,那么就只剩下单独一个神经元,输出也是单值而非 CNN 的二维平面,这意味着没有形成集合 S,所以 RNN 和 MLP 是无法进行 Instance Normalization 操作的,这个很好理解。

如果把CNN BN 中的 Batch Size 大小设定为 1,此时和 Instance Norm 的上图 比较一下,是否两者是等价的?也就是说,看上去 Instance Normalization 像是 Batch Normalization 的一种 Batch Size=1 的特例情况。但是仔细思考,你会发现两者还是有区别的,至于区别是什么读者可自行思考。

Instance Normalization 对于一些图片生成类的任务比如图片风格转换来说效果是明显优于 BN 的,但在很多其它图像类任务比如分类等场景效果不如 BN。

3 Group Normalization

从上面的 Layer Normalization 和 Instance Normalization 可以看出,这是两种极端情况,Layer Normalization 是将同层所有神经元作为统计范围,而 Instance Normalization 则是 CNN 中将同一卷积层中每个卷积核对应的输出通道单独作为自己的统计范围。那么,有没有介于两者之间的统计范围呢?通道分组是 CNN 常用的模型优化技巧,所以自然而然会想到对 CNN 中某一层卷积层的输出或者输入通道进行分组,在分组范围内进行统计。这就是 Group Normalization 的核心思想,是 Facebook 何凯明研究组 2017 年提出的改进模型。

下图展示了 CNN 中的 Group Normalization。理论上 MLP 和 RNN 也可以引入这种模式,但是还没有看到相关研究,不过从道理上考虑,MLP 和 RNN 这么做的话,分组内包含神经元太少,估计缺乏统计有效性,猜测效果不会太好。

Group Normalization 在要求 Batch Size 比较小的场景下或者物体检测/视频分类等应用场景下效果是优于 BN 的。

【项目推荐】

面向小白的顶会论文核心代码库:https://github.com/xmu-xiaoma666/External-Attention-pytorch[1]

面向小白的YOLO目标检测库:https://github.com/iscyy/yoloair[2]

面向小白的顶刊顶会的论文解析:https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading[3]

【技术交流】

已建立深度学习公众号——FightingCV,关注于最新论文解读、基础知识巩固、学术科研交流,欢迎大家关注!!!

请关注FightingCV公众号,并后台回复ECCV2022即可获得ECCV中稿论文汇总列表。

推荐加入FightingCV交流群,每日会发送论文解析、算法和代码的干货分享,进行学术交流,加群请添加小助手wx:FightngCV666,备注:地区-学校(公司)-名称

参考

https://blog.csdn.net/qq\_35556254/article/details/90813562[4]

https://blog.csdn.net/SecondLieutenant/article/details/78931706[5]

https://blog.csdn.net/zwqjoy/article/details/79806989[6]

https://www.nowcoder.com/issue/tutorial?zhuanlanId=qMKkxM\&uuid=24c5ab2b16094e04b0c8c5d44c6c949a[7]

参考资料

[1]

https://github.com/xmu-xiaoma666/External-Attention-pytorch: https://github.com/xmu-xiaoma666/External-Attention-pytorch

[2]

https://github.com/iscyy/yoloair: https://github.com/iscyy/yoloair

[3]

https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading: https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading

[4]

https://blog.csdn.net/qq_35556254/article/details/90813562: https://blog.csdn.net/qq_35556254/article/details/90813562

[5]

https://blog.csdn.net/SecondLieutenant/article/details/78931706: https://blog.csdn.net/SecondLieutenant/article/details/78931706

[6]

https://blog.csdn.net/zwqjoy/article/details/79806989: https://blog.csdn.net/zwqjoy/article/details/79806989

[7]

https://www.nowcoder.com/issue/tutorial?zhuanlanId=qMKkxM&uuid=24c5ab2b16094e04b0c8c5d44c6c949a: https://www.nowcoder.com/issue/tutorial?zhuanlanId=qMKkxM&uuid=24c5ab2b16094e04b0c8c5d44c6c949a

分类:

人工智能

标签:

人工智能

作者介绍

FightingCV
V1

公众号 FightingCV