神经网络基础知识梳理

1.优化器的选择

1.优化器的选择

常见优化器可以分为三大类:

基本梯度下降法:包括标准梯度下降法(GD, Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及批量梯度下降法(BGD, Batch Gradient Descent);

动量优化法:包括标准动量优化方法(MomentumOptimizer)、牛顿加速梯度动量优化方法(NAG, Nesterov accelerated gradient)等;

自适应学习率优化法:包括Adagrad(Adaptive gradient algorithm)算法,RMSProp(root mean square prop)算法,Adam算法等;

对各类优化器的总结对比如下:

优化器

基本原理

优点

缺点

适用场景

pytorch函数参数(参数含义见pytorch优化器函数

SGD

SGD更新公式:Wt+1​=Wt​−ηt​gt​其中ηt​表示学习率,gt​表示单个样本的梯度,训练时只从训练样本集中随机选取一个样本进行梯度下降;而标准梯度下降法GD是每次使用所有样本更新梯度;批量梯度下降法BGD是介于GD和SGD之间,每次通过一小批样本更新梯度。

1.每次只选择一个样本进行求导,当训练样本集很大时,计算速度比GD快很多,内存开销小很多;

2.具有随机性,能够跳出一些比较差的局部最优点;

1.每步接受信息量有限,对梯度估计容易产生偏差,在山谷和鞍点处梯度下降速度很慢;

2.单样本梯度更新时会引入许多噪声;

SGD在比如SSD或者faster-rcnn等目标检测模型,每个样本都有大量候选框参与训练,这时使用随机梯度下降法能够加快梯度的计算。通常我们采用得更多的是BGD。

class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)

e)

ASGD

实现平均随机梯度下降算法。在第k步迭代的时候,考虑这一步和前面n-1个梯度的平均值,当前权重减去步长乘以最近n个梯度的平均值。n是自己设置的,当n=1的时候,就是普通的sgd。

1.和SGD相当,收敛速度快了很多,计算成本小于BGD。

1.和Momentum的原理比较接近,但实现上不如后者简单高效,因此应用也较少。

能够加速SGD的收敛

torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)

MomentumOptimizer

标准动量优化方法,核心思想就是,使当前训练数据的梯度受到之前训练数据的梯度的影响,对之前的梯度乘以一个权重项成为了动量项。能够减少梯度的波动,加快收敛。

1.通过动量更新,参数向量会在有持续梯度的方向上增加速度;

2.使梯度下降时的折返情况减轻,从而加快训练速度;

如果数据集分类复杂,会导致 Vt-1 和 t时刻梯度 向量方向相差较大;在进行向量求和时,得到的 Vt 会非常小,反而使训练速度大大下降甚至模型难以收敛。

适合用于改进在随机梯度下降和批量梯度下降等方法中梯度出现折返等情况,以加速收敛。

通过在torch.optim.SGD()函数中设置参数momentum和dampening以实现。

NAG

牛顿加速梯度动量优化方法,和标准动量优化方法不同的点在于会超前一个动量单位,相当于对于Momentum多了一个本次梯度相对上次梯度的变化量,以“向前看”看到的梯度而不是当前位置梯度去更新。

1.如果多次梯度累计方向大致相同,标准动量优化方法中会导致最终下降步幅过大;而NAG可以有效利用损失函数的近似二阶导,从而加快收敛速度。

不能根据参数的重要性而对不同的参数进行不同程度的更新。

是对标准Momentum方法对改进,可以使得RNN在很多任务上有更好的表现。

通过在torch.optim.SGD()函数中设置参数nesterov以实现。

Adagrad

AdaGrad的核心思想是,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有较大的学习率,而具有小梯度的参数有较小的学习率。式中,i表示第i个分类,t表示第t迭代同时也表示分类i累计出现的次数。η0表示初始的学习率取值(一般为0.01)。

1.AdaGrad算法能够随着训练过程自动减小学习率;

2.对于分布稀疏或者不均衡的数据集,AdaGrad算法在学习率上有很好的适应性;

1.仍依赖于人工设置一个全局学习率;

2.随着迭代次数增多,分母上梯度平方的累加将会越来越大,学习率会越来越小,最终会趋近于0,使得训练提前结束。

