In virtually all state-of-the-art architectures (ResNet, ConvNeXt, EfficientNet), any nn.Conv2d immediately preceding an nn.BatchNorm2d sets bias=False. Here is the complete algebraic cancellation proof demonstrating why a convolutional bias is mathematically redundant.
Let denote the -th spatial activation patch in mini-batch , the convolutional filter weights, and an arbitrary additive bias scalar:
During training, Batch Normalization computes the mini-batch sample mean :
The centering step of Batch Normalization subtracts this mini-batch mean from each activation :
Notice that the constant bias term is subtracted out identically: . Batch Normalization then applies its own learnable affine transformation parameters (scale) and (shift):
Key Takeaway: The learnable parameter in BatchNorm already serves as the channel bias. Including bias=True in the convolution wastes GPU memory, increases parameter count, and calculates gradient updates for a parameter that is cancelled out at every step.