读 ncnn 源码(XXVIII):`fuse_innerproduct_add`——合并全连接层的偏置链
读 ncnn 源码(XXVIII):fuse_innerproduct_add——合并全连接层的偏置链
在本系列的图优化篇章中,我们已经见证了
ncnnoptimize如何系统性地融合各种卷积变体以及全连接层 (InnerProduct) 后续的BatchNorm和逐通道乘法 (Mul)。为了进一步简化计算图中的线性计算链,ncnn 还提供了针对全连接层后接逐通道加法 (Add) 的融合优化:fuse_innerproduct_add。本篇,我们将剖析该函数的源码,理解其如何将偏置合并的通用逻辑应用于
InnerProduct这一关键层类型。
TL;DR
- 目标: 将
InnerProduct(全连接) 层后接一个执行逐通道/单元加法 (Per-Output Bias Addition,由BinaryOp(Add)+MemoryData实现) 的操作进行融合。 - 模式匹配: 查找
InnerProduct -> BinaryOp结构,附加条件与fuse_convolution_add完全一致:BinaryOp必须是Add(op_type == 0),非标量 (!with_scalar),且第二输入来自形状匹配输出单元数的MemoryData向量(支持[channels]或[1, 1, channels]等广播形式,其中channels等于InnerProduct的num_output)。 - 数学原理: 与
fuse_convolution_add完全一致。融合公式为:- 新权重 (权重不变)。
- 新偏置 (将
MemoryData的偏置向量 加到InnerProduct的原有偏置 上)。
- 代码实现: 几乎与
fuse_convolution_add完全相同。- 从
memorydata->data提取偏置向量B。 - 如果
InnerProduct没有偏置 (bias_term == 0),则将B设为其新偏置。 - 如果已有偏置 ,则将
B逐元素地加到innerproduct->bias_data上。
- 从
- 图结构修改: 将
InnerProduct层的top指向原BinaryOp的top,更新blob的producer,并将BinaryOp标记为"ncnnfused"。 - 效果: 消除了
BinaryOp层引入的冗余加法计算和内存访问,将偏置合并到InnerProduct层中,优化了包含连续偏置添加的网络结构。
1. 融合动机:简化连续偏置操作的普遍性
InnerProduct 层的计算 可能包含一个偏置项 。如果后续 BinaryOp 层仅对每个输出单元加上一个固定的偏置值 (来自 MemoryData),即 ,那么这两个加法可以合并为 。将合并后的偏置存入 InnerProduct 层,即可在推理时跳过 BinaryOp,实现优化。
2. 代码实现:复用偏置合并逻辑
fuse_innerproduct_add 的代码实现与 fuse_convolution_add 高度一致,仅层类型匹配不同,再次体现了该融合逻辑的通用性。
1 | int NetOptimize::fuse_innerproduct_add() |
关键点:
- 模式匹配: 查找
InnerProduct -> BinaryOp(Add)结构,且第二个输入来自符合广播条件的MemoryData。 - 参数更新: 将
MemoryData中的偏置数据bias_data(向量B) 加到innerproduct->bias_data(向量 ) 上。如果 不存在,则直接用B初始化。InnerProduct的权重矩阵不发生改变。 - 图修改: 标准的重定向连接 + 标记融合操作。
3. 意义:优化全连接部分的线性链
InnerProduct -> Add(per-channel) 模式虽然可能不如 InnerProduct -> BN 常见,但在某些模型转换或特定设计中仍可能出现。fuse_innerproduct_add Pass 的存在,确保了 ncnn 对全连接层后接的常见线性操作(BN, Add)都具备融合优化的能力。
4. 结语
fuse_innerproduct_add 是 ncnn 图优化工具箱中,针对全连接层 (InnerProduct) 线性链优化的补充。它复用了与其他层融合加法相同的逻辑,将逐输出单元的偏置添加操作合并到 InnerProduct 层自身。这进一步体现了 ncnn 图优化策略的系统性和一致性——尽可能地识别并消除计算图中可合并的连续线性变换。通过对各种层类型及其后续线性操作进行细致的融合优化,ncnnoptimize 能够有效地简化网络结构,为模型在端侧设备上的高效部署提供坚实保障。
该封面图片由Abed Abedaljalil在Pixabay上发布