能够根据参数的重要性而对不同的参数进行不同程度的更新的问题。适合处理稀疏梯度。

torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)

RMSprop

RMSProp算法修改了AdaGrad的梯度积累为一阶指数加权的移动平均。

1.解决Adagrad分母会不断积累,这样学习率就会收缩并最终会变得非常小的问题。

1.RMSprop依然依赖于全局学习率;

RMSprop算是Adagrad的发展和Adadelta的变体,效果趋于二者之间。适合处理非平稳目标,对于RNN效果很好

torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)

Rprop

Rprop和RMSprop

和RMSprop比较类似,RMSprop是对Rprop的改进,较少使用

torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50))

AdaDelta

1.AdaDelta算法额外维护一个状态变量Delta(x),并使用状态变量的均方根代替 RMSprop 中的学习率参数,使AdaDelta优化器不需要指定超参数。

1.训练后期容易反复在局部极小值震荡。

相比于RMSprop算法,可以不用指定全局学习率超参数。

torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

这里的lr=1.0表示在delta被应用到参数更新之前对它缩放的系数。

Adam

Adma吸收了Adagrad(自适应学习率的梯度下降算法)和动量梯度下降算法Momentum的优点,既能适应稀疏梯度(即自然语言和计算机视觉问题),又能缓解梯度震荡的问题。

1.计算高效;

2.梯度平滑、稳定的过渡,可以适应不稳定的目标函数;

3.调参相对简单,默认参数就可以处理绝大部分的问题。

4.能自然地实现步长退火过程(自动调整学习率)

5.超参数具有很好的解释性,且通常无需调整或仅需很少的微调

1.可能不收敛;

2.可能错过全局最优解。

很适合应用于大规模的数据及参数的场景;

适用于不稳定目标函数;

适用于梯度稀疏或梯度存在很大噪声的问题;

torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

NAdam

Adam+Nesterov

Adamax

Adam的一种基于无穷范数的变种,可参考Adamax优化器

torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

LBFGS

L-BFGS算法, 较少使用。

torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None)

2.学习率的选取

学习率控制了每次更新模型参数需要用到多少误差,学习率过大过小都不合适,会有如下优缺点:

学习率 大

学习率 小

学习速度

使用时间点

刚开始训练时

一定轮次过后

缺点

  1. 造成梯度爆炸

  2. 损失值来回振荡

  1. 收敛速度慢

  2. 容易过拟合,容易陷入局部最优

常用的学习率衰减策略包括:轮数衰减、指数衰减和分数衰减,其中指数衰减一般较为有效。

指数衰减学习率是深度学习调参过程中比较使用的一个方法,刚开始训练时,学习率以 0.01 ~ 0.001 为宜, 接近训练结束的时候,学习速率的衰减应该在100倍以上。按照这个经验去设置相关参数,对于模型的精度会有很大帮助。

但是利用Adagrad和AdaDelta等方法就可以自动地进行学习率的调整。

3.如何解决欠拟合和过拟合

在训练数据不足或者模型复杂度过高导致训练过度时,就很容易发生过拟合现象,常用的防止过拟合的方法有:

  • Early stopping:根据验证集上的表现提前停止训练,防止过度训练;

  • 数据增广:也就是想办法增加训练数据,或者进行数据增广,比如将原始图片旋转一定角度,加入随机噪声,对图片进行截取等;

  • 正则化:L1正则化和L2正则化,效果就是让模型参数w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀)。过拟合的时候,拟合函数的系数往往非常大,为什么?就是拟合函数须要顾忌每个点,形成的拟合函数波动非常大。在某些非常小的区间里,函数值的变化非常剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以仅仅有系数足够大,才敢保证导数值非常大。而正则化是通过约束參数的范数使其不要太大,所以能够在一定程度上降低过拟合情况。

  • Dropout:L1、L2正则化是通过改动代价函数来实现的,而Dropout则是通过改动神经网络本身来实现的。Dropout,它为什么有助于防止过拟合呢?能够简单地这样解释,运用了dropout的训练过程,相当于训练了非常多个仅仅有部分隐层单元的神经网络,每个这种半数网络,都能够给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都能够给出正确的分类结果。那么少数的错误分类结果就不会对终于结果造成大的影响。
    在测试的时候不需要dropout,需要记得关掉,在Pytorch里面,通过model.train(), model.eval()显式地在训练中关掉BN/Dropout。

  • 从数据预处理角度,进行PCA降维等也可以防止过拟合,但是并不推荐通过PCA处理过拟合,因为PCA是无监督的,正如Andrew所说:“it does not consider the values of our results y”。所以它虽然能解决过拟合问题,但又会带来欠拟合问题。拿人脸识别来说,eigenface虽然能训练出识别能力尚可的分类器,但因为分类信息并不一定存在于前几个主成分上,所以用前几个主成分来做分类的话,会丢失后面变化细微的主成分上存在的大量分类信息。正因为如此,之后又出现了fisherface等有监督降维工作,识别能力也因此提高了很多。

