一、什么是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层是必不可少的一部分。