batch norm参数

在阅读源码的过程中,BN代码部分出现了一些之前没见过的参数,在这里总结一下(用小写字母代表,具体出现在各个程序的源码中可能有区别,但是大致应该相同)。

  • epsilon:防止normalization过程中分母出现为0的情况,一般设置为很小的值(例如1e-5),如下是batch norm的算法描述过程,在算法第四步中分母部分出现了epsilon
    batch norm参数_第1张图片

  • momentum:batch norm需要计算加权移动平均数(EMA),momentum就是移动平均值的权重,如下是代码例子,在代码的21行和22行就是momentum(权重)的使用。

def Batchnorm_simple_for_train(x, gamma, beta, bn_param):
"""
param:x    : 输入数据,设shape(B,L)
param:gama : 缩放因子  γ
param:beta : 平移因子  β
param:bn_param   : batchnorm所需要的一些参数
	eps      : 接近0的数,防止分母出现0
	momentum : 动量参数,一般为0.9, 0.99, 0.999
	running_mean :滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
	running_var  : 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
"""
	running_mean = bn_param['running_mean']  #shape = [B]
    running_var = bn_param['running_var']    #shape = [B]
	results = 0. # 建立一个新的变量
    
	x_mean=x.mean(axis=0)  # 计算x的均值
    x_var=x.var(axis=0)    # 计算方差
    x_normalized=(x-x_mean)/np.sqrt(x_var+eps)       # 归一化
    results = gamma * x_normalized + beta            # 缩放平移

    running_mean = momentum * running_mean + (1 - momentum) * x_mean
    running_var = momentum * running_var + (1 - momentum) * x_var
    
    #记录新的值
    bn_param['running_mean'] = running_mean
    bn_param['running_var'] = running_var 
    
	return results , bn_param

  • use_precise_stats:在使用batch norm的时候,训练的时候有batch的概念,但是测试的时候并没有batch,所以在测试的时候需要找到一个适当的值来进行normalization,这个值就是EMA(上述的滑动平均数),但是EMA仅仅是一个估计值,当训练的时候计算的EMA不能很好的估计到测试的时候的均值和方差的时候(EMA的计算方式有问题或者batch和model不稳定),batch norm就会失效。
    EMA计算公式
    在EMA的计算过程中,如果lamda过小,那么最近的均值对EMA贡献过大,就会产生很大的偏差,如果lamda过大,那么需要大量的迭代才能得到结果(通常的lamda取值范围是0.9~0.99)
    batch norm参数_第2张图片
    将模型固定住,取一定数量的batch,计算真正的均值和方差(不是EMA),这就是precise batch norm,batch的数量也是一个超参数。
    batch norm参数_第3张图片
    注意precise batch norm不是一个主流的方法,因为EMA通常是有效的(lamda足够大,模型会迭代训练很多轮,选取的模型在经过一定的迭代后会稳定下来)。

  • num_batches_precise:在precise batchnorm中计算平均数使用的batch数量。

参考:
https://blog.csdn.net/shuzfan/article/details/50723877
https://blog.csdn.net/qq_25737169/article/details/79048516
https://www.bilibili.com/video/av60805995

你可能感兴趣的:(超参数)