而对于欠拟合问题,主要是因为数据特征不足或者模型复杂度不足导致的,常用的防止欠拟合的方法有:

  • 从数据层面增加特征,进行特征组合

  • 减少正则化权重或者dropout,增加模型的容量

  • 将简单的模型进行集成学习,比如Bagging,Boosting等。

4.变量初始化

深度学习参数初始化(weights initializer)策略大全_LoveMIss-Y的博客-CSDN博客_参数初始化

浅谈深度学习初始化参数(weight initialization)_TransientYear的博客-CSDN博客

参数初始化的几个基本条件:Glorot条件:各个层的激活值h(输出值)的方差要保持一致;各个层对状态Z的梯度的方差要保持一致

关于方差的三个客观事实:

  • 各个层激活值h(输出值)的方差与网络的层数有关

  • 关于状态Z的梯度的方差与网络的层数有关

  • 各个层参数W的梯度的方差与层数无关

因此参数初始化有如下几点要求:

  • 参数不能全部初始化为0,也不能全部初始化同一个值,为什么,请参见“对称失效”;

  • 最好保证参数初始化的均值为0,正负交错,正负参数大致上数量相等;

  • 初始化参数不能太大或者是太小,参数太小会导致特征在每层间逐渐缩小而难以产生作用,参数太大会导致数据在逐层间传递时逐渐放大而导致梯度消失发散,不能训练

  • 如果有可能满足Glorot条件也是不错的

因此常见的参数初始化方法有:

  • 正态分布随机初始化——对应为normal,均匀分布随机初始化——对应为uniform:会面临一旦随机分布选择不当,就会导致网络优化陷入困境。

  • Glorot初始化方法,基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0。注意,为了问题的简便,其推导过程是基于线性函数的,但是它在一些非线性神经元中也很有效,比如对tanh很有效,但是对Relu效果不好。

  • Kaiming初始化,也称之为He初始化,在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所以,要保持variance不变,只需要在Xavier的基础上再除以2。

  • Lecun初始化

  • Batch Noralization:BN是将输入的数据分布变成高斯分布,这样可以保证每一层神经网络的输入保持相同分布。BN就是通过规范化的手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值0方差1的标准正态分布,使得激活输入值落入非线性函数中比较敏感的区域。可以让梯度变大,学习收敛速度快,能大大加快收敛速度。

5.激活函数

深度学习中常用的激活函数详解 - 知乎

深度学习基础篇:如何选择正确的激活函数? - 知乎

激活函数

公式

图形

适用范围

sigmoid

导数:

优点:sigmoid函数可以将实数映射到 (0,1) 区间内。平滑、易于求导。

缺点:1. 激活函数含有幂运算和除法,计算量大;2. 反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练;3. sigmoid的输出不是0均值的,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。

hard_sigmoid

特点:计算量小,非平滑。

tanh

导数

tanh激活函数是0均值的,tanh激活函数相比sigmoid函数更'陡峭'了,对于有差异的特征区分得更开了,tanh也不能避免梯度消失问题。

ReLU

优点:1.计算量小;2.激活函数导数维持在1,可以有效缓解梯度消失和梯度爆炸问题;3.使用Relu会使部分神经元为0,这样就造成了网络的稀疏性,并且减少了参数之间的相互依赖关系,缓解了过拟合问题的发生。

