1 为什么要batch normalization
(1)如下图值较大的feature,如果feature变化的话,导致结果变化的比较多。也就是该feature方向斜率较大
应该做归一化,尽量使数据正圆
(2)如果不归一化,每个feature方向的learning rate不同
(3) 归一化
train_featues = chinese_data_helpers.load_features(FLAGS.training_featuresname)
test_featues = chinese_data_helpers.load_features(FLAGS.test_featuresname)
all_features = train_featues + test_featues
all_features_numpy = np.array(all_features)
m = np.mean(all_features_numpy, axis=0, keepdims=True)
std = np.std(all_features_numpy, axis=0, keepdims=True)
train_featues_scale = (train_featues-m)/std
(4)对深度学习的每个layer进行scaling(也就是batch normalization)
可以解决internal covariate shift问题(internal covariate shift使得learning rate需要设置比较小,用batch normalization解决这个问题之后learning rate就可以设置大一点)
(5)深度学习 batch normallization internal covariate shift实现
conv = tf.layers.batch_normalization(conv, training=self.is_training)
注意self.is_training参数值在训练的时候需要设置为true,在test的时候设置为false
(6)不想直接是均值是0,方差是1,可以再额外加一个均值和方差
(7)好处
2 Convariate Shift
Batch normalization: Accelerating deep network training by reducing internal covariate shift
统计机器学习中有一个经典的假设:Source Domain 和 Target Domain的数据分布是一致的。也就是说,训练数据和测试数据是满足相同分布的。这是通过训练数据获得的模型能够在测试集上获得好的效果的一个基本保障。
Convariate Shift是指训练集的样本数据和目标样本集分布不一致时,训练得到的模型无法很好的Generalization。它是分布不一致假设之下的一个分支问题,也就是指Sorce Domain和Target Domain的条件概率一致的,但是其边缘概率不同。的确,对于神经网络的各层输出,在经过了层内操作后,各层输出分布就会与对应的输入信号分布不同,而且差异会随着网络深度增大而加大了,但每一层所指向的Label仍然是不变的。
解决办法:一般是根据训练样本和目标样本的比例对训练样本做一个矫正。所以,通过引入Bactch Normalization来标准化某些层或者所有层的输入,从而固定每层输入信息的均值和方差。
https://blog.youkuaiyun.com/liuxiao214/article/details/81037416
layer normalization
https://blog.youkuaiyun.com/lqfarmer/article/details/71439314
https://blog.youkuaiyun.com/zhangjunhit/article/details/53169308