author:张一极
date:2022年11月27日14:18:07
原理:
将输入batch数据归一化为均值为0,方差为1的数据
然后通过beta和gama数据反归一化(乘上方差,加上均值),再输出。
C++实现:

xxxxxxxxxxclass bn : public edge_layer{public: double beta = 0.1; double gamma = 0.1; bn(double bn_input_dime, double bn_output_dim); Matrix3d forward(Matrix3d mid1) { Matrix3d output_bn = CreateMatrix3d(1, 1, 3); double mean_bn = matrix_mean(mid1.matrix3d[0]); double var_bn = matrix_var(mid1.matrix3d[0]); cout<<"sqrt var:"<<sqrt(var_bn)<<endl; output_bn.matrix3d[0] = subtract_ele(mid1.matrix3d[0],mean_bn); cout<<"beta:"<<beta<<endl; output_bn.matrix3d[0] = matrix_division(output_bn.matrix3d[0],sqrt(var_bn)); cout_mat(output_bn.matrix3d[0]); output_bn.matrix3d[0] = times_mat(beta,output_bn.matrix3d[0]); output_bn.matrix3d[0] = add_ele(output_bn.matrix3d[0],gamma); cout_mat(output_bn.matrix3d[0]); return output_bn; }};bn::bn(double beta_bn, double gamma_bn){ beta = beta_bn; gamma = gamma_bn;}1.输入beta以及gamma,计算batch data的均值和方差,通过均值和方差进行归一化操作。
xxxxxxxxxxdouble mean_bn = matrix_mean(mid1.matrix3d[0]);double var_bn = matrix_var(mid1.matrix3d[0]);2.使用beta以及gamma进行反归一化操作
output_bn.matrix3d[0] = times_mat(beta,output_bn.matrix3d[0]); output_bn.matrix3d[0] = add_ele(output_bn.matrix3d[0],gamma); cout_mat(output_bn.matrix3d[0]);倍乘beta,加上gamma,得到最后输出结果:

1.减少梯度消失和加大学习率,提高训练速度
2.减少离散点影响