缺点:输入激活函数值为负数的时候,会使得输出为0,那么这个神经元在后面的训练迭代的梯度就永远是0了(由反向传播公式推导可得),参数w得不到更新,也就是这个神经元死掉了。这种情况在你将学习率设得较大时(网络训练刚开始时)很容易发生(波浪线一不小心就拐到负数区域了,然后就拐不回来了)。

解决办法:一些对Relu的改进,如ELU、PRelu、Leaky ReLU等,给负数区域一个很小的输出,不让其置0,从某种程度上避免了使部分神经元死掉的问题。

LeakyReLU

LeakyReLU在神经元未激活时,它仍允许赋予一个很小的梯度,避免ReLU死掉的问题。值得注意的是LeakyReLU是确定的标量,不可学习。

注意区分PReLU和LeakyReLU,PReLU的 alpha 是一个可学习的数组,尺寸与 x 相同。

PReLU是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但是不会趋于0,这算是一定的优势

ELU

优点:右侧线性部分使得elu能够缓解梯度消失,而左侧软饱部分能够让ELU对输入变化或噪声更鲁棒。elu的输出均值接近于零。

softmax

(分布也是指数)

softmax函数常用在分类网络的最后一层,把网络输出转化为各类别的概率。

那么应该如何选取激活函数:

  • 用于分类器时,Sigmoid函数及其组合通常效果更好。

  • 由于梯度消失问题,有时要避免使用sigmoid和tanh函数。

  • ReLU函数是一个通用的激活函数,目前在大多数情况下使用。

  • 如果神经网络中出现死神经元,那么PReLU函数就是最好的选择。

  • 请记住,ReLU函数只能在隐藏层中使用。

  • 可以从ReLU函数开始,如果ReLU函数没有提供最优结果,再尝试其他激活函数。

  • LSTM中选择sigmoid作为激活函数,主要是为了实现门控的效果。

6. batch_size的选择

batch_size参数设置_Suodislie的博客-CSDN博客

谈谈深度学习中的 Batch_Size_ycheng_sjtu的博客-CSDN博客_深度学习batchsize

训练过程--Batchsize(总之一般情况下batchsize能设多大就设多大)_whitenightwu的博客-CSDN博客_batchsize一般取多少

A:一定范围内增大Batch_size:

1、 提高了内存的利用率,大矩阵乘法的并行化效率提高

2、 跑完一次epoch所需要的迭代次数减少,相同数据量的数据处理速度加快。

3、 Batch_size越大下降方向越准,引起的训练震荡越小。

4、 缺点:盲目增大batch size,可能也会导致内存溢出、训练时间增加、收敛缓慢、局部最优,泛化性变差。

B:Batch_size过小:

1、模型泛化性强

2、修正方向以各自样本的梯度方向修正难以达到收敛。

总结:

首先根据显存大小选择Batch_size;其次根据自己的实际情况调整Batch_size,调参重在“调”,根据实际情况选择合适的参数。设置好Batch_size后,每一次epoch记得shuffle一次,不要让网络通过相同的minibach。

为什么小的batch size具有更好的泛化能力:主要原因是小的batch size带来的噪声有助于逃离sharp minimum,大的batch size收敛到sharp miminum,而小的batch size收敛到flat mimimum,后者具有更好的泛化能力。但是Hoffer[7]等人指出“泛化差距”现象源于相对较少参数的更新,而不是batch size。即batch size增大导致模型性能下降是因为训练时间不够长,即在同样的epochs下参数更新变少了,因此需要更长的迭代次数。通过对batch size的修改与学习速率的调整相结合,可以完全消除了之前观察到的“泛化差距”。

7.epoch的选择

epoch:训练时,所有训练数据集都训练过一次。一般可以通过观察验证集上的表现进行确定。

8.正则化L1和L2

l1正则与l2正则的特点是什么,各有什么优势?

L1、L2损失函数、Huber损失函数 - keepgoing18 - 博客园

  • 如上面提到的,L2 计算起来更方便,而 L1 在特别是非稀疏向量上的计算效率就很低;

  • 还有就是 L1 最重要的一个特点,输出稀疏,会把不重要的特征直接置零,而 L2 则不会;

  • 最后,如之前多次提过,L2 有唯一解,而 L1 不是。

  • L2正则化对异常点会更加敏感,没有L1正则化鲁棒。

