【问题标题】:Where to apply batch normalization on standard CNNs在哪里对标准 CNN 应用批量归一化
【发布时间】:2018-04-19 00:06:05
【问题描述】:
我有以下架构:
Conv1
Relu1
Pooling1
Conv2
Relu2
Pooling3
FullyConnect1
FullyConnect2
我的问题是,我在哪里应用批量标准化?在 TensorFlow 中执行此操作的最佳功能是什么?
【问题讨论】:
标签:
python
machine-learning
tensorflow
conv-neural-network
batch-normalization
【解决方案3】:
除了原论文在激活前使用批量归一化外,Bengio 的书Deep Learning, section 8.7.1 给出了为什么在激活之后(或直接在输入到下一层之前)应用批量归一化可能会导致一些问题的原因:
很自然地想知道我们是否应该将批量标准化应用于
输入 X,或转换后的值 XW+b。约夫和塞格迪 (2015)
推荐后者。更具体地说,XW+b 应该被替换为
XW 的标准化版本。应该省略偏置项,因为它
随着批次应用的 β 参数变得多余
归一化重新参数化。层的输入通常是
非线性激活函数的输出,例如修正后的线性
在前一层中起作用。输入的统计数据因此是
更非高斯且更不易通过线性标准化
操作。
换句话说,如果我们使用 relu 激活,所有负值都映射为零。这可能会导致平均值已经非常接近于零,但剩余数据的分布将严重向右倾斜。试图将数据归一化为漂亮的钟形曲线可能不会给出最好的结果。对于 relu 系列之外的激活,这可能不是什么大问题。
有些报告在激活后进行批量归一化时效果更好,而另一些则在激活之前进行批量归一化得到更好的结果。这是一场公开辩论。我建议您使用这两种配置来测试您的模型,如果激活后的批量标准化显着降低了验证损失,请改用该配置。