深度学习是一门经验主义的科学,也就是说,人们总是实验效果好了之后才尝试去解释。BN和LN进来得到这么广泛的应用,也不是因为其想法多么巧妙,而是因为其效果确实好。
tensorflow1.12版本中这两个函数的实现如下:
tf.contrib.layers.batch_norm(
inputs,
decay=0.999,
center=True,
scale=False,
epsilon=0.001,
activation_fn=None,
param_initializers=None,
param_regularizers=None,
updates_collections=tf.GraphKeys.UPDATE_OPS,
is_training=True,
reuse=None,
variables_collections=None,
outputs_collections=None,
trainable=True,
batch_weights=None,
fused=None,
data_format=DATA_FORMAT_NHWC,
zero_debias_moving_mean=False,
scope=None,
renorm=False,
renorm_clipping=None,
renorm_decay=0.99,
adjustment=None
)
tf.contrib.layers.layer_norm(
inputs,
center=True,
scale=True,
activation_fn=None,
reuse=None,
variables_collections=None,
outputs_collections=None,
trainable=True,
begin_norm_axis=1,
begin_params_axis=-1,
scope=None
)
看起来参数很多,实际上大部分按照默认值来就可以。
对于BN而言,有一个参数需要设置一下,那就是updates_collections应设置为None,否则与BN相关的两个偏置量不会更新;
对于LN而言,我看到别人有将begin_norm_axis设置为-1的,也就是说仅在最后一维上进行Layer Normalization,我不是很理解为什么可以这么做。
另外,两个函数似乎都需要设置scope,否则会发生命名空间冲突的问题。