一般常用的正则化包括L1正则化和L2正则化。L1 相比于 L2 为什么容易获得稀疏解:

9.样本不均衡问题怎么处理

样本不均衡问题

对于样本不均衡问题,可以分别从数据角度和模型角度进行处理:

  • 数据角度:扩大数据集、重采样(过采样和欠采样)、人工生成样本数据、基于异常检测的方式

  • 算法层面:尝试不同的分类算法(比如决策树就对样本不均衡问题比较有效),对小类分错施加惩罚、重构分类器(将大类压缩成小类,使用One Class分类器,即异常点检测,集成学习,二分类变为多分类)

  • OHEM:
    OHEM(online hard example miniing)算法的核心思想是根据输入样本的损失进行筛选,筛选出hard example,表示对分类和检测影响较大的样本,然后将筛选得到的这些样本应用在随机梯度下降中训练。在实际操作中是将原来的一个ROI Network扩充为两个ROI Network,这两个ROI Network共享参数。其中前面一个ROI Network只有前向操作,主要用于计算损失;后面一个ROI Network包括前向和后向操作,以hard example作为输入,计算损失并回传梯度。作者将该算法应用在Fast RCNN中,网络结构还是采用VGG16和VGG_CNN_M_1024,数据集主要采用VOC2007,VOC2012和COCO数据集。
    算法优点:1、对于数据的类别不平衡问题不需要采用设置正负样本比例的方式来解决,这种在线选择方式针对性更强。2、随着数据集的增大,算法的提升更加明显(作者是通过在COCO数据集上做实验和VOC数据集做对比,因为前者的数据集更大,而且提升更明显,所以有这个结论)。

  • Focal Loss
    Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。主旨是:ssd按照ohem选出了loss较大的,但忽略了那些loss较小的easy的负样本,虽然这些easy负样本loss很小,但数量多,加起来的loss较大,对最终loss有一定贡献。作者想把这些loss较小的也融入到loss计算中。但如果直接计算所有的loss,loss会被那些easy的负样本主导,因为数量太多,加起来的loss就大了。也就是说,作者是想融入一些easy example,希望他们能有助于训练,但又不希望他们主导loss。这个时候就用了公式进行衰减那些easy example,让他们对loss做贡献,但又不至于主导loss,并且通过balanced crossentropy平衡类别。

10.生成模型和鉴别模型

11.规范化Normalization

NLP中 batch normalization与 layer normalization - 知乎

优化方法总结 Batch Normalization、Layer Normalization、Instance Normalization 及 Group Normalization_展希希鸿的博客-CSDN博客

深度学习中的 Normalization,因为神经网络里主要有两类实体:神经元或者连接神经元的边,所以按照规范化操作涉及对象的不同可以分为两大类,一类是对第 L 层每个神经元的激活值或者说对于第 L+1 层网络神经元的输入值进行 Normalization 操作,比如 BatchNorm/LayerNorm/InstanceNorm/GroupNorm 等方法都属于这一类;另外一类是对神经网络中连接相邻隐层神经元之间的边上的权重进行规范化操作,比如 Weight Norm 就属于这一类。

广义上讲,一般机器学习里看到的损失函数里面加入的对参数的的 L1/L2 等正则项,本质上也属于这第二类规范化操作。L1 正则的规范化目标是造成参数的稀疏化,就是争取达到让大量参数值取得 0 值的效果,而 L2 正则的规范化目标是有效减小原始参数值的大小。有了这些规范目标,通过具体的规范化手段来改变参数值,以达到避免模型过拟合的目的。

对于第一类的 Normalization 操作,其在什么位置发挥作用呢?目前有两种在神经元中插入 Normalization 操作的地方,第一种是原始 BN 论文提出的,放在激活函数之前;另外一种是后续研究提出的,放在激活函数之后,不少研究表明将 BN 放在激活函数之后效果更好。

Batch normalization

Layer normalization

Instance normalization

Group normalization

定义

