如果要使用Conv2d
,然后是Conv2d
,然后是ReLU
,是否应该在batch norm (bn)
中包含bias参数?
如果我们选择Conv2d
,然后依次选择bn
和ReLU
,则没有必要,因为bn
的shift参数会处理偏差。
答案 0 :(得分:1)
是的,如果顺序为conv2d -> ReLU -> BatchNorm
,则在卷积中使用bias
参数会有所帮助。为了说明这一点,我们假设卷积层中存在偏差,然后比较问题中提到的两个顺序所发生的情况。想法是看偏差是否对每种情况有用。
让我们考虑一个卷积输出层之一的单个像素,并假设x_1, ..., x_k
是该批处理(批处理大小== {k
)的相应输入(矢量化形式)。我们可以将卷积写为
Wx+b #with W the convolution weights, b the bias
正如您在问题中说的那样,当阶数为conv2d-> BN -> ReLu
时,偏差就没有用了,因为它对Wx
的分布所做的所有操作都是将其移动b
,并被直接的BN层抵消:
(Wx_i - mu)/sigma ==> becomes (Wx_i + b - mu - b)/sigma i.e. no changes.
但是,如果您使用其他顺序,则即
BN(ReLU(Wx+b))
然后ReLU
将某些Wx_i+b
映射到0
·。因此,均值将如下所示:
(1/k)(0+...+0+ SUM_s (Wx_s+b))=some_term + b/k
和std
看起来像
const*((0-some_term-b/k)^2 + ... + (Wx_i+b - some_term -b/k)^2 +...))
从扩展那些依赖于非零Wx_i+b
的热量中可以看到:
(Wx_i+b - some_term - b/k)^2 = some_other_term + some_factor * W * b/k * x_i
这意味着结果将以 可乘 的方式依赖于b
。结果,它的缺失不能仅仅通过BN层的偏移分量来补偿(在大多数实现和论文中都标记为beta
)。这就是为什么在使用此顺序时使用偏差项并非没有用。