代碼:https://github.com/z-x-yang/GCT
這是一個百度和悉尼科技大學合作的工作,作者指出,SENet modulate feature maps on the channel-wise level. 但是,SE 模塊使用了個全連接層(FC層)處理 channel-wise embeddings,這樣會產生兩個問題:
- 在CNN中應用SE模塊時,模塊數量有限制。SE主要在模塊上應用(Res-Block或者Inception-Block),FC層無法在網絡的所有層上應用。
- 由於FC層參數復雜,難以分析網絡不同層間通道的關聯性。
為了解決上述兩個問題,作者提出了 Gated Channel Transformation (GCT)模塊,主要有如下設計:
- 使用一個 歸一化模塊 替換FC,對通道間的特征關系建模
- 設計了一系列參數,應用 gating mechanism(門控機制) 對通道間的特征關系建模
通過歸一化模塊和門控機制,GCT模塊可以捕獲通道特征間的 “競爭” 和 “合作”。如下圖所示,GCT模塊可以促進 shallow layer 特征間的合作,同時,促進 deep layer 特征間的競爭。這樣,淺層特征可以更好的獲取通用的屬性,深層特征可以更好的獲取與任務相關的 discriminative 特征。
GCT模塊包括三個部分:global context embedding, channel normalization, gating adaptation,如下圖所示:
第一部分:Global context embedding
與SE模塊不同,GCT模塊沒有采用全局池化 (GAP) 的方式,因為在某些情況下GAP會失效。比如在某些應用中會使用 instance normalization,會固定各個通道的均值,這樣得到的結果向量就會變成常量。因此,作者使用L2 norm 進行global context embeding:
這里引入了\(\alpha\),是一組可訓練的參數。
第二部分:Channel Normalization
在這部分仍然使用L2 norm,如下所示:
\(\sqrt{C}\)用來避免當\(C\)比較大時,\(\hat{s}_c\)的值過小。與 SE 的 FC層相比,該通道歸一化方法計算量更小。
第三部分:Gating adaptation
作者提出了門控機制來 adapte the original feature。使用門控機制,GCT可以在訓練過程中促進特征間的競爭與合作:
作者指出,這里設計了權重\(\gamma\) 和 偏置 \(\beta\) 來控制通道特征是否激活。當一個通道的特征權重 \(\gamma_c\)被正激活,GCT將促進這個通道的特征和其它通道的特征“競爭”。當一個通道的特征 \(\gamma_c\) 被負激活,GCT將促進這個通道的特征和其它通道的特征“合作”。
作者在論文中還提供了GCT模塊的 pytorch 實現代碼:
def forward(self, x, epsilon=1e-5):
# x: input features with shape [N,C,H,W]
# alpha, gamma, beta: embedding weight, gating weight,
# gating bias with shape [1,C,1,1]
embedding = (x.pow(2).sum((2,3), keepdim=True)
+ epsilon).pow(0.5) * self.alpha
norm = self.gamma / (embedding.pow(2).mean(dim=1,
keepdim=True) + epsilon).pow(0.5)
gate = 1. + torch.tanh(embedding * norm + self.beta)
return x * gate
論文有趣的地方是作者做了一個實驗,來分析在RestNet50中,\(\gamma\)的變化。可以看出,作者得出一個結論,在網絡的淺層,\(\gamma\)的值比較小,普遍在0以下,說明特征間中合作關系;在網絡的深層,\(\gamma\)的值就在增大,增長到0以上,說明特征間是競爭關系,有助於分類。
其它部分的內容不過多介紹了,具體可以參考作者論文。