使用 tf.layers.batch_normalization 预处理 SELU 激活函数的输入?

Use tf.layers.batch_normalization to preprocess inputs for SELU activation function?

SELU 激活函数 (https://github.com/bioinf-jku/SNNs/blob/master/selu.py) 要求将输入归一化为均值为 0.0,方差为 1.0。因此,我尝试在原始数据上应用 tf.layers.batch_normalization (axis=-1) 来满足该要求。每批原始数据的形状为 [batch_size, 15],其中 15 表示特征数。下图显示了从 tf.layers.batch_normalization(~20 个时期)返回的其中 5 个特征的方差。它们并不都像预期的那样接近 1.0。平均值也不都接近 0.0(图表未显示)。

我应该如何让这 15 个特征全部独立归一化(我希望归一化后的每个特征的均值 = 0 和变量 = 1.0)?

看了batch normalization的原论文(https://arxiv.org/abs/1502.03167) and SELU (https://arxiv.org/abs/1706.02515),对它们有了更深的理解:

  1. batch normalization 是一个 "isolation" 程序,以确保下一层的输入(在任何小批量中)具有固定分布,因此所谓的 "shifting variance" 问题是固定的。仿射变换 ( γ*x^ + β ) 只是将标准化的 x^ 调整为另一个 固定分布 以获得更好的表现力。为了简单归一化,我们需要在调用tf.layers.batch_normalization时将centerscale参数转为False

  2. 确保 epsilon(仍在 tf.layers.batch_normalization 中)设置为至少比所有输入数据的最低幅度小 2 个幅度。 epsilon 的默认值设置为 0.001。就我而言,某些特征的值低至 1e-6。因此,我不得不将 epsilon 更改为 1e-8.

  3. SELU 的输入必须在将它们输入模型之前进行归一化。 tf.layers.batch_normalization 并非为此目的而设计。