Batch Normalization的原理和效果

论文: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 Accelerating Deep Network Training by Reducing Internal Covariate Shift》阅读笔记与实现 - CSDN博客

深度学习中 Batch Normalization为什么效果好? - 知乎

深度学习中 Batch Normalization为什么效果好? - 知乎

详解深度学习中的Normalization,不只是BN

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

```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容