MLP:每个训练实例在神经元 k 都会产生一个激活值,也就是说 Batch 中 n 个训练实例分别通过同一个神经元 k 的时候产生了 n 个激活值,BatchNorm 的集合 S 选择入围的神经元就是这 n 个同一个神经元被 Batch 不同训练实例激发的激活值。

CNN:对于 CNN 某个卷积层对应的输出通道 k 来说,假设某个 Batch 包含 n 个训练实例,那么每个训练实例在这个通道 k 都会产生一个二维激活平面,也就是说 Batch 中 n 个训练实例分别通过同一个卷积核的输出通道 k 的时候产生了 n 个激活平面。假设激活平面长为 5,宽为 4,则激活平面包含 20 个激活值,n 个不同实例的激活平面共包含 20*n 个激活值。那么 BatchNorm 的集合 S 的范围就是由这 20*n 个同一个通道被 Batch 不同训练实例激发的激活平面中包含的所有激活值构成。

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

针对的是每一行进行缩放。即只看一批数据,算出这批所有特征的均值与方差再缩放。这是一种“行缩放”。

Layer Normalization 在抛开对 Mini-Batch 的依赖目标下,为了能够统计均值方差,很自然地把同层内所有神经元的响应值作为统计范围,那么我们能否进一步将统计范围缩小?对于 CNN 明显是可以的,因为同一个卷积层内每个卷积核会产生一个输出通道,而每个输出通道是一个二维平面,也包含多个激活神经元,自然可以进一步把统计范围缩小到单个卷积核对应的输出通道内部。

通道分组是 CNN 常用的模型优化技巧,所以自然而然会想到对 CNN 中某一层卷积层的输出或者输入通道进行分组,在分组范围内进行统计。这就是 Group Normalization 的核心思想,是 Facebook 何凯明研究组 2017 年提出的改进模型。

适用领域

1.能够解决“Internal Covariate Shift”这种问题。简单理解就是随着层数的增加,中间层的输出会发生“漂移”。

2.BN能够解决梯度弥散。通过将输出进行适当的缩放,可以缓解梯度消失的状况。

3. 在 MLP 和 CNN 是非常成功的,在 RNN 上效果不明显

局限 1:如果 Batch Size 太小,则 BN 效果明显下降;

局限 2:对于有些像素级图片生成任务来说,BN 效果不佳;

局限 3:RNN 等动态网络使用 BN 效果不佳且使用起来不方便;

局限 4:训练时和推理时统计量不一致;

1.NLP领域中,LN更为合适。如果我们将一批文本组成一个batch,那么BN的操作方向是,对每句话的第一个词进行操作。但语言文本的复杂性是很高的,任何一个词都有可能放在初始位置,且词序可能并不影响我们对句子的理解。而BN是针对每个位置进行缩放,这不符合NLP的规律。而LN则是针对一句话进行缩放的,且LN一般用在第三维度,如[batchsize, seq_len, dims]中的dims,一般为词向量的维度,或者是RNN的输出维度等等,这一维度各个特征的量纲应该相同。因此也不会遇到上面因为特征的量纲不同而导致的缩放问题。

但 Layer Normalization 目前看好像也只适合应用在 RNN 场景下,在 CNN 等环境下效果是不如 BatchNorm 或者 GroupNorm 等模型的。

只适用于CNN,MLP和RNN中没办法用。因为对于 RNN 或者 MLP,如果在同一个隐层类似 CNN 这样缩小范围,那么就只剩下单独一个神经元,输出也是单值而非 CNN 的二维平面,这意味着没有形成集合 S,所以 RNN 和 MLP 是无法进行 Instance Normalization 操作的,这个很好理解。

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

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

参考资料:

  1. 深度学习超参数调优技巧 - 知乎

  2. 各种优化器Optimizer原理:从SGD到AdamOptimizer_BIT可达鸭的博客-CSDN博客_sgd优化器原理

  3. 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目 - 知乎

  4. 深度解析Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam等优化器 - 知乎

  5. Adamax优化器 | 机器之心

    比Momentum更快:揭开Nesterov Accelerated Gradient的真面目 - 知乎

  6. 损失函数总结_dili8870的博客-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值