真实面经题目 · 原创解析
推理优化中为什么可以做 Conv+BN 融合,融合后的权重和偏置公式如何推导?
这题考推理态算子融合的数学等价性和工程收益。BN 在 inference 时使用固定 running mean/variance,是逐输出通道仿射变换,所以可以吸收到前一层卷积的权重和偏置里,减少算子调度和中间 tensor 读写。
真实面经题目 · 原创解析
这题考推理态算子融合的数学等价性和工程收益。BN 在 inference 时使用固定 running mean/variance,是逐输出通道仿射变换,所以可以吸收到前一层卷积的权重和偏置里,减少算子调度和中间 tensor 读写。
Conv+BN 能融合的前提是处在推理阶段,BN 的均值和方差已经固定为训练时累计的 running mean 和 running variance。假设卷积对第 c 个输出通道的结果是 y_c = W_c * x + b_c,BN 推理态输出是 z_c = gamma_c * (y_c - mu_c) / sqrt(var_c + epsilon) + beta_c。把 y_c 代进去,可以得到融合后权重 W'_c = W_c * gamma_c / sqrt(var_c + epsilon),融合后偏置 b'_c = beta_c + gamma_c * (b_c - mu_c) / sqrt(var_c + epsilon);如果原卷积没有 bias,就把 b_c 当作 0。这里的缩放按输出通道 broadcast 到 W 的 [Cout, Cin, Kh, Kw] 上。工程收益是少一次 BN kernel、少一次中间结果写回和读出,提升推理延迟并降低访存。
Conv+BN 融合不是 BN 层消失,而是它在推理态可以被等价改写进前一层卷积参数里。训练时 BN 使用当前 mini-batch 统计并参与反向传播,不能静态固定;推理时 running mean/variance 冻结,才是固定仿射变换。
卷积输出通道 c 写成 y_c = W_c * x + b_c。BN 推理态是 z_c = gamma_c * (y_c - mu_c) / sqrt(var_c + epsilon) + beta_c。令 alpha_c = gamma_c / sqrt(var_c + epsilon),即可得到 W'_c = alpha_c W_c,b'_c = beta_c + alpha_c (b_c - mu_c)。
很多卷积层没有 bias,因为后面接 BN;融合时把 b_c 视为 0。权重常见形状为 [Cout, Cin, Kh, Kw],BN 参数是 [Cout],所以 alpha 要 reshape 成 [Cout, 1, 1, 1] 再广播到每个卷积核元素。
未融合时卷积输出中间 tensor,BN 再读入做归一化和仿射变换。融合后只执行一次卷积,直接输出结果,减少 kernel launch、内存读写、cache 压力和算子图调度开销,对小 batch、边缘设备和高 QPS 推理尤其有价值。
理论等价仍会受浮点精度、epsilon、框架 BN 定义、dtype 和舍入误差影响。若后续做 INT8 量化,还要明确融合和校准顺序。部署前应比较融合前后 max abs diff、relative diff、任务指标和延迟。
训练阶段 BN 使用当前 batch 统计并影响梯度路径,gamma、beta 也在更新。静态融合会把统计量固定,改变训练行为,因此通常只在 eval/inference 图优化里做。
把 b_c 当作 0。此时 b'_c = beta_c - gamma_c * mu_c / sqrt(var_c + epsilon),权重缩放公式不变。
不是。结构上少了 BN 节点,但卷积会获得新 bias,参数量变化不大。核心价值是减少算子、中间内存读写和调度开销。
在同一输入、同一 dtype、同一 eval 模式下比较输出误差和最终任务指标;如果接量化,还要在校准集和评测集上验证精度与延迟。