怎么推广我做的网站,做网站服务器空间,建设企业网站用动态还是静态,企业网站优化报告文章目录1 概述2 几种normalization的方法2.1 Batch Norm2.2 Layer Norm2.3 Instance Norm2.4 Group Norm3 效果对比参考文献1 概述
Group Nomralization的提出是为了解决一张GPU上能容纳的batch_size很小#xff0c;导致模型训练效果显著变差的问题。随着深度学习的快速发展…
文章目录1 概述2 几种normalization的方法2.1 Batch Norm2.2 Layer Norm2.3 Instance Norm2.4 Group Norm3 效果对比参考文献1 概述
Group Nomralization的提出是为了解决一张GPU上能容纳的batch_size很小导致模型训练效果显著变差的问题。随着深度学习的快速发展我们所使用的模型越来越大了这也就导致了在训练时一个batch所占用的显存越来越大了也i就导致了一张卡上的batch_size会很小最终导致了模型最终效果大幅变差。这里之所以强调一张卡并不是因为穷而是因为batch normalization在计算batch的mean和variance的时候只能是以一张卡上的batch_size为单位去算的多卡之间不会对此进行通信。
如下图所示batch normalization的效果受batch size的影响很大但是group nomalization完全不受batch size的影响其计算压根就和batch没关系效果也不逊色于batch normalization而且batch size越小优势越大。
2 几种normalization的方法
normalization是为了解决Internal Covariate Shift以及梯度弥散和爆炸的问题这两个都是深度学习模型中非常关键的问题因此normalization这步是逃不掉的。说到这里了不妨说两句Internal Covariate Shift是个啥我个人最直观的理解就是模型的输入经过一层层的计算之后每一层的输入的数据分布是不一样的这就导致了结果的不准确covariate shift现象的解释这篇博客很形象地举例说明了这个问题这里点到为止。
目前主流的有四种normalization的方法分别是Batch NormLayer NormInstance Norm以及Group Norm其操作其实都很简明易懂。下图是这四种方法主要区别的一个对比示意图。下面会详细说一说这几种方法。
2.1 Batch Norm
假设我们的输入是一个shape为(N,C,H,W)的向量其中N表示Batch size的大小C表示channel数量H为heightW为width。那么Batch Norm就会在整个batch的每个channel上计算一次均值和方差并对每个channel进行归一化。 其详细计算过程为 要再次强调的是上面的计算都是在每个channel上进行的有几个channel就会算出几个均值和方差。另外值得一提的是这里有一个γ\gammaγ和β\betaβ他们是模型可以学习的参数。并不是模型的每一层都需要进行归一化当γσ2ϵ\gamma \sqrt{\sigma^2 \epsilon}γσ2ϵ且 βμ\beta \muβμ时就还原成了没有归一化的数据。ϵ\epsilonϵ是为了预防分母为0而加的一个很小的数。
不过这里有个问题就是inference的时候该咋办inference的时候如果时计算输入数据的均值和方差的话那岂不是我一张一张图片输入和多张图片一起输入的结果还不一样了。放心inference的时候Batch Norm用的均值和方差时训练时候记录下来的整个训练数据的均值和方差的期望。
2.2 Layer Norm
Layer Norm的目的和本文开头所讲的Group Norm的目的是一样的。不过它的做法比较极端它是在一个数据的所有channel上计算均值和方差的这干想想也有点问题不同channel代表的特征是不同的把他们归一化到同一个均值和方差上未免有些强人所难。 这是group norm的一种极端形式当group的大小刚好等于C时就是Layer Norm了。
2.3 Instance Norm
Instance Norm和Layer Norm对着干它也知道不同意义的channel不能一起归一化于是就干脆用一条数据一个channel上的数据进行归一化。不过这也过于极端一条数据一个channel上计算出来的均值和方差未免有些不太靠谱难以表征这个channel的数据分布。 这也是group norm的一种极端形式当group的大小刚好等于1时就是Instance Norm了。
2.4 Group Norm
Group Norm是个和事佬设置了一个叫做group的东西取一部分的channels作为一个group进行归一化既不得罪Layer Norm也不得罪Instance Norm因为一些经典的比如SIFT和HOG这样的特征的确是以group为单位的。事实也证明这个和事佬做的很成功。 Group Norm的代码也很简单只需要短短几行就可以了
def GroupNorm(x, gamma, beta, G, eps1e−5):# x: input features with shape [N,C,H,W]# gamma, beta: scale and offset, with shape [1,C,1,1]# G: number of groups for GNN, C, H, W x.shapex tf.reshape(x, [N, G, C // G, H, W])mean, var tf.nn.moments(x, [2, 3, 4], keep dimsTrue)x (x − mean) / tf.sqrt(var eps)x tf.reshape(x, [N, C, H, W])return x ∗ gamma beta另一个好处就是它在inference时不需要依赖训练时的均值和方差。
3 效果对比
1相同batch size不同normalization 当batch size都是32时Batch Norm的效果时最好的Group Norm其次Layer Norm和Instance Norm就没有什么竞争力了可以忽略不计了。
2不同batch sizeBatch Norm和Group Norm对比 当batch size比较大时Batch Norm是占优势的但当batch size变小时Batch Norm的效果就越来越差了。而Group Norm的效果不受batch size的影响。 3Group Norm在不同Group size下的表现 当只有一个group时Group Norm就变成了Layer Norm当每个group只有一个channel时就变成了Instance Norm。实验证明group的大小在32或者16个channel左右时比较优的一个值一般的框架中默认的都是32。 Group Norm虽然解决了单卡batch size小时模型表现部好的问题但是也带来了一个需要调节的超参数group size。这也意味着要做更多的实验。
参考文献
[1] Group Normalization [2] Group Normalization (Paper Explained) [3] Implementing Batch Normalization in Python