Batch Norm 与 Group Norm

假设没有归一化操作:神经网络的每层输入数据分布是不断变化的,参数需要重新学习来适应这种分布,降低学习速度。

对于sigmoid或tanh激活函数,输入数据过大或过小容易落入饱和区导致梯度消失。

归一化操作:h=f\left(\mathbf{g} \cdot \frac{\mathbf{x}-\mu}{\sigma}+\mathbf{b}\right)

μ是平移参数,σ是缩放参数。得到\hat{\mathbf{x}}=\frac{\mathbf{x}-\mu}{\sigma}得到的数据符合均值为 0、方差为 1 的标准分布。

b是再平移参数,g是再缩放参数。最终得到的数据符合均值为 b 、方差为 g^2 的分布。

第一次的平移缩放可以有效避免梯度消失,但此时模型的非线性学习能力较差,所以经过第二次的平移缩放将数据从线性区映射到非线性区,恢复模型的表达能力。

Batch Norm:

\mu_{i}=\frac{1}{M} \sum x_{i}, \quad \sigma_{i}=\sqrt{\frac{1}{M} \sum\left(x_{i}-\mu_{i}\right)^{2}+\epsilon}    M是mini-batch的大小 

卷积层的输入是三维的(通道数*长*宽),经过m个卷积核,每个卷积核对三维输入进行计算,输出值是二维平面,由于存在m个卷积核,所以输出仍然是三维的:m个通道,每个通道一个二维平面。训练过程中,假设每个batch包含n个训练实例,顺序通过同一个卷积核,则该通道输出n个二维激活平面,每个平面假设5*5,共25个激活值,那么BatchNorm执行的范围就是所有激活平面的所有激活值。

BatchNorm 的操作就是将x转换到固定区间满足标准分布。

mean_value = np.mean(x, axis=0)#求均值
var_value = np.var(x, axis=0)#求方差
x = (x-mean_value)/np.sqrt(var_value+eps)#浮点数,归一化
out = gamma*x + beta

优点 :防止梯度消失,加快模型收敛(导数最大区)

缺点 :Batch太小,BN效果不明显(梯度更新方向不确定)RNN等动态网络(输入序列不定长)使用BN层效果不佳。

Group Norm:

将某一卷积层的输出或者输入通道进行分组,GN在batch size较小的情况下由于BN。

神经网络中数据的维度是[N, C, H, W],即batch size   channels  height  width 

BN在batch的维度上Norm,归一化后的维度[N,H,W]

GN先将channel分成组,对每一组进行归一化。先将feature maps reshape为[N, G, C//G, H, W ] 归一化后为[C//G, H, W]

def GroupNorm(x, gamma, beta, G, eps=1e-5):
    N, C, H, W = x.shape
    x = tf.reshape(x, [N, G, C//G, H, W])
    mean, var = tf.nn.moments(x, [2,3,4], keepdims=True)
    x = (x-mean)/tf.sqrt(var+eps)
    x = tf.reshape(x, [N,C,H,W])
    return x*gamma + beta

 


版权声明:本文为weixin_41595062原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。