batchnorm批量泛化

本文深入探讨BatchNorm解决的Covariate Shift与Internal Covariate Shift问题,解释BatchNorm如何通过引入可训练参数gama和beta加速模型收敛并提升泛化能力。文章详细介绍了BatchNorm的计算步骤,并提供了代码实现。

Batchnorm主要解决的问题:

covariate shift:
我们知道在做ml相关的项目时,由于训练数据和测试数据存在分布的差异性,需要对数据做归一化和白化,来提升模型的收敛速度和泛化性(训练时,数据归一化;测试时数据归一化)。Covariate ShiftShift 就是描述的训练预测输入数据分布不一致的现象,通过归一化,提升了模型的泛化能力,同时把数据缩放到一定的范围内可以提升模型的收敛速度。

Internal Covariate Shift:
Internal Covariate Shift 和Covariate Shift具有相似性,但并不是一个东西,前者发生在神经网络的内部,所以是Internal,后者发生在输入数据上。在深度神经网络中,数据经过一层层网络计算后,其数据分布也在发生着变化,此现象称为Internal Covariate Shift。那么怎么解决这个问题呢?如果单纯的每一层用归一化,神经网络又无法学习到数据的特征分布情况,于是这里加入了两个可以训练的参数gama缩放因子,beta偏置,这就是BatchNorm的实现了
在这里插入图片描述
之所以称之为batchnorm是因为所norm的数据是一个batch的,假设输入数据是β=x1…mβ=x1…m​共m个数据,输出是yi=BN(x)yi​=BN(x),batchnorm

batchnorm的步骤如下:

1.先求出此次批量数据x的均值
2.求出此次batch的方差
3.接下来就是对x做归一化
4.最重要的一步,引入缩放和平移变量(gama,beta) ,计算归一化后的值
(个人理解是将学习数据的分布转化为学习gama,beta两个变量,应该是这个样子吧)

这样就保证了每一次数据经过归一化后还保留的有学习来的特征,这样也就加速了模型的收敛速度,同时也能提升模型的泛化能力。

代码实现(转自知乎):

def batch_norm_layer(x, train_phase, scope_bn):
    with tf.variable_scope(scope_bn):
		# 新建两个变量,平移、缩放因子
        beta = tf.Variable(tf.constant(0.0, shape=[x.shape[-1]]), name='beta', trainable=True)
        gamma = tf.Variable(tf.constant(1.0, shape=[x.shape[-1]]), name='gamma', trainable=True)
        
        # 计算此次批量的均值和方差
        axises = np.arange(len(x.shape) - 1)
        batch_mean, batch_var = tf.nn.moments(x, axises, name='moments')

		# 滑动平均做衰减
        ema = tf.train.ExponentialMovingAverage(decay=0.5)

        def mean_var_with_update():
            ema_apply_op = ema.apply([batch_mean, batch_var])
            with tf.control_dependencies([ema_apply_op]):
                return tf.identity(batch_mean), tf.identity(batch_var)
        # train_phase 训练还是测试的flag
		# 训练阶段计算runing_mean和runing_var,使用mean_var_with_update()函数
		# 测试的时候直接把之前计算的拿去用 ema.average(batch_mean)
        mean, var = tf.cond(train_phase, mean_var_with_update,
                            lambda: (ema.average(batch_mean), ema.average(batch_var)))
        normed = tf.nn.batch_normalization(x, mean, var, beta, gamma, 1e-3)
    return normed

至于此行代码tf.nn.batch_normalization()就是简单的计算batchnorm过程啦,代码如下:
这个函数所实现的功能就如此公式:gama(x-u)/theta + beta

def batch_normalization(x,
                        mean,
                        variance,
                        offset,
                        scale,
                        variance_epsilon,
                        name=None):
                        
    with ops.name_scope(name, "batchnorm", [x, mean, variance, scale, offset]):
        inv = math_ops.rsqrt(variance + variance_epsilon)
        if scale is not None:
            inv *= scale
        return x * inv + (offset - mean * inv
                      if offset is not None else -mean * inv)


参考:https://blog.youkuaiyun.com/qq_25737169/article/details/79048516

### 回答1: BatchNorm1d是PyTorch中的一个函数,用于对输入的一维数据进行批量归一化操作。批量归一化是一种常见的神经网络正则化技术,通过对每个batch内的数据进行归一化操作,可以加速网络训练,提高网络的泛化能力。BatchNorm1d的输入是一个一维数据,输出也是一个一维数据,它的作用是对输入数据按照batch进行归一化,同时维护一个均值和标准差,用于在网络的训练和推理过程中对数据进行标准化处理。BatchNorm1d可以应用于各种类型的神经网络模型中,比如卷积神经网络、循环神经网络等。 ### 回答2: BatchNorm1d是一种用于深度学习模型中的归一化技术。它的主要目的是减少深度神经网络中的内部协变量偏移问题。 在深度神经网络中,每个层的输入都受到前一层权重和激活函数的影响。由于网络参数的更新,每一层输出的分布可能会发生变化,这会使得下一层的训练变得困难。BatchNorm1d的目标就是解决这个问题。 BatchNorm1d通过对每个小批量输入进行归一化操作,将输入调整为均值为0,方差为1的分布。它通过对当前小批量数据的统计特性进行估计,即数据的均值和方差,然后将这些统计特性应用于每个小批量数据的归一化中。这样,即使输入数据的分布发生变化,每一层的输入分布也保持稳定,从而加快了模型的收敛速度。 BatchNorm1d的优点是它能够有效降低梯度爆炸和消失的问题。通过将输入数据规范化到较小的范围内,防止梯度在网络中传播时出现过大或过小的情况。这使得网络更易于训练,并且可以使用更高的学习率来加速训练过程。 此外,BatchNorm1d还具有正则化的效果。由于在每个小批量输入中引入了噪声,它有助于减少过拟合问题,提高模型泛化能力。 总之,BatchNorm1d是一种用于深度学习模型的归一化技术,通过对每个批量输入进行归一化操作,加速模型的收敛,减少梯度问题,并具有正则化效果。它是提高模型性能和训练效率的重要工具。 ### 回答3: BatchNorm1d是一种用于神经网络中的批量归一化操作。它是一种优化网络训练过程的方法,可以加速收敛、提高模型性能。 BatchNorm1d主要用于处理输入数据中的批量归一化。在神经网络中,每一层的输入都有可能存在不同的分布情况,如果分布偏差较大,会造成梯度消失或梯度爆炸的问题。而BatchNorm1d可以通过对每个批次的数据进行标准化,从而解决这个问题。 BatchNorm1d的实现主要包括两个步骤。首先,对于每个批次的数据,计算其均值和方差。然后,利用批次内的均值和方差对数据进行标准化操作,使得数据分布接近于标准正态分布。 BatchNorm1d的好处是多方面的。首先,它可以提高网络的泛化能力,减少过拟合的情况。其次,它可以加速网络的收敛速度,提高模型的训练效率。此外,BatchNorm1d还可以增强网络对输入数据的健壮性,提高模型的鲁棒性。 BatchNorm1d广泛应用于深度学习领域的各种任务中,包括图像识别、目标检测、语音识别等。它已经成为神经网络中不可或缺的一部分,具有重要的实用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值