Group Normalization
FAIR 團隊,吳育昕和愷明大大的新作Group Normalization。
主要的優勢在於,BN會受到batchsize大小的影響。如果batchsize太小,算出的均值和方差就會不准確,如果太大,顯存又可能不夠用。
而GN算的是channel方向每個group的均值和方差,和batchsize沒關系,自然就不受batchsize大小的約束。
從上圖可以看出,隨着batchsize的減小,GN的表現基本不受影響,而BN的性能卻越來越差。
BatchNorm基礎:

其中u為均值,seigema為方差,實際訓練中使用指數滑動平均EMA計算。
gamma為scale值,beta為shift值

BatchNorm:batch方向做歸一化,算N*H*W的均值
LayerNorm:channel方向做歸一化,算C*H*W的均值
InstanceNorm:一個channel內做歸一化,算H*W的均值
GroupNorm:將channel方向分group,然后每個group內做歸一化,算(C//G)*H*W的均值
Tensorflow代碼:
- def GroupNorm(x,G=16,eps=1e-5):
- N,H,W,C=x.shape
- x=tf.reshape(x,[tf.cast(N,tf.int32),tf.cast(H,tf.int32),tf.cast(W,tf.int32),tf.cast(G,tf.int32),tf.cast(C//G,tf.int32)])
- mean,var=tf.nn.moments(x,[1,2,4],keep_dims=True)
- x=(x-mean)/tf.sqrt(var+eps)
- x=tf.reshape(x,[tf.cast(N,tf.int32),tf.cast(H,tf.int32),tf.cast(W,tf.int32),tf.cast(C,tf.int32)])
- gamma = tf.Variable(tf.ones(shape=[1,1,1,tf.cast(C,tf.int32)]), name="gamma")
- beta = tf.Variable(tf.zeros(shape=[1,1,1,tf.cast(C,tf.int32)]), name="beta")
- return x*gamma+beta
References:
https://www.zhihu.com/question/269576836/answer/348670955
https://github.com/taokong/group_normalization
https://github.com/shaohua0116/Group-Normalization-Tensorflow