您的位置:

BN的作用及应用

一、什么是BN

Batch Normalization(BN,批量归一化)是一种在深度神经网络中广泛应用的技术,旨在提高训练的速度和稳定性。它最初由Ioffe和Szegedy在论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》中提出。

在深度神经网络中,层与层之间的输入分布变化可能会导致模型收敛速度缓慢,需要更多的迭代次数。BN层通过对训练中的每一批数据进行均值和方差归一化,使得网络在训练的过程中更加稳定,同时缩小了输入的范围,使得网络更容易训练。

二、BN的优点

1、加速训练

BN可以让每层的输入具有零均值和单位方差,这可以将输入数据的分布调整为更加平衡的状态,从而缩短训练时间。

2、减少对超参数的依赖

BN的引入减少了对权重初始化和学习率的依赖,同时使得网络对超参数的选择更加稳健。

3、正则化效果

BN层对每批样本都进行了归一化处理,相当于在每个节点上施加了额外的正则化约束。因此,它可以一定程度上缓解过拟合问题。

三、BN的使用

1、应用到全连接层

BN可以应用到全连接层中,代码示例:

    
    fc = tf.layers.dense(inputs, units=128)
    bn = tf.layers.batch_normalization(fc)
    activation = tf.nn.relu(bn)
    

2、应用到卷积层

BN可以应用到卷积层中,代码示例:

    
    conv1 = tf.layers.conv2d(inputs, filters=64, kernel_size=[3,3])
    bn1 = tf.layers.batch_normalization(conv1, training=is_training)
    activation1 = tf.nn.relu(bn1)
    conv2 = tf.layers.conv2d(activation1, filters=64, kernel_size=[3,3])
    bn2 = tf.layers.batch_normalization(conv2, training=is_training)
    activation2 = tf.nn.relu(bn2)
    

3、应用到循环神经网络中

BN可以应用到循环神经网络中,代码示例:

    
    cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=n_hidden)
    cell_bn = tf.contrib.rnn.LayerNormBasicLSTMCell(num_units=n_hidden)
    output, state = tf.nn.dynamic_rnn(cell_bn, inputs, dtype=tf.float32)
    

4、使用tf.contrib.layers实现BN

可以使用tf.contrib.layers提供的batch_norm函数来实现BN,代码示例:

    
    fc = tf.layers.dense(inputs, units=128)
    bn = tf.contrib.layers.batch_norm(fc, is_training=is_training)
    activation = tf.nn.relu(bn)
    

四、BN的注意事项

1、BN对于batch size的大小比较敏感,batch size过小时,可能会降低BN的效果。

2、在BN层和激活函数之间不应该使用偏置项,因为BN层已经实现了偏置项的效果。

3、使用BN时,需要考虑输入的尺寸,如果输入的尺寸比较小,如32x32的图像,可以在卷积层后加入BN层,否则可以在卷积层前加入BN层。

4、在测试时,需要使用全局数据的均值和方差来更新当前BN层,因此需要将训练时的均值和方差保存下来。

五、总结

BN层是一种用于加速和稳定深层神经网络训练的技术,在深度学习中应用广泛。通过对每批数据进行均值和方差的归一化,可以使得模型的输入更加平衡,从而提高模型的训练速度和稳定性。在深度学习的应用中,BN层是必不可少的一部分。