精华内容
下载资源
问答
  • 之前写了一篇讲解keras实现BatchNormalization的文章Keras防止过拟合(四) Batch ...而其文中提出,training参数设置为0或者False可以解决。但通过我自己分析和浏览一些资料后,发现这个说法是错误的。要解决这

    之前写了一篇讲解keras实现BatchNormalization的文章Keras防止过拟合(四) Batch Normalization代码实现,以为自己已经将keras实现BatchNormalization的细节完全明白了,突然看到了一篇文章keras BatchNormalization 之坑,其中写道了一个坑:训练时和测试时的均值mean和方差var差异太大,影响结果。而其文中提出,training参数设置为0或者False可以解决。但通过我自己分析和浏览一些资料后,发现这个说法是错误的。要解决这个问题,不能改变training参数

    首先先解释一下,为啥直接使用keras.layers.BatchNormalization时会出现训练时和测试时的mean和var差异太大,原因在于:

    keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)
    

    训练时是一个一个批次训练的,mean和var使用的是各个批次的mean和var,归一化也是针对各个批次。而测试时使用的并不是测试集的所有数据的mean和var,而是在训练时利用权重滑动平均法更新而得(权重滑动平均法定义可以参考这篇吴恩达深度学习公开课,这篇文章有讲解指数加权移动平均法(EWMA)),公式如下:
    self.moving_mean = momentum * self.moving_mean + (1-momentum) * mean
    其中mean是训练时每个批次的均值,momentum为衰减率,self.moving_mean是测试使用的mean.

    使用权重滑动平均法时,若将衰减率momentum设置为0.99,最后moving_mean的值越约等于最后100个mean的加权,若我们设置的batch数量远远小于100时,momentum还使用默认值0.99的话,几乎不会通过每个批次更新,也就导致了训练集使用的mean是每个批次的均值,而测试集使用的mean几乎等于初值,产生很大差异!(方差也一样),训练时和测试时的mean和var差异太大这个坑就是因为这个原因。 所以,在这种情况下,减小momentum的值就可以解决此问题。

    当然,你也可以增加batch数量,即减少batch_size,但使用BN时,batch_size不能小,如果你的样本数量很少(假设训练集只有几百个),最好还是减小momentum的值。

    momentum的值设置为多少合适:
    根据你的batch数决定,若你的batch只有10组,设置为0.9;若为50,设置为0.98;若大于100,甚至可以设置的再大一点(但建议就使用默认值)。
    在这里插入图片描述
    引用自指数加权移动平均法(EWMA),图中最后的 0. 9 50 0.9^{50} 0.950应该是 0.9 8 50 0.98^{50} 0.9850.
    M B = 1 e M^{B} = \frac{1}{e} MB=e1时, ln ⁡ M B = ln ⁡ 1 e \ln M^{B} =\ln\frac{1}{e} lnMB=lne1, B ln ⁡ M = − 1 B\ln M =-1 BlnM=1, ln ⁡ M = − 1 B \ln M = -\frac{1} {B} lnM=B1,
    M = e − 1 B M = e^{-\frac{1} {B}} M=eB1,其中M是momentum值,B是batch数量。

    至于该文章中说是将training参数一定要设置为0或者False。其实我一开始并没有注意到training这个参数,因为它都不是在init中定义的,而是在call函数中定义:

    def call(self, inputs, training=None):#BN层实现函数call中有一个参数training,默认值为None
    
        if training in {0, False}:
            return normalize_inference()
    

    如果设置为0或者False,则在训练时直接返回inference时的操作。keras BatchNormalization 之坑这篇文章中写道:

    翻看keras BN 的源码, 原来keras 的BN层的call函数里面有个默认参数traing, 默认是None。此参数意义如下:

    training=False/0, 训练时通过每个batch的移动平均的均值、方差去做批归一化,测试时拿整个训练集的均值、方差做归一化

    training=True/1/None,训练时通过当前batch的均值、方差去做批归一化,测试时拿整个训练集的均值、方差做归一化

    文中还建议说是最后将training定义为0或False:

    当training=None时,训练和测试的批归一化方式不一致,导致validation的输出指标翻车。

    当training=True时,拿训练完的模型预测一个样本和预测一个batch的样本的差异非常大,也就是预测的结果根据batch的大小会不同!导致模型结果无法准确评估!也是个坑!

    用keras的BN时切记要设置training=False!!!

    其文章意思是,training设置为0或False时,训练通过每个batch的移动平均的均值、方差去做批归一化,测试时拿整个训练集的均值、方差做归一化。这样两者的差异较小。

    但根据我个人看完源码的理解,加上一些资料,发现这是错误的!

    源码中,如果我们将training设置为0或False,则normalize_inference()中使用的均值self.moving_mean,方差self.moving_variance将只会使用其初始化的值(默认初始化方法:均值moving_mean为’zero’,即设置为全0,方差moving_variance为’ones’,即设置为全1),而不会更新。这意味着,训练时和测试时使用的mean和var都是初值,不是通过各个批次计算而得,在这种情况下,使用BN没有意义。

    关于这点,不管是keras中文文档还是官方文档都没有提到,源码中也没有相应的注释予以描述,我搜了一些文章,也没有对这点进行讲解。但tensorflow中有一个类似的layer,tf.layers.batch_normalization()方法,其中有training的描述。

    文章Batch Normalization的正确打开方式中有tf.layers.batch_normalization()方法的讲解:

    tf.layers.batch_normalization(
        inputs,
        axis=-1,
        momentum=0.99,
        epsilon=0.001,
        center=True,
        scale=True,
        beta_initializer=tf.zeros_initializer(),
        gamma_initializer=tf.ones_initializer(),
        moving_mean_initializer=tf.zeros_initializer(),
        moving_variance_initializer=tf.ones_initializer(),
        beta_regularizer=None,
        gamma_regularizer=None,
        beta_constraint=None,
        gamma_constraint=None,
        training=False,
        trainable=True,
        name=None,
        reuse=None,
        renorm=False,
        renorm_clipping=None,
        renorm_momentum=0.99,
        fused=None,
        virtual_batch_size=None,
        adjustment=None
    )
    

    在这里插入图片描述
    在这里插入图片描述

    对于keras的Batch Normalization来说也是这样,如果在训练时将raining设置为0或False时,不会滑动更新,都是初值!
    这确实会使训练和测试的mean和var完全一致(因为都是初值啊),以至于该作者认为这样设置会更好,但其实这就相当于未使用BN。

    展开全文
  • 论文:https://arxiv.org/pdf/1502.03167.pdf 以下博客对batch Normalization的原理,优点和代码解析做了... batch Normalization公式 注意:上式中的γ和β是两个可以学习的参数(μ是求出的均值,σ是求出的...

    论文:https://arxiv.org/pdf/1502.03167.pdf

    以下博客对batch Normalization的原理,优点和代码解析做了非常清晰的讲解: http://blog.csdn.net/hjimce/article/details/50866313

    batch Normalization公式

    注意:上式中的γβ是两个可以学习的参数(μ是求出的均值,σ是求出的标准差,ε是人为设置的防止分母为0),实际上当γ取标准差、β取均值的时候,γβ对x标准化的操作提供了逆向的重构。加这个逆向操作的原因是,标准化操作可能会影响该层的表征,所以batch normalization应该有能表示identity transform的能力,所以使用了这两个可以学习的参数来重构让BN层有identity表达的能力

    batch Normalization对梯度的影响证明

    batch Normalization之所以有用,是对于梯度的影响, 解决了梯度消失,梯度爆炸问题,以至于dropout,L1 L2正则甚至都可以被舍弃.以下来自知乎答主.

    加上BN之前的梯度传播:

    1.首先,对某层的前向传播过程有:

    [公式]

    2.针对该层的反向传播过程为(由于我们关心的是梯度的连续反向传播过程,故不关注权重的梯度):

    [公式]

    3.进一步推导可得,连续多层的梯度反向传播过程为:

    [公式]

    由此我们可以初步看出,在梯度的连续反向传播过程中,是通过权重 [公式] 的连乘进行的。因此,如果权重 [公式] 的值总是较小的(广义上与1相比),则在反向过程中,梯度呈指数级衰减,就出现了梯度消失的问题;反之,如果如果权重 [公式] 总是较大,则相应的就会出现梯度爆炸的问题。结论就是,在反向传播过程中,权值 [公式] 的大小会极大的影响梯度的有效传播,而在训练过程中,权重并不总是受人为控制的。因此,我们有必要在一定程度上限制甚至消除权值 [公式] 对梯度反向传播的不良影响,于是乎,BN就登场了。

    在加上BN之后梯度传播如下:

    1.带有BN的前向传播过程如下所示(其中 [公式] 为列向量, [公式][公式] ):

    [公式]

    2.则其反向传播有:

    [公式]

    3.相应的,连续多层的梯度反向传播过程为:

    [公式]

    可以看出,与不使用BN相比,每层的反向传播过程的,增加了一个基于标准差的矩阵 [公式] 对权重 [公式] 进行缩放。所用,重点来了,这样的缩放能够产生什么效果?方法让我们分析一下,如果权重 [公式] 较小,那必然 [公式] 较小,从而使得其标准差 [公式] 较小,相对的 [公式] 较大,所以 [公式] 相对于原本的 [公式] 就放大了,避免了梯度的衰减;同样的,如果权重 [公式] 较大,可以很容易得到 [公式] 相对于原本的 [公式] 缩小了,避免了梯度的膨胀。于是,加入了BN的反向传播过程中,就不易出现梯度消失或梯度爆炸,梯度将始终保持在一个合理的范围内。而这样带来的好处就是,基于梯度的训练过程可以更加有效的进行,即加快收敛速度,减轻梯度消失或爆炸导致的无法训练的问题。

    4.进一步的,我们可以证明,加入BN后的反向传播过程与权重 [公式] 的尺度无关,证明如下( [公式] 为标量,表示任意尺度):

    [公式]


    作者:我不坏
    链接:https://www.zhihu.com/question/38102762/answer/391649040
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    Batch Normalization的均值和方差对谁求?

    1. 对feature map的channel方向求均值和方差, 假设batch size=n, feature map的shape= (w, h, c), 其中c是channel个数, 则会对c个n*w*h的特征分别求出c个均值和方差
    2. 同样的,为了减少参数量, 一个channel(相当于一种卷积核提取的同一种特征)只对应一组可学习的参数γ、β, 所以对于一层BN层, 可学习的参数为2*c个.

    补充:

    • Keras 现在的Batch Normalization里有一个momentum参数, 该参数作用于mean和variance的计算上, 这里保留了历史batch里的mean和variance值,即 moving_mean和moving_variance, 借鉴优化算法里的momentum算法将历史batch里的mean和variance的作用延续到当前batch. 一般momentum的值为0.9 , 0.99等. 多个batch后, 即多个0.9连乘后,最早的batch的影响会变弱.
    展开全文
  • 参数momentum与weight-decay的作用

    万次阅读 2016-10-05 17:09:46
    参数momentum与weight-decay的作用

    一、weight decay(权值衰减)使用的目的是防止过拟合。在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型损失函数的值也就大。

    二、momentum是梯度下降法中一种常用的加速技术。对于一般的SGD,其表达式为

    xxαdx
    ,x沿负梯度方向下降。而带momentum项的SGD则写生如下形式:
    v=βvadxxx+v

    其中 β 即momentum系数,通俗的理解上面式子就是,如果上一次的momentum(即 v <script type="math/tex" id="MathJax-Element-28">v</script>)与这一次的负梯度方向是相同的,那这次下降的幅度就会加大,所以这样做能够达到加速收敛的过程。

    作者:陈永志
    链接:https://www.zhihu.com/question/24529483/answer/114711446
    来源:知乎
    著作权归作者所有,转载请联系作者获得授权。

    展开全文
  • 参数momentum与weight-decay的作用.pdf
  • 深度学习中的momentum和weight decay参数

    千次阅读 2018-12-12 10:49:33
    如上公式,其中V代表动量,u代表参数momentum的值,a为学习率。   2.weight decay 该参数是损失函数中的正则化项的系数。正则化用于防止过拟合,因为当网络出现过拟合现象时网络权值逐渐变大的,而正则化能降低...

    1.momentum

    用于梯度下降算法中加速模型收敛。

    如上公式,其中V代表动量,u代表参数momentum的值,a为学习率。

     

    2.weight decay

    该参数是损失函数中的正则化项的系数。正则化用于防止过拟合,因为当网络出现过拟合现象时网络权值逐渐变大的,而正则化能降低权重。因此,为了避免出现overfitting,会给损失函数添加一个惩罚项,常用的惩罚项是所有权重的平方乘以一个衰减常量之和(L2正则化)用来惩罚大的权值。权值衰减惩罚项使得权值收敛到较小的绝对值,而惩罚大的权值。因为大的权值会使得系统出现过拟合,降低其泛化性能。caffe中默认是使用L2正则化。L1正则化的正则化项是权重的绝对值。

    展开全文
  • PyTorch SGD 中参数 Momentum 的理解

    千次阅读 2020-12-02 18:38:29
    动量,他的作用是尽量保持当前梯度的变化方向。没有动量的网络可以视为一个质量很轻的棉花团,风往哪里吹就往哪里走,一点风吹草动都影响他,四处跳动不容易学习到更好...怎么通俗易懂的理解SGD中Momentum的含义? ...
  • 关于神经网络的优化,吴恩达的深度学习课程...通过梯度下降法,使得网络参数不断收敛到全局(或者局部)最小值,但是由于神经网络层数太多,需要通过反向传播算法,把误差一层一层地从输出传播到输入,逐层地更新网络参
  • -> 错误如题; -> 错误是在使用PyTorch自带的循环学习率API<torch.optim.lr_schedualr.CyclicLR>以及使用Adam优化器时出现的; -> 具体原因:原因在报错信息中...因为cycle_momentum参数默认就是Tru...
  • momentum是mxnet包中SGD(随机梯度下降)优化器的一个参数。它是用来更新SGD优化器权值的。具体如下:rescaled_grad = lr * rescale_grad * clip(grad, clip_gradient) + wd * weight state = momentum * state + ...
  • 参数是指机器学习模型里面的框架参数,和训练过程中学习的参数(权重)不一样,超参数通常是手工设定,不断试错调整,或者对一系列穷举出来的参数组合一通进行枚举(网格搜索)。 深度学习和神经网络模型,有很多...
  • http://blog.csdn.net/luo123n/article/details/48239963
  • 利用深度学习网络训练模型时,需要对一些超参数作用与意义进行清楚了解,才能根据实际训练时出现的问题做相应调整,进而训练出满足精度的模型。 一、momentum 动量来源于牛顿定律,基本思想是为了找到最优,SGD通常...
  • momentum 动量越大时,其转换为势能的能量也就越大,就越有可能摆脱局部凹域的束缚,进入全局凹域。momentum 动量主要用在权重更新的时候。一般,神经网络在更新权值时,采用如下公式:  w = w - learning_rate *...
  • 参数更新时,不直接使用梯度负方向: 使用之前的梯度来规划当前的梯度: 3.Adagrad 加入了自适应学习率,来规划步长: 4.Adam 使用一阶动量来更新方向,二阶动量来更新步长: 参考链接:...
  • 说到这些参数就会想到Stochastic Gradient Descent (SGD)!其实这些参数在caffe.proto中 对caffe网络中出现的各项参数做了详细的解释。 Learning Rate 学习率决定了权值更新的速度,设置得太大会使结果超过最优值...
  • Momentum算法

    千次阅读 2019-09-22 15:39:40
    Momentum的含义是‘动量’ # 为了解决SGD随机梯度下降算法的缺点,引入了Momentum # v表示在梯度方向上的受力 import numpy as np class Momentum: def __init__(self, learning_rate=0.01, momentum=0.9): ...
  • 神经网络的学习的目的就是找到合适的参数使损失函数的值尽可能的小。这种寻找最优参数的过程就叫做最优化(optimization)。然而在深度神经网络中,参数的数量非常庞大,导致最优化的问题非常复杂。下面介绍四种常见...
  • 转载地址 https://blog.csdn.net/aoxuerenwudi/article/details/109208500
  • 说到这些参数就会想到Stochastic Gradient Descent (SGD)!其实这些参数在caffe.proto中 对caffe网络中出现的各项参数做了详细的解释。Learning Rate学习率决定了权值更新的速度,设置得太大会使结果超过最优值,太...
  • DL之DNN优化技术:DNN优化器的参数优化—更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解、图表可视化比较 目录 四种最优化方法简介 优化器案例理解 输出结果 设计思路 核心代码 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,523
精华内容 9,409
关键字:

momentum参数