8、正则化激活函数&&梯度拟合问题

  • 问题:梯度问题和拟合问题
  • 方法
    三个网络层:Relu(激活)、BatchNorm(规划)、Dropout
    正则化:数据增强、L1L2 正则化、Dropout、BN、随机池化和提前终止等
    训练方法:交叉验证、batch_size

1、 BatchNormalization和激活函数

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(W x + b Wx+bWx+b)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(死区)(对于Sigmoid函数来说,意味着激活输入值是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

其实一句话就是:**对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。**因为梯度一直都能保持比较大的状态,所以很明显对神经网络的参数调整效率比较高,就是变动大,就是说向损失函数最优值迈动的步子大,也就是说收敛地快。BN说到底就是这么个机制,方法很简单,道理很深刻。
在这里插入图片描述
在这里插入图片描述
​​由图1知,64%的概率x落在[-1,1]的范围内,95%的概率x落在[-2,2]的范围内。这就把x值限制在了图2 sigmoid函数不饱和的地方。
但是很明显,看到这里,稍微了解神经网络的读者一般会提出一个疑问:如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了?这意味着什么?我们知道,如果是多层的线性函数变换其实这个深层是没有意义的,因为多层线性网络跟一层线性网络是等价的。所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。当然,这是我的理解,论文作者并未明确这样说。但是很明显这里的scale和shift操作是会有争议的,因为按照论文作者论文里写的理想状态,就会又通过scale和shift操作把变换后的x调整回未变换的状态,那不是饶了一圈又绕回去原始的“Internal Covariate Shift”问题里去了吗,感觉论文作者并未能够清楚地解释scale和shift操作的理论原因。

计算过程
在这里插入图片描述

为什么会有放缩系数γ \gammaγ和平移系数β \betaβ?
因为归一化不可避免的会改变数据的分布,从而可能会对激活函数只使用了其线性部分,限制了模型的表达能力。引入参数γ \gammaγ和β \betaβ可以使网络的输出重构原始特征的表达能力。
注意:上式中的γ和β是两个可以学习的参数(μ是求出的均值,σ是求出的标准差,ε是人为设置的防止分母为0),实际上当γ取标准差、β取均值的时候,γ和β对x标准化的操作提供了逆向的重构。加这个逆向操作的原因是,标准化操作可能会影响该层的表征,所以batch normalization应该有能表示identity transform的能力,所以使用了这两个可以学习的参数来重构让BN层有identity表达的能力。

训练阶段
在训练阶段,BN会对batch内的每个样本做归一化,每一层特征图会计算出HxWxChannel个均值和方差。训练时计算的均值和方差会不断按加权累积下来,通过移动平均的方法来近似得到整个样本集的均值和方差。
训练过程中共会产生(图片总数/batchsize)组 γ \gammaγ和β \betaβ。
在反向传播时,利用γ \gammaγ和β \betaβ求梯度从而改变训练权重,每层都有自己的γ \gammaγ和β \betaβ。

作用
BN层一般放在线性层或卷积层后面,激活函数前面,作用如下:

  • 1.加快网络收敛;
    因为每层的数据都转换为同一的分布,这样会加快训练速度。
  • 2.防止梯度爆炸和梯度消失;
    因为BN会使非线性变换函数的输入值落入对输入比较敏感的区域。
  • 3.防止过拟合,提升泛化能力。
    因为BN求均值和方差是基于同一个batch内的样本,使网络不会朝一个方向学习。

BatchNorm的好处
① 极大提升了训练速度,收敛过程大大加快;(因为解决了梯度消失的问题)
② 增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;
③ 另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。
如何防止过拟合
Batch Normalization的主要作用是加快网络的训练速度。如果硬要说是防止过拟合,可以这样理解:
BN每次的mini-batch的数据都不一样,但是每次的mini-batch的数据都会对moving mean和moving variance产生作用,可以认为是引入了噪声,这就可以认为是进行了data augmentation,而data augmentation被认为是防止过拟合的一种方法。因此,可以认为用BN可以防止过拟合。

参考链接:
https://blog.csdn.net/weixin_41332009/article/details/113834419
https://blog.csdn.net/bblingbbling/article/details/114168687
https://blog.csdn.net/ygfrancois/article/details/90382459

2、激活函数用于分类

sigmoid函数可以很容易地应用在训练过程中。然而,当你想要处理分类问题时,他们却无能为力。简单地说,sigmoid函数只能处理两个类,这不适用于多分类的问题。所以softmax可以有效解决这个问题。并且softmax函数很多情况都运用在神经网络中的最后一层网络中,使得值得区间在0,1之间,而不是二分类的。

3、激活函数梯度问题

作用:
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。使用非线性激活函数是为了增加神经网络模型的非线性因素,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。

导致问题:梯度消失、梯度爆炸

解决方法:

  • 对于深层的网络而言,Sigmoid和tanh函数反向传播的过程中,饱和区域非常平缓,接近于0,容易出现梯度消失的问题,减缓收敛速度。Relu的gradient大多数情况下是常数,有助于解决深层网络的收敛问题。

  • ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性(类似dropout),并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

  • 采用sigmoid等函数,算激活函数时(指数运算),计算量大 ;反向传播求误差梯度时,求导涉及除法,计算量也大。而采用Relu激活函数,整个过程的计算量节省很多

sigmoid / tanh比较常见于全连接层,relu常见于卷积层。

4、BN、Relu、Dropout相对位置

正则化、Normalization、Dropout
三者防止过拟合,(其他防止过拟合,数据增加,提前结束,残差等)

Linear->Relu->BatchNorm->Dropout
或BatchNorm -> ReLu(or other activation) -> Dropout
论文里有提到,BN层常常被加到Relu之前,但是没有明确的标准,需要尝试不同配置,通过实验得出结论(很多实验结果偏向于Relu在BN之前)。实际上,BN消除了对dropout的依赖,因为BN也有和dropout本质一样的正则化的效果,像是ResNet, DenseNet等等并没有使用dropout,如果要用并用BN和dropout,还是建议BN放在dropout之前。

Batch Normalization(BN)即批规范化,是正则化的一个重要手段。在正则化效果的基础上,批处理规范化还可以减少卷积网络在训练过程中的梯度弥散。这样可以减少训练时间,提升结果。由此产生的网络可以通过饱和非线性进行训练,更能容忍增加的训练速率,并且通常不需要Dropout进行正则化。 BN模型的高性能表明在卷积之间使用BN是有效的。此外,Dropout不应该放在卷积之间,因为Dropout模型的性能往往比Control模型差。
Dropout是神经网络中防止模型过拟合的重要正则化方式,而近来的网络结构中却少有见到Dropout的身影。一般情况下,只需要在网络存在过拟合风险时才需要实现正则化。如果网络太大、训练时间太长、或者没有足够的数据,就会发生这种情况。注意,这只适用于CNN的全连接层。对于所有其他层,不应该使用Dropout。相反,应该在卷积之间插入批处理标准化。这将使模型规范化,并使模型在训练期间更加稳定。

5、正则化

1.正则化的概念
正则化(Regularization) 是机器学习中对原始损失函数引入额外信息,以便防止过拟合和提高模型泛化性能的一类方法的统称。也就是目标函数变成了原始损失函数+额外项,L1正则化和L2正则化。目的:防止模型过拟合。原理:在损失函数上加上某些规则(限制),缩小解空间,从而减少求出过拟合解的可能性。

  • 机器学习中:机器学习中的一个核心问题是设计不仅在训练数据上表现好,并且能在新输入上泛化好的算法。在机器学习中,许多策略显式地被设计来减少测试误差(可能会以增大训练误差为代价)。这些策略被统称伪正则化。
  • 深度学习:深度学习模型具有很高的灵活性和能力,如果训 练数据集不够大,将会造成一个严重的问题–过拟合。尽管它在训练集上效果很好,但是学到的网络不能应用到测试集中,所以在深度学习模型中使用正则化是必要的。

2.正则化方法

正则化就是针对特征,针对模型的一种限制算法。拟合能力越强,说明到学习的特征越多,w参数数量越多,模型越复杂。常用的正则化方法有数据增强、L2 正则化(权重衰减)、L1 正则化、Dropout、Drop Connect、BN、随机池化和提前终止等。下面重点来讨论一下L1、L2正则化、Dropout、BN这三种方法。

  • L1L2 正则化:这种技术在原始的损失函数(L LL)中引入了额外的惩罚项,并增加了平方参数(w ww)的总和。
  • 权重衰减(Weight Decay):技术与L2正则化相同,但应用于不同的地方:它不是在损失函数中引入一个和,而是在权值更新公式中增加一个额外的项。
  • 丢弃法(Dropout):该技术不同于现有技术。该过程很简单:对于训练阶段中网络的每个新输入,根据先前定义的丢弃概率,将每个隐藏层中一定比例的神经元随机停用。 对于整个网络,这可以相同,也可以在每一层中不同。
  • 批量归一化(Batch Normalization):批量归一化基本上意味着在神经元和激活函数之间添加一个额外的步骤,目的是对输出激活进行归一化。理想情况下,应该使用整个训练集的均值和方差进行归一化,但是如果我们使用批量梯度下降(mini-batch gradient descent)算法来训练我们的网络,则应该使用每个mini-batch输入的均值和方差。
  • 数据增强(Data Augmentation): 水平/垂直翻转图像、旋转图像X度、调整,扩展,调整大小等应用透视变形、调整亮度、对比度、饱和度等、添加一些噪音、缺陷等早停法(Early Stopping)最后要套用一个规则集,以便知道何时该停止训练,这样就不会出现过拟合和欠拟合的情况。最常见的方法是对模型进行培训,监控其性能并在每个时期结束时保存其参数。我们将一直这样做,直到确认误差稳步增加(由于算法的随机性而出现恶化)。我们将保留之前得到的模型。

参考链接:
https://blog.csdn.net/qq_35712832/article/details/114218032
https://blog.csdn.net/cfan927/article/details/104245227

5、梯度&拟合

层:Relu、BatchNorm、Dropout
正则化

1、梯度问题
目前优化神经网络的方法都是基于BP,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。其中将误差从末层往前传递的过程需要链式法则(Chain Rule)的帮助,因此反向传播算法可以说是梯度下降在链式法则中的应用。

  • 原因
    1.深层网络
    2.激活函数
    3.权重w的值过大
    梯度消失:深层网络、激活函数
    梯度爆炸:深层网络、权重w的值过大

  • 解决方法
    梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。
    1.深层网络
    梯度剪切:对梯度设定阈值,设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。
    残差网络: Resnet网络
    LSTM的“门(gate)”结构: LSTM全称是长短期记忆网络(long-short term memory networks),LSTM的结构设计可以改善RNN中的梯度消失的问题。主要原因在于LSTM内部复杂的“门”(gates),如下图所示。
    2.激活函数
    选择relu等梯度大部分落在常数上的激活函数:relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
    3.权重w的值过大
    权重正则化: 正则化主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生。比较常见的是 L1 正则和 L2 正则,在各个深度框架中都有相应的API可以使用正则化。
    batch normalization: BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。
    参考连接:https://zhuanlan.zhihu.com/p/72589432

2、拟合问题
过拟合&欠拟合&不收敛,度量泛化能力的好坏,最直观的表现就是模型的过拟合(overfitting)和欠拟合(underfitting)。过拟合和欠拟合是用于描述模型在训练过程中的两种状态。

  • 欠拟合
    原因
    1.模型复杂度低
    2.特征量过少
    解决方法
    1.增加网络复杂度
    2.模型中增加特征
    3.减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数

  • 过拟合
    原因
    1、训练数据集样本单一,样本不足。
    2、训练数据中噪声干扰过大。
    3、参数太多,模型过于复杂。

  • 解决方法
    1.数据集增强:获取和使用更多的数据,能够做:旋转图像、缩放图像、随机裁剪、加入随机噪声、平移、镜像等方式来增加数据量。——解决过拟合的根本性方法
    2.控制模型的复杂度:采用合适的模型,根据奥卡姆剃刀法则,在同样能够解释已知观测现象的假设中,我们应该挑选“最简单”的那一个。对于模型的设计而言,我们应该选择简单、合适的模型解决复杂的问题。
    3.降低特征的数量:对于一些特征工程而言,可以降低特征的数量——删除冗余特征,人工选择保留哪些特征。
    4、正则化:控制权重w参数,参数越小,模型复杂度更低,如果让大量的参数小到近似0,那么就相当于把它们给dropout了,自然就减小了模型的复杂度。

决办法
优化误差首先得搞清楚你的模型是偏差大还是方差大,也就是过拟合还是欠拟合。可以对模型输出进行采样,然后和真实值进行对比,从而知道误差主要来源于方差还是偏差。
偏差和方差的理解:
偏差:描述的是模型的拟合能力(准不准)
方差:数据扰动对模型的影响 (稳不稳)
欠拟合和过拟合的判断:
欠拟合:模型在训练集和测试集效果都不好
过拟合:模型在训练集上效果好,在测试集上效果不好

  • 偏差:实际上也可以称为避免欠拟合
    寻找更好的特征 :具有代表性寻找更好的特征;
    用更多的特征:增大输入向量维度(增加模型复杂度 )
    寻找更好的特征,提升对数据的刻画能力
    增加特征数量
    重新选择更加复杂的模型
  • 方差:避免过拟合
    增大数据 集合:使用更多的,噪声点比减少(减少数据扰动所造成的影响)
    减少数据特征: 减少维度 ,高维空间密度小(减少模型复杂度)
    正则化方法
    交叉验证法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值