自然语言处理(NLP)-模型常用技巧:Normalization【Batch Norm、Layer Norm】

一、为什么对数据归一化

我们知道在神经网络训练开始前,需要对输入数据做归一化处理,那么具体为什么需要归一化呢?

  • 一方面,神经网络学习过程本质就是为了学习数据特征以及数据的分布特征,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;
  • 另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。

同时也是在训练前为什么要把训练数据充分打乱的原因,充分打乱使得每个batch的样本包含各类别的数据,这样通过每个batch的样本训练时各个batch所包含的数据分布更接近,同时和整个训练集的数据分布更接近,更有利于训练出更泛化的模型,同时有利于模型的收敛。

试想不充分打乱数据,若每个batch只包含一个类别的数据,不同的batch数据进行训练时网络就要在每次迭代都去学习适应不同的分布,会使得网络收敛很慢。

二、数据进行归一化标准化常用的方法

归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2018年);

将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,

  • batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
  • layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
  • instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
  • GroupNorm将channel分组,然后再做归一化;
  • SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。

在这里插入图片描述

在这里插入图片描述
论文总结:

  1. Batch Normalization
    https://arxiv.org/pdf/1502.03167.pdf

  2. Layer Normalizaiton
    https://arxiv.org/pdf/1607.06450v1.pdf

  3. Instance Normalization
    https://arxiv.org/pdf/1607.08022.pdf
    https://github.com/DmitryUlyanov/texture_nets

  4. Group Normalization
    https://arxiv.org/pdf/1803.08494.pdf

  5. Switchable Normalization
    https://arxiv.org/pdf/1806.10779.pdf
    https://github.com/switchablenorms/Switchable-Normalization

1、Batch Normalization

首先,在进行训练之前,一般要对数据做归一化,使其分布一致,但是在深度神经网络训练过程中,通常以送入网络的每一个batch训练,这样每个batch具有不同的分布;此外,为了解决internal covarivate shift问题,这个问题定义是随着batch normalizaiton这篇论文提出的,在训练过程中,数据分布会发生变化,对下一层网络的学习带来困难。

所以batch normalization就是强行将数据拉回到均值为0,方差为1的正太分布上,这样不仅数据分布一致,而且避免发生梯度消失。

此外,internal corvariate shift和covariate shift是两回事,前者是网络内部,后者是针对输入数据,比如我们在训练数据前做归一化等预处理操作。

在这里插入图片描述)
算法过程:

  • 沿着通道计算每个batch的均值u
  • 沿着通道计算每个batch的方差 σ 2 σ^2 σ2
  • x x x 做归一化, x ′ = ( x − u ) ( σ 2 + ε ) x'=\cfrac{(x-u)}{\sqrt{(σ^2+ε)}} x=(σ2+ε) (xu)
  • 加入缩放和平移变量 γ γ γ β β β ,归一化后的值, y = γ x ′ + β y=γx'+β y=γx+β

加入缩放平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。

import numpy as np

def Batchnorm(x, gamma, beta, bn_param):

    # x_shape:[B, C, H, W]
    running_mean = bn_param['running_mean']
    running_var = bn_param['running_var']
    results = 0.
    eps = 1e-5

    x_mean = np.mean(x, axis=(0, 2, 3), keepdims=True)
    x_var = np.var(x, axis=(0, 2, 3), keepdims=True0)
    x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
    results = gamma * x_normalized + beta

    # 因为在测试时是单个图片测试,这里保留训练时的均值和方差,用在后面测试时用
    running_mean = momentum * running_mean + (1 - momentum) * x_mean
    running_var = momentum * running_var + (1 - momentum) * x_var

    bn_param['running_mean'] = running_mean
    bn_param['running_var'] = running_var

    return results, bn_param

2、Layer Normalizaiton

Batch Normalization存在以下缺点:

  • 对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布;
  • BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。(参考https://blog.csdn.net/lqfarmer/article/details/71439314)

与Batch Normalization不同,Layer Normalizaiton是针对深度网络的某一层的所有神经元的输入按以下公式进行normalize操作。
在这里插入图片描述
BN与LN的区别在于:

  • LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差;
  • BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。

所以,LN不依赖于batch的大小和输入sequence的深度,因此可以用于batch_size为1和RNN中对边长的输入sequence的normalize操作。

LN用于RNN效果比较明显,但是在CNN上,不如BN。

def ln(x, b, s):
    _eps = 1e-5
    output = (x - x.mean(1)[:,None]) / tensor.sqrt((x.var(1)[:,None] + _eps))
    output = s[None, :] * output + b[None,:]
    return output

用在四维图像上,

def Layernorm(x, gamma, beta):

    # x_shape:[B, C, H, W]
    results = 0.
    eps = 1e-5

    x_mean = np.mean(x, axis=(1, 2, 3), keepdims=True)
    x_var = np.var(x, axis=(1, 2, 3), keepdims=True0)
    x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
    results = gamma * x_normalized + beta
    return results

3、Batch Normalization和Layer Normalization的对比分析

在这里插入图片描述

Batch Normalization和Layer Normalization的对比:

  • Batch Normalization 的处理对象是对一批样本, Layer Normalization 的处理对象是单个样本。
  • Batch Normalization 是对这批样本的同一维度特征(每个神经元)做归一化, Layer Normalization 是对这单个样本的所有维度特征做归一化。
  • LN不依赖于batch的大小和输入sequence的深度,因此可以用于batch-size为1和RNN中对边长的输入sequence的normalize操作。但在大批量的样本训练时,效果没BN好。
  • 实践证明,LN用于RNN进行Normalization时,取得了比BN更好的效果。但用于CNN时,效果并不如BN明显。



参考资料:
BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结
什么是批标准化 (Batch Normalization)
Batch Normalization和Layer Normalization的对比分析

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: nn.LayerNorm()是PyTorch中的一个层,用于对输入进行归一化。它将输入张量的每个通道(axis=1)的值进行归一化,使得它们在均值为0,方差为1的分布上。这有助于在深度神经网络中提高训练稳定性和加速收敛速度。 nn.LayerNorm()的输入是一个形状为(batch_size, num_features)的张量,其中batch_size是批次大小,num_features是每个样本的特征数量。它的输出与输入具有相同的形状。可以将它应用于循环神经网络、卷积神经网络等各种深度学习模型中。 ### 回答2: nn.LayerNorm()是PyTorch中的一个函数,用于进行归一化操作。所谓归一化是指将数据按比例缩放使其落入一个特定的区间。 nn.LayerNorm()主要用于对输入数据进行归一化处理。它的作用是通过减去平均值然后除以标准差的方式,对输入的每个样本进行归一化处理。 nn.LayerNorm()会根据输入的维度计算每个维度上的平均值和标准差,然后对输入进行归一化操作。这样可以确保输入具有相似的数据分布,有助于模型的收敛和训练的稳定性。 nn.LayerNorm()常用深度学习中的神经网络中,特别是在自然语言处理NLP)和语音识别等任务中。通过对输入进行归一化处理,有助于模型更好地学习输入数据的特征,提高模型的性能和鲁棒性。 需要注意的是,nn.LayerNorm()是对输入进行逐样本的归一化,而不是对整个批次的数据进行归一化。因此,它适用于各个样本之间数据分布有较大差异的情况。 总之,nn.LayerNorm()是PyTorch中的一个函数,用于对输入数据进行归一化处理。它可以提高模型的性能和训练的稳定性,常用深度学习中的神经网络,特别是NLP和语音识别等任务中。 ### 回答3: nn.LayerNorm() 是 PyTorch 框架中的一种归一化层。该层用于通过标准化输入来提高神经网络的训练效果。 在深度学习中,由于网络层数的增加和激活函数的非线性特性,随着数据流动,每一层的输入值会发生变化,这种变化会影响网络的训练和性能。传统的归一化方法如 Batch Normalization 仅对每个 mini-batch 进行标准化,但这种方法在小批量情况下会有较大的方差偏差。 而 nn.LayerNorm() 通过对输入张量的最后一个维度进行标准化来解决上述问题,保证了在不同样本之间,每个特征的分布是一致的。这种标准化方法更适用于自然语言处理任务或者序列处理任务,其中序列的长度可能不同。 nn.LayerNorm() 的计算公式如下: \[\text{LayerNorm}(x) = \frac{(x - \mu)}{\sqrt{\sigma^2 + \epsilon}} \odot \gamma + \beta\] 其中,\(x\) 表示输入张量,\(\mu\) 表示该张量在最后一个维度上的均值,\(\sigma\) 表示标准差,\(\odot\) 表示按元素相乘,\(\gamma\) 和 \(\beta\) 分别是可学习的缩放因子和偏移量。 通过 nn.LayerNorm() 层的使用,网络在训练过程中,可以更好地处理变化的输入分布,加快模型收敛速度,并能够对小批量数据进行更准确的预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值