author:张一极
date:2022年11月27日14:18:07
原理:
将输入batch数据归一化为均值为0,方差为1的数据
然后通过beta和gama数据反归一化(乘上方差,加上均值),再输出。
C++实现:
xxxxxxxxxx
class 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的均值和方差,通过均值和方差进行归一化操作。
xxxxxxxxxx
double 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.减少离散点影响