構(gòu)詳解與目標(biāo)檢測(cè)專家設(shè)計(jì)啟發(fā))
一、逐個(gè)專家結(jié)構(gòu)拆解1. SimpleExpert — 基線專家FFN 式[experts.py#L72-L86](file:///mnt/data0/ysn/YOLO-Master-main/ultralytics/nn/modules/moe/experts.py#L72-L86)輸入 x [B, C_in, H, W] │ ├─ Conv 1×1 (C_in → C_in×2) ── 升維增加非線性容量 ├─ BN SiLU ── 歸一化 激活 ├─ Conv 1×1 (C_in×2 → C_out) ── 降維回投影 └─ BN結(jié)構(gòu)本質(zhì)就是 Transformer 里的 FFNFeed-Forward Network的卷積版——先用 1×1 升維擴(kuò)容量再 1×1 降維投影。全程1×1 卷積沒有任何空間感受野純粹在通道維度做變換。設(shè)計(jì)意圖最輕量的專家和路由器配合時(shí)開銷最小便于驗(yàn)證 MoE 框架是否 work。BN 適合大 batch。2. OptimizedSimpleExpert — 小 batch 穩(wěn)定版[experts.py#L12-L34](file:///mnt/data0/ysn/YOLO-Master-main/ultralytics/nn/modules/moe/experts.py#L12-L34)和 SimpleExpert 結(jié)構(gòu)完全一樣唯一區(qū)別BN → GroupNorm。nn.GroupNorm(get_safe_groups(hidden_dim,num_groups),hidden_dim)get_safe_groups會(huì)自動(dòng)找能整除通道數(shù)的最大分組數(shù)最多 8 組。為什么換MoE 稀疏調(diào)度下每個(gè)專家實(shí)際拿到的樣本數(shù)遠(yuǎn)小于 batch_size。比如 batch8、4 專家選 2每個(gè)專家平均只收到 4 個(gè)樣本。BN 在 batch4 時(shí)統(tǒng)計(jì)量極不穩(wěn)定GroupNorm 按通道分組歸一化和 batch 大小無關(guān)。3. SpatialExpert — 多感受野專家核心設(shè)計(jì)[experts.py#L111-L133](file:///mnt/data0/ysn/YOLO-Master-main/ultralytics/nn/modules/moe/experts.py#L111-L133)輸入 x [B, C_in, H, W] │ ├─ Conv 1×1 (C_in → C_in×2) ── 升維 ├─ BN SiLU ├─ DW Conv k×k (groupsC_in×2) ── 深度空間卷積感受野k×k ├─ BN SiLU ├─ Conv 1×1 (C_in×2 → C_out) ── 降維投影 └─ BN注意中間的Depthwise Convgroupshid意味著每個(gè)通道獨(dú)立做空間卷積FLOPs 只有標(biāo)準(zhǔn)卷積的 1/C。kernel_size可配3/5/7不同核大小 → 不同感受野。這就是異構(gòu) MoE 配置的基礎(chǔ)[simple,spatial,spatial5,spatial7]# 無空間 3×3感受野 5×5感受野 7×7感受野路由器根據(jù)圖像內(nèi)容決定小目標(biāo)多的區(qū)域選 3×3 專家大目標(biāo)區(qū)域選 7×7 專家。4. GhostExpert — 參數(shù)減半專家[experts.py#L137-L166](file:///mnt/data0/ysn/YOLO-Master-main/ultralytics/nn/modules/moe/experts.py#L137-L166)輸入 x [B, C_in, H, W] │ ├─ primary_conv: Conv k×k (C_in → C_out/r) ── 只生成一半通道 │ BN SiLU │ │ │ ├── x1 (直接輸出) │ └─ cheap_operation: DW Conv 3×3 (C_out/r → C_out-C_out/r) ── 廉價(jià)線性變換 │ BN SiLU │ └─ x2 │ └─ output cat(x1, x2)[:, :C_out] ── 拼接后截?cái)嗪诵乃枷雭碜?GhostNet卷積輸出的特征圖存在大量冗余通道間高度相似。與其用完整卷積生成全部通道不如只算一半primary另一半用極廉價(jià)的深度卷積變?cè)斐鰜?。參?shù)量和 FLOPs 近似減半但精度損失很小。5. FusedGhostExpert — Ghost 的 GroupNorm 版[experts.py#L37-L69](file:///mnt/data0/ysn/YOLO-Master-main/ultralytics/nn/modules/moe/experts.py#L37-L69)和 GhostExpert 邏輯完全相同區(qū)別BN → GroupNorm同樣為小 batch 穩(wěn)定性kernel_size可配GhostExpert 也可配但 Fused 版默認(rèn) 36. InvertedResidualExpert — MobileNetV2 倒殘差[experts.py#L169-L196](file:///mnt/data0/ysn/YOLO-Master-main/ultralytics/nn/modules/moe/experts.py#L169-L196)輸入 x [B, C_in, H, W] │ ├─ Conv 1×1 (C_in → C_in×2) ── 升維expand ├─ BN SiLU ├─ DW Conv k×k (groupsC_in×2) ── 空間卷積depthwise ├─ BN SiLU ├─ Conv 1×1 (C_in×2 → C_out) ── 降維project └─ BN和 SpatialExpert 幾乎一模一樣區(qū)別僅在注釋風(fēng)格。真正的倒殘差應(yīng)該有殘差連接當(dāng) C_inC_out 時(shí)x conv(x)但這里的實(shí)現(xiàn)沒加殘差。所以實(shí)際效果等同于 SpatialExpert。真正的倒殘差精髓中間寬升維、兩頭窄降維中間用 DW 做空間配合殘差連接在低維空間做線性變換最后一層不帶激活。這是移動(dòng)端最高效的結(jié)構(gòu)之一。7. DepthwiseSeparableConv EfficientExpertGroup — ES_MOE 的異構(gòu)核[experts.py#L199-L226](file:///mnt/data0/ysn/YOLO-Master-main/ultralytics/nn/modules/moe/experts.py#L199-L226)# DepthwiseSeparableConvDW Conv k×k(C_in → C_in,groupsC_in)── 空間 PW Conv1×1(C_in → C_out)── 通道 BNSiLUEfficientExpertGroup就是包了一層在 ES_MOE 里用不同kernel_size3/5/7實(shí)例化多個(gè)形成異構(gòu)專家組。二、六大設(shè)計(jì)維度總結(jié)維度SimpleExpertOptimizedSimpleExpertSpatialExpertGhostExpertInvertedResidualExpert空間感受野無1×1無1×1有k×k DW有k×k有k×k DW歸一化BNGroupNormBNBNBN參數(shù)量基準(zhǔn)基準(zhǔn)基準(zhǔn)~50%基準(zhǔn)FLOPs最低最低中等~50%中等設(shè)計(jì)理念純通道變換小batch穩(wěn)定多尺度感受野特征冗余利用移動(dòng)端高效適用場(chǎng)景深層特征圖超小batch淺/中層多尺度移動(dòng)端部署移動(dòng)端部署三、對(duì)目標(biāo)檢測(cè)任務(wù)創(chuàng)建自定義專家的啟發(fā)啟發(fā) 1專家的本質(zhì)是可插拔的特征變換器看所有專家的接口統(tǒng)一簽名def__init__(self,in_channels,out_channels,...):defforward(self,x)-torch.Tensor:defcompute_flops(self,input_shape)-float:檢測(cè)任務(wù)啟發(fā)你可以把任何現(xiàn)有的檢測(cè)模塊改造成專家。比如把ASPP空洞空間金字塔池化做成專家專門處理多尺度上下文把DCN可變形卷積做成專家專門處理幾何形變目標(biāo)把CBAM/CAN通道空間注意力做成專家做自適應(yīng)特征選擇啟發(fā) 2異構(gòu)專家組合比同構(gòu)更有效看 yaml 配置的思路[simple,spatial,spatial5,spatial7]不是 4 個(gè)一樣的專家而是功能互補(bǔ)的專家組合。路由器學(xué)會(huì)按內(nèi)容分發(fā)。檢測(cè)任務(wù)啟發(fā)——設(shè)計(jì)面向檢測(cè)痛點(diǎn) 的異構(gòu)專家組# 專家 0: 小目標(biāo)專家 — 用膨脹卷積擴(kuò)大感受野不增加下采樣expert_0DilatedExpert(in_ch,out_ch,dilation2)# 看更遠(yuǎn)但不丟分辨率# 專家 1: 大目標(biāo)專家 — 大核 池化獲取全局上下文expert_1LargeKernelExpert(in_ch,out_ch,kernel7)# 類似 RepLKNet# 專家 2: 邊界專家 — 用 Sobel/Laplacian 梯度算子初始化強(qiáng)化邊緣expert_2EdgeAwareExpert(in_ch,out_ch)# 檢測(cè)框邊界回歸# 專家 3: 上下文專家 — 全局池化 1×1類似 SE 模塊expert_3ContextExpert(in_ch,out_ch)# 全局語義輔助分類啟發(fā) 3歸一化選擇影響 MoE 訓(xùn)練成敗SimpleExpert 用 BN → OptimizedSimpleExpert 換 GroupNorm是因?yàn)?MoE 稀疏調(diào)度下每個(gè)專家的實(shí)際 batch 很小。檢測(cè)任務(wù)啟發(fā)目標(biāo)檢測(cè)經(jīng)常用 batch2~8大分辨率、大模型MoE 下每個(gè)專家實(shí)際 batch 可能只有 1~2。專家內(nèi)部統(tǒng)一用 GroupNorm 或 LN不要用 BN。除非你確認(rèn) batch 足夠大。啟發(fā) 4專家要輕因?yàn)?N 個(gè)專家的參數(shù)是疊加的GhostExpert 把參數(shù)砍半InvertedResidual 用 DWPW 降低 FLOPs。因?yàn)?MoE 的參數(shù)量 N × 單專家參數(shù)4 個(gè)專家就是 4 倍。檢測(cè)任務(wù)啟發(fā)檢測(cè)模型本身就很大YOLOv8-L 有 ~50M 參數(shù)如果每個(gè)專家再堆重卷積參數(shù)量和顯存爆炸。專家設(shè)計(jì)原則升維比控制在 2×不要 4×Transformer FFN 常 4×但檢測(cè)不需要這么大容量空間卷積用 Depthwise不用標(biāo)準(zhǔn)卷積考慮 Ghost 思路專家不一定要全新的卷積可以在共享專家基礎(chǔ)上做輕量變換啟發(fā) 5專家的可組合性是工程關(guān)鍵看_build_heterogeneous_experts的實(shí)現(xiàn)[modules.py#L726-L757](file:///mnt/data0/ysn/YOLO-Master-main/ultralytics/nn/modules/moe/modules.py#L726-L757)ifetypeghost:experts.append(GhostExpert(...))elifetypespatial:experts.append(SpatialExpert(...))elifetypespatial5:experts.append(SpatialExpert(...,kernel_size5))檢測(cè)任務(wù)啟發(fā)設(shè)計(jì)專家時(shí)統(tǒng)一接口方便配置文件里組合classDetectionExpert(nn.Module):統(tǒng)一接口in_channels, out_channels, 然后是專家特有參數(shù)def__init__(self,in_channels,out_channels,**kwargs):...defforward(self,x):...defcompute_flops(self,input_shape):...啟發(fā) 6從卷積專家到檢測(cè)專家的思路延伸這個(gè)工程的專家都是純卷積塊處理的是 backbone 里的通用特征。但檢測(cè)任務(wù)的 head 有檢測(cè)框回歸、類別分類等子任務(wù)可以設(shè)計(jì)任務(wù)級(jí)專家classBoxRegExpert(nn.Module):專門處理邊界框回歸的專家 — 關(guān)注梯度/邊緣特征def__init__(self,in_ch,out_ch):super().__init__()# 用 Sobel 初始化天生對(duì)邊緣敏感self.edge_convnn.Conv2d(in_ch,in_ch,3,padding1,groupsin_ch)self.init_sobel_weights()self.projnn.Conv2d(in_ch,out_ch,1)...classClsExpert(nn.Module):專門處理分類的專家 — 關(guān)注全局語義def__init__(self,in_ch,out_ch):super().__init__()self.global_poolnn.AdaptiveAvgPool2d(1)self.fcnn.Linear(in_ch,in_ch//4)self.projnn.Conv2d(in_ch,out_ch,1)...這樣路由器會(huì)學(xué)會(huì)前景區(qū)域選 BoxRegExpert背景區(qū)域選 ClsExpert實(shí)現(xiàn)任務(wù)級(jí)條件計(jì)算。四、自定義專家的實(shí)操建議如果要在你的檢測(cè)項(xiàng)目里創(chuàng)建自己的專家從這幾個(gè)方向入手從現(xiàn)有檢測(cè)模塊改造把 DCN、ASPP、RFB、PConvPartial Conv等已有的高效模塊封裝成統(tǒng)一接口的專家按檢測(cè)層級(jí)設(shè)計(jì)異構(gòu)組淺層大特征圖用輕量空間專家深層小特征圖用通道專家或注意力專家先跑通再優(yōu)化先用SimpleExpert最簡(jiǎn)單驗(yàn)證 MoE 框架 work再逐步替換為復(fù)雜專家統(tǒng)一用 GroupNorm檢測(cè) batch 小 MoE 稀疏 BN 的噩夢(mèng)實(shí)現(xiàn)compute_flopsMoE 的優(yōu)勢(shì)是 FLOPs 可分析沒有這個(gè)方法就無法量化收益