济源建设企业网站公司,最专业的网站建设组织,网络营销的理论基础有哪些,wordpress 百度云绿色区域表示将该区域作用域(四种方法都贯穿了w,h维度)#xff0c;即将该区域数值进行归一化#xff0c;变为均值为0#xff0c;标准差为1。BN的作用区域时N,W,H,表示一个batch数据的每一个通道均值为0#xff0c;标准差为1#xff1b;LN则是让每个数据的所有channel的均值…绿色区域表示将该区域作用域(四种方法都贯穿了w,h维度)即将该区域数值进行归一化变为均值为0标准差为1。BN的作用区域时N,W,H,表示一个batch数据的每一个通道均值为0标准差为1LN则是让每个数据的所有channel的均值为0标准差为1。IN表示对每个数据的每个通道的均值为0标准差为1.BNLNINGN从学术化上解释差异BatchNormbatch方向做归一化算NHW的均值对小batchsize效果不好BN主要缺点是对batchsize的大小比较敏感由于每次计算均值和方差是在一个batch上所以如果batchsize太小则计算的均值、方差不足以代表整个数据分布LayerNormchannel方向做归一化算CHW的均值主要对RNN作用明显InstanceNorm一个channel内做归一化算H*W的均值用在风格化迁移因为在图像风格化中生成结果主要依赖于某个图像实例所以对整个batch归一化不适合图像风格化中因而对HW做归一化。可以加速模型收敛并且保持每个图像实例之间的独立。GroupNorm将channel方向分group然后每个group内做归一化算(C//G)HW的均值这样与batchsize无关不受其约束。SwitchableNorm是将BN、LN、IN结合赋予权重让网络自己去学习归一化层应该使用什么方法。BN的理解Internal Covariate Shift定义在深层网络训练的过程中由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。Internal Covariate Shift引发的问题1上层网络需要不停调整来适应输入数据分布的变化导致网络学习速度的降低我们在上面提到了梯度下降的过程会让每一层的参数 和 发生变化进而使得每一层的线性与非线性计算结果分布产生变化。后层网络就要不停地去适应这种分布变化这个时候就会使得整个网络的学习速率过慢。2网络的训练过程容易陷入梯度饱和区减缓网络收敛速度当我们在神经网络中采用饱和激活函数saturated activation function时例如sigmoidtanh激活函数很容易使得模型训练陷入梯度饱和区saturated regime。随着模型训练的进行我们的参数 会逐渐更新并变大此时 就会随之变大并且 还受到更底层网络参数 的影响随着网络层数的加深 很容易陷入梯度饱和区此时梯度会变得很小甚至接近于0参数的更新速度就会减慢进而就会放慢网络的收敛速度。对于激活函数梯度饱和问题有两种解决思路。第一种就是更为非饱和性激活函数例如线性整流函数ReLU可以在一定程度上解决训练进入梯度饱和区的问题。另一种思路是我们可以让激活函数的输入分布保持在一个稳定状态来尽可能避免它们陷入梯度饱和区这也就是Normalization的思路。BN的优点1BN使得网络中每层输入数据的分布相对稳定加速模型学习速度2BN使得模型对网络中的参数不那么敏感简化调参过程使得网络学习更加稳定3BN允许网络使用饱和性激活函数例如sigmoidtanh等缓解梯度消失问题4BN具有一定的正则化效果BN的用法对小批量(mini-batch)的2d或3d输入进行批标准化(Batch Normalization)操作在每一个小批量mini-batch数据中计算输入各个维度的均值和标准差。gamma与beta是可学习的大小为C的参数向量C为输入大小在训练时该层计算每次输入的均值与方差并进行移动平均。移动平均默认的动量值为0.1。在验证时训练求得的均值/方差将用于标准化验证数据。参数num_features 来自期望输入的特征数该期望输入的大小为batch_size x num_features x widtheps 为保证数值稳定性分母不能趋近或取0,给分母加上的值。默认为1e-5。momentum 动态均值和动态方差所使用的动量。默认为0.1。affine 一个布尔值当设为true给该层添加可学习的仿射变换参数。Shape - 输入N, C或者(N, C, L) - 输出N, C或者NCL输入输出相同example: # With Learnable Parametersm nn.BatchNorm1d(100)# Without Learnable Parametersm nn.BatchNorm1d(100, affineFalse)input autograd.Variable(torch.randn(20, 100))output m(input)Shape - 输入N, CH, W) - 输出N, C, H, W输入输出相同归一化维度[N,H,W],计算C次均值方差 # With Learnable Parametersm nn.BatchNorm2d(100)# Without Learnable Parametersm nn.BatchNorm2d(100, affineFalse)input autograd.Variable(torch.randn(20, 100, 35, 45))output m(input)LN的用法# NLP Example
batch, sentence_length, embedding_dim 20, 5, 10
embedding torch.randn(batch, sentence_length, embedding_dim)
layer_norm nn.LayerNorm(embedding_dim)
# Activate module
layer_norm(embedding)
# Image Example
N, C, H, W 20, 5, 10, 10
input torch.randn(N, C, H, W)
# Normalize over the last three dimensions (i.e. the channel and spatial dimensions)
# as shown in the image below
layer_norm nn.LayerNorm([C, H, W])
output layer_norm(input)IN的用法# Without Learnable Parameters
m nn.InstanceNorm2d(100)
# With Learnable Parameters
m nn.InstanceNorm2d(100, affineTrue)
input torch.randn(20, 100, 35, 45)
output m(input)GN的用法input torch.randn(20, 6, 10, 10)
# Separate 6 channels into 3 groups
m nn.GroupNorm(3, 6)
# Separate 6 channels into 6 groups (equivalent with InstanceNorm)
m nn.GroupNorm(6, 6)
# Put all 6 channels into a single group (equivalent with LayerNorm)
m nn.GroupNorm(1, 6)
# Activating the module
output m(input)BN和LN的用法差异BN是把除了轴C外的所有轴的元素放在一起取平均值和方差的然后对每个元素进行归一化最后再乘以对应的γ和β共享。BN共有num_features个mean和var假设输入数据的维度为(N,C, H, W。而LN是把normalized_shape这几个轴的元素都放在一起取平均值和方差的然后对每个元素进行归一化最后再乘以对应的γ和β 每个元素不同。LN共有N1*N2个mean和var假设输入数据的维度为(N,normalized_shapeC H Wnormalized_shape表示多个维度思考题1为什么Layer Norm是对每个单词的Embedding做归一化因为每个序列每个样本的单词个数不一样但在代码实现的时候会进行padding比如一个序列原始单词数为30个另一个序列原始单词数是8然后你统一padding成了30个单词那如果按照相同维度进行归一化norm的信息就会被无意义的padding的embedding冲淡的这显然是不合理的。思考题2为什么BN训练和测试时有区别而LN没区别BatchNorm的统计量是一个batch算出来的在线测试时不太可能累计一个batch资料后再进行测试的。所以在训练的时候要记录统计量running mean和running var作为预测时的均值和方差。而LayerNorm训练和测试的时候不需要model.train()和model.eval()是因为它只针对一个样本不是针对一个batch所以LayerNorm只有参数gamma和beta没有统计量因此LN训练和预测没有区别。参考文献https://zhuanlan.zhihu.com/p/34879333https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-nn/#normalization-layers-sourcehttps://blog.csdn.net/fksfdh/article/details/124750629https://liumin.blog.csdn.net/article/details/85075706https://blog.csdn.net/qq_43827595/article/details/121877901https://pytorch.org/docs/stable/generated/torch.nn.LayerNorm.html#torch.nn.LayerNorm