论文:Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift
摘要
深度网络由于前面的网络层参数变化,导致下一层的输入分布发生变化,从而导致网络难以训练。这降低了训练速度(因为需要使用晓得学习率和精细的初始化),并且使饱和非线性网络的训练变得困难。我们把这个现象叫做internal covariate shift,并通过归一化输入来解决问题。我们的方法的优势在于使标准化成为模型体系结构的一部分,并为每个小训练 batch 执行标准化。Batch Normalization使我们能够使用更大的学习率,并且不需要太关心初始化。它的行为就像正则化,在一些情况下可以不必使用Dropout。在 state-of-the-art的分类模型上使用Batch Normalization,可以少用14倍的training steps就可以达到同样的准确率,并且和原始模型拉开了个显著差距。使用集成了batch normalization的网路,我们达到了Imagenet分类的最好的公开结果:达到了 4.9% top-5 validation error (and 4.8% test error),超过了人类识别率。
深度学习中 Batch Normalization为什么效果好? - 知乎
深度学习中 Batch Normalization为什么效果好? - 知乎
Batch Normalization的作用:
1、加速收敛,并且有更好的收敛结果
2、可以使用更大的学习率,并且不必做精细的参数初始化
3、有正则化的效果
使用:
在Tensorflow中使用batch norm需要在更新op的使用加上
示例代码:
```
def train_model(base_lr, loss, data_num):
"""
train model
:param base_lr: base learning rate
:param loss: loss
:param data_num:
:return:
train_op, lr_op
"""
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
lr_factor = 0.1
global_step = tf.Variable(0, trainable=False)
#LR_EPOCH [8,14]
#boundaried [num_batch,num_batch]
boundaries = [int(epoch * data_num / config.BATCH_SIZE) for epoch in config.LR_EPOCH]
#lr_values[0.01,0.001,0.0001,0.00001]
lr_values = [base_lr * (lr_factor ** x) for x in range(0, len(config.LR_EPOCH) + 1)]
#control learning rate
lr_op = tf.train.piecewise_constant(global_step, boundaries, lr_values)
optimizer = tf.train.MomentumOptimizer(lr_op, 0.9)
train_op = optimizer.minimize(loss, global_step)
return train_op, lr_op
```