使用 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),对它们有了更深的理解:
batch normalization 是一个 "isolation" 程序,以确保下一层的输入(在任何小批量中)具有固定分布,因此所谓的 "shifting variance" 问题是固定的。仿射变换 ( γ*x^ + β ) 只是将标准化的 x^ 调整为另一个 固定分布 以获得更好的表现力。为了简单归一化,我们需要在调用tf.layers.batch_normalization
时将center
和scale
参数转为False
。
确保 epsilon
(仍在 tf.layers.batch_normalization
中)设置为至少比所有输入数据的最低幅度小 2 个幅度。 epsilon
的默认值设置为 0.001。就我而言,某些特征的值低至 1e-6。因此,我不得不将 epsilon
更改为 1e-8.
SELU 的输入必须在将它们输入模型之前进行归一化。 tf.layers.batch_normalization
并非为此目的而设计。
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),对它们有了更深的理解:
batch normalization 是一个 "isolation" 程序,以确保下一层的输入(在任何小批量中)具有固定分布,因此所谓的 "shifting variance" 问题是固定的。仿射变换 ( γ*x^ + β ) 只是将标准化的 x^ 调整为另一个 固定分布 以获得更好的表现力。为了简单归一化,我们需要在调用
tf.layers.batch_normalization
时将center
和scale
参数转为False
。确保
epsilon
(仍在tf.layers.batch_normalization
中)设置为至少比所有输入数据的最低幅度小 2 个幅度。epsilon
的默认值设置为 0.001。就我而言,某些特征的值低至 1e-6。因此,我不得不将epsilon
更改为 1e-8.SELU 的输入必须在将它们输入模型之前进行归一化。
tf.layers.batch_normalization
并非为此目的而设计。