假设没有归一化操作:神经网络的每层输入数据分布是不断变化的,参数需要重新学习来适应这种分布,降低学习速度。
对于sigmoid或tanh激活函数,输入数据过大或过小容易落入饱和区导致梯度消失。
归一化操作:
μ是平移参数,σ是缩放参数。得到得到的数据符合均值为 0、方差为 1 的标准分布。
b是再平移参数,g是再缩放参数。最终得到的数据符合均值为 b 、方差为 g^2 的分布。
第一次的平移缩放可以有效避免梯度消失,但此时模型的非线性学习能力较差,所以经过第二次的平移缩放将数据从线性区映射到非线性区,恢复模型的表达能力。
Batch Norm:
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