CondConv
2019-NIPS-CondConv: Conditionally Parameterized Convolutions for Efficient Inference
來源:ChenBong 博客園
- Institute:Google Brain
- Author:Brandon Yang,Quoc V . Le
- GitHub:
- Citation: 30+
Introduction
CondConv卷積層可以對每個樣本進行條件計算,CondConv可以為每個樣本定制單獨的卷積層,從而在不提高計算量的情況下,提高網絡的性能。
CondConv卷積層是一種 plug-in 的 conv layer,可以和現有的 CNN 模型結合,替換 常規conv 即可。
Related Work
conditional computation
條件計算是模型壓縮的一個子方向,主要思想是根據不同的樣本,選擇不同的權重子集。
motivation:不同的 layer 提取的是不同的特征,對於不同的樣本,所需要重視的特征應該也是不同的,能否讓網絡根據輸入樣本的差異(難度/類別/特征,方圓/顏色...),自動選擇不同的 block/branch/layer/filter 進行計算(例如根據樣本難度,自動選擇推理深度,簡單樣本early exit)
BigNAS系列的文章可以看做是對計算資源的自適應;條件計算可以看做是一種對樣本的自適應,條件計算有時也可以對計算資源自適應(資源不足,early exit / fewer branch)
ensemble
- 模型集成:最簡單的模型集成是針對相同的任務、相同的輸入設計幾個不同的網絡(甚至有的時候直接取訓練過程中的若干checkpoint,這種集成方法稱為快照集成。

- 分支集成:模型集成的規模往往有些龐大,退而求其次我們可以共享一部分淺層特征,然后產生若干分支,最后融合各分支提取的特征達到集成的目的

- 帶條件計算的分支集成:有的時候可能有的分支的“小專家”對一些樣本不太擅長,我們可以選擇不聽取他們的意見

從上到下,集成的粒度越來越細:
- 多個model進行集成 √
- head-1個stage-tail,1個stage中的多個branch進行集成 √
- head-1個stage-tail,1個stage中的多個branch進行條件集成 √
- head-N個stage-tail,每個stage中的多個branch都獨立進行條件集成
- 多個layer,每個layer都獨立進行條件集成(本文)
但所有集成方式不可避免的帶來參數量(計算量)的N倍增加,本文的方法一樣會帶來N倍的參數量增加,但計算量和原始模型是相當的(存儲資源比計算資源更容易獲得)。
attention
不同樣本有不同的關注區域,讓網絡對不同樣本關注不同的東西
Motivation
One fundamental assumption is that convolutional kernels should be shared for all examples in a dataset.
current approaches to increasing model capacity are computationally expensive.
Contribution
Method
CondConv
CondConv 可以看成是在layer粒度的條件集成,每個CondConv layer都有n套權重: \(W_1 ... W_n\)
input先和n套權重分別卷積,再combine(類似 googlenet 中的 multi-branch)

由於這n個卷積運算(一種線性運算)的輸入都是相同的,那么如果combine也是線性運算(如加權求和),則這組運算就可以重新表示為先combine再執行一個卷積運算(多個branch卷積整合成一個,如repVGG就是把2個卷積branch合成一個):

這樣就把N倍的卷積計算量減少到1倍的卷積計算量+少量的線性組合計算量,且兩者是完全等價的!
\(\alpha\) 如何得到?
- routing function: \(\alpha\) 是輸入x的函數,其中R是 fc 層的參數),將 pool(x) ==> n dim
- \(α=r(x)=sigmoid(fc(avg pool(x)))\)
如果 α 是定值的話,cond conv就等價於普通的conv
Experiments
expert num & width mult
集成的 expert 越多,性能越好,且在不同規模的網絡上都有效
plug-in
與現有的方法結合,都可以提高性能,即插即用
Ablation Study
plug-in layer

CC-mb1只在第7層開始使用cond conv
fc 層替換為 cond conv 會帶來較多的計算開銷
routing function

- CC-mb1:(第7層開始)每層都有單獨的一組R參數(一個fc) \(α=r(x)=sigmoid(fc(avg pool(x)))\)
- single:(第7層開始)共用一組R
- partially-share:(第7層開始)部分層共享
- hidden:fc層的寬度
- Hierarchical:
- \(α^l=r^l(x)=sigmoid(fc(avg_pool(x)+α^{l-1}))\)
- softmax: \(α=r(x)=softmax(fc(avg pool(x)))\)
mean routing weight
不同層:越深的層,routing weight 對不同的類的差異越大
同一層,不同類:同一層不同類所激活的 branch/expert 是不同的
同一層的4個 branch/expert 激活值最大的10張樣本,不同的expert對不同類型的樣本感興趣
Conclusion
Summary
pros:
- 從注意力機制的角度,不同的卷積核對不同樣本有不同的注意力
- 從條件計算的角度,將條件計算的粒度細化到了layer級別,使得每個樣本實際推理使用的conv都各不相同
- 從集成的角度,cond conv模型集成了多個(32個)expert,通過多卷積branch等價融合的方法,計算量減少到一倍;雖然模型參數量急劇增加,但存儲空間一般比計算內存更容易獲得
- 提升網絡的表達容量,比提升模型計算量(寬度/深度)更重要,once for all 中共享
cons:
- 本文是通過N倍的參數量來提高網絡表達容量,參數量太大(32倍),能否通過1倍的參數量,通過線性/非線性的變換來得到多倍的表達容量(類似once for all 中共享7x7 center的做法其實也是用1倍的參數量+fc,來得到n倍的網絡表達容量)