CNN與Transformer的強強聯合!谷歌最新開源BoTNet,ImageNet達84.7%準確率

2021-02-20 極市平臺

本文是伯克利與谷歌的研究在Convolution+Transformer組合方面一個探索,它採用混合方式同時利用了CNN的特徵提取能力、transformer的內容自注意力與位置自注意力機制,取得了優於純CNN(如ResNet、EfficientNet)或者自注意力(如ViT、DeiT)的性能。所提方案在ImageNet上取得了84.7%的top1精度;在COCO數據集上,基於MaskR-CNN取得了44.4%的MaskAP與49.7%的BoxAP指標。本文值得對Transformer感興趣的同學深入研究一番,文中各種實驗分析相當的詳細。

Abstract

本文提出了一種概念簡單但強有力的骨幹網絡BoTNet,它集成了自注意力機制並用於多個計算機視覺任務(包含圖像分類、目標檢測、實例分割)。通過簡單的採用全局自注意力模塊替換ResNet的最後三個Bottleneck模塊中的卷積,而無需其他改動即可得到BoTNet,相比baseline,所提方法可以在目標檢測與實例分割任務上取得顯著的性能提升,同時還可以降低參數量,代價為少量的推理延遲。

通過BoTNet的設計,本文同時指出:帶自注意力模塊的Bottleneck模塊可以視作Transformer模塊。無需任何技巧,基於Mask R-CNNN框架,BoTNet在COCO實例分割任務上取得了44.4%的Mask AP與49.7%的Box AP指標,超越了之前由ResNeSt的最佳指標。最後,本文還針對圖像分類任務進行了BoTNet的自適應設計,在ImageNet數據集上取得了84.7%的top1精度,同時比EfficientNe快2.33倍(硬體平臺為TPU-v3)。

Method

本文的的思路非常簡單:採用多頭注意力(Multi-Head Self Attention, MHSA)模塊替換Bottleneck中的。而MHSA的結構示意圖見下圖。

一般來說,ResNet包含4個階段,即[c2, c3, c4, c5],它們分別對應stride=[4,8,16,32]尺寸的特徵。[c2,c3,c4,c5]分別由多個Bottleneck模塊構成,比如ResNet50中的數量分別為[3,4,6,3]。ResNet50與BoTNet50的結構信息對比見下表。

本文與現有自注意力機制方法的一個區別在於:以Vit、SAN等為代表的自注意力機制參與到ResNet的各個階段的Bottleneck中取了;而BoTNet則只是參與到c5階段的Bottleneck。為什麼會這種設計呢?原因分析如下:

本文的目的是採用注意力提升實例分割模型的性能,而實例分割模塊的輸入通常比較大(比如考慮到自注意力機制的計算量與內存佔用問題,本文採用了上述最簡單的配置方式:即旨在最小解析度特徵c5階段添加自注意力模塊。而c5部分只包含3個Bottleneck,每個Bottleneck包含一個

為更好的使得注意力機制存在位置相關性,基於Transformer的架構引入了Position Encoding。而之前趙恆爽、賈佳亞等人提出的SAN方案已經證實了位置編碼在視覺任務中的有效性,故而本文所設計的BoT模塊中同樣引入了與位置相關的自注意力機制

最後,我們附上不同配置的網絡架構示意圖,見下圖。

Experiments

為更好的說明所提方案的有效性,我們在實例分割、目標檢測等任務上對其進行了論證。

我們先來看一下COCO實例分割上的效果,結果見上表。從上表可以看到:在12epoch訓練周期下,相比ResNet50,BoTNet50取得了有效的性能提升;而更長周期的訓練可以得到更為顯著的性能改善

與此同時,為說明位置編碼的重要性,本文對其進行了消融實驗分析,結果見上表。可以看到:內容注意力機制可以取得0.6AP性能提升,而位置注意力機制可以取得1.0AP性能提升;而兩者的組合則可以取得1.5AP性能提升。這說明內容與位置注意力具有互補性

此外,本文還針對「為什麼要替換c5中所有Bottleneck的全部替換帶來的性能提升更大,且推理延遲代價很小。通過對比BoT50與BoT101還得出:自注意力機制的替換比堆疊卷積更有效

在上述基礎上,作者還引入了多尺度jitter配置,可以看到BoT50還可以進一步的加劇性能提升。

另外,作者還將所提方法與非局部注意力機制進行了對比,結果見上表。可以看到:BoT模塊帶來的性能提升要比NL模塊的提升更大;此外還可以看到:同時替換c4與c5還可以取得進一步的性能提升

最後,我們再來看一下在圖像分類任務上所提方法與其他方案(包含SENet、EfficientNet、ViT、DeiT)的性能對比,結果見上表與下表。可以看到:BoTNet取得了比DeiT-384更好的結果,這說明:混合模型可以同時利用卷積與自注意力的特性,取得優於純注意力模型的效果

全文到此結束,更多消融實驗分析建議查看原文,強烈建議感興趣的同學去研讀一下原文。

Code

另外吐槽一點:本文尚未提供預訓練模型,不過提供了Tensorflow和Pytorch實現(Pytorch為第三方)。這裡提供一下核心的code,實現如下。

def MHSA(featuremap, pos_enc_type='relative', use_pos=True):    q = group_pointwise(      featuremap, proj_factor=1, name='q_proj', heads=heads,      target_dimension=bottleneck_dimension)  k = group_pointwise(      featuremap, proj_factor=1, name='k_proj', heads=heads,      target_dimension=bottleneck_dimension)  v = group_pointwise(      featuremap, proj_factor=1, name='v_proj', heads=heads,      target_dimension=bottleneck_dimension)  assert pos_enc_type in ['relative', 'absolute']  o = relpos_self_attention(        q=q, k=k, v=v, relative=use_pos, fold_heads=True)  return o
def group_pointwise( featuremap, proj_factor=1, name='grouppoint', heads=4, target_dimension=None): """1x1 conv with heads.""" with tf.variable_scope(name, reuse=tf.AUTO_REUSE): in_channels = featuremap.shape[-1] if target_dimension is not None: proj_channels = target_dimension // proj_factor else: proj_channels = in_channels // proj_factor w = tf.get_variable( 'w', [in_channels, heads, proj_channels // heads], dtype=featuremap.dtype, initializer=tf.random_normal_initializer(stddev=0.01)) out = tf.einsum('bHWD,Dhd->bhHWd', featuremap, w) return out
def relative_logits(q): """Compute relative position enc logits.""" with tf.variable_scope('relative', reuse=tf.AUTO_REUSE): bs, heads, h, w, dim = q.shape int_dim = dim.value
rel_emb_w = tf.get_variable( 'r_width', shape=(2*w - 1, dim), dtype=q.dtype, initializer=tf.random_normal_initializer(int_dim**-0.5)) rel_logits_w = relative_logits_1d( q=q, rel_k=rel_emb_w, transpose_mask=[0, 1, 2, 4, 3, 5])
rel_emb_h = tf.get_variable( 'r_height', shape=(2*h - 1, dim), dtype=q.dtype, initializer=tf.random_normal_initializer(int_dim**-0.5)) rel_logits_h = relative_logits_1d( q=tf.transpose(q, [0, 1, 3, 2, 4]), rel_k=rel_emb_h, transpose_mask=[0, 1, 4, 2, 5, 3]) return rel_logits_h + rel_logits_w

def relpos_self_attention( *, q, k, v, relative=True, fold_heads=False): """2D self-attention with rel-pos. Add option to fold heads.""" bs, heads, h, w, dim = q.shape int_dim = dim.value q = q * (dim ** -0.5) logits = tf.einsum('bhHWd,bhPQd->bhHWPQ', q, k) if relative: logits += relative_logits(q) weights = tf.reshape(logits, [-1, heads, h, w, h * w]) weights = tf.nn.softmax(weights) weights = tf.reshape(weights, [-1, heads, h, w, h, w]) attn_out = tf.einsum('bhHWPQ,bhPQd->bHWhd', weights, v) if fold_heads: attn_out = tf.reshape(attn_out, [-1, h, w, heads * dim]) return attn_out

下載

在極市平臺公眾號後臺回覆:BoTNet,即可獲得論文與code下載連結(註:暫無預訓練模型)。

相關焦點

  • 提供基於transformer的pipeline、準確率達SOTA
    spcCy 3.0 更新文檔地址:https://github.com/explosion/spaCy/releases/tag/v3.0.0具有新的基於 transformer 的 pipeline,這使得 spaCy 的準確率達到了當前的 SOTA 水平;提供了新的 workflow 系統,幫助用戶將原型變為產品;pipeline 配置更加簡單,訓練
  • 谷歌新模型刷新ImageNet紀錄,第一作者是上海交大畢業生謝其哲
    魚羊 發自 凹非寺量子位 報導 | 公眾號 QbitAI谷歌的EfficientNet進化之後,又刷新了ImageNet紀錄。更令人驚嘆的是,在ResNeXt-101 32×48d只達到了16.6%top-1準確率的ImageNet-A測試集上,Noisy Student一舉將準確率提高到了74.2%。新模型來自谷歌大腦首席科學家Quoc V.
  • 視覺Transformer最新綜述
    上圖基本上就是本文的主要內容了,作者首先對 attention,transformer 做一個簡單介紹,然後介紹 transformer 在 NLP 中的應用,最後將其在 CV 中的應用分為四類加以介紹。
  • 如何看待Transformer在CV上的應用前景,未來有可能替代CNN嗎?
    有種開倒車的意思,cnn的提出本質上是為了解決參數量和性能的問題的,通過share weights的方式大大減少了參數量。如果cnn是參數量和性能的折衷,那麼某種意義上,我覺得transformer對於cv領域來說就是cnn和fc的折衷,沒什麼稀奇,只能說有錢了,有設備了,往全局性上去考量很正常。毫無疑問這種探索是有意義的,未來終究會是全連接網絡的時代,網絡也終究會成為一個工具。P.S.老有人覺得transformer概念無敵,那我覺得GCN天下第一。
  • NVIDIA BERT 推理解決方案 Faster Transformer 開源了
    Faster Transformer 目前已經開源,可以訪問https://github.com/NVIDIA/DeepLearningExamples/tree/master/FasterTransformer獲取項目全部原始碼,最新的性能數據以及支持的特性。歡迎大家前往使用,加星和反饋。
  • A Survey on Visual Transformer及引文理解
    比如下面這句,他會在第一個位置加上CLS token,([CLS]谷歌和[MASK][MASK]都是不存在的。[SEP]同時,[MASK]也是不存在的。[SEP])最後使用該CLS token得到的結果進行分類。那麼我們是不是也可以參照這種方式直接進行分類呢?答案是肯定。
  • 【源頭活水】Sparse R-CNN:簡化版fast rcnn
    但是你是否想過去掉RPN,僅僅在fast rcnn算法基礎上額外引入點新技術就可以實現更簡潔、更高精度的替代算法?本文借鑑了最新提出的detr算法核心思想,從而實現了上述想法。Sparse R-CNN極其簡單,不需要設置煩人的密集anchor,不需要RPN、不需要複雜後處理和nms,不需要小心的平衡RPN和fast rcnn訓練過程,也沒有難調的超參,和detr一樣完美。
  • 谷歌將AutoML應用於Transformer架構,翻譯結果飆升,已開源!
    新智元報導 來源:googleblog編輯:張佳【新智元導讀】為了探索AutoML在序列域中的應用是否能夠取得的成功,谷歌的研究團隊在進行基於進化的神經架構搜索Evolved Transformer 作為Tensor2Tensor的一部分已開源,在那裡它可以用於任何序列問題。為了提高可重複性,我們還開源了我們用於搜索的搜索空間,以及實施漸進動態障礙的Colab。我們期待著看到研究團體用新模型做了什麼,並希望其他人能夠利用這些新的搜索技術!
  • 視覺+Transformer最新論文出爐,華為聯合北大、雪梨大學發表
    Transformer 的詳細結構圖基於Transformer的語言模型獲得了成功應用:基於Transformer構建的代表性語言模型列表Vision Transformer(ViT,出自谷歌論文 An image is worth 16x16 words: Transformers for image recognition at scale
  • ...利用基於遷移學習策略的transformer 模型進行Heck反應預測
    作者以經典的小數據-Heck人名反應為代表,證明了遷移學習這一方法在反應預測任務上具有強大性能,同時進一步擴展了transformer這一語言翻譯模型在化學領域的應用,突破性地解決了有限數據預測的難題,為後續的人工智慧輔助化學研發提供了重要的現實依據。1研究背景Transformer模型是谷歌公司於2017年研發的一種語言翻譯模型。
  • |利用基於遷移學習策略的transformer 模型進行Heck...
    learning模型的top-1準確率能達到95.3%,而對於數據量較少且更為複雜的分子內Heck反應預測,transformer-transfer learning模型的top-1準確率仍能達到87.7%。
  • TPU加AutoML:50美元快速訓練高效的ImageNet圖像分類網絡
    谷歌上個月其實已經介紹了這種網絡,詳細內容前查看:進化算法 + AutoML,谷歌提出新型神經網絡架構搜索方法。AmoebaNet在 ICML 2017 大會中展示的論文《Large-Scale Evolution of Image Classifiers》中,谷歌用簡單的構建模塊和常用的初始條件設置了一個進化過程。
  • 哈希革新Transformer:ICLR高分論文讓一塊GPU處理64K長度序列
    在 ICLR 的入選論文中,我們發現了一篇由谷歌和伯克利研究者發表的優質論文。文章介紹了兩種提高 Transformer 效率的技術,最終的 Reformer 模型和 Transformer 模型在性能上表現相似,並且在長序列中擁有更高的存儲效率和更快的速度。論文最終獲得了「8,8,6」的高分。
  • CNN提速23.5倍!Facebook開源DL模塊帶給我們什麼?
    FAIR研究員、軟體工程師Soumith Chintala表示,開源的AI工具能夠幫助研究實驗室和新興創業公司免去了從零開始研究的複雜道路,把更多的精力和時間都投入到改善現有的算法中,同時開源的AI工具也將成為Facebook和創業團隊之間的催化劑。
  • Transformer在CV領域有可能替代CNN嗎?
    目前來看,transformer在處理這些要素之間的關係上更自然也更有效。  從這兩方面的角度來看,將CNN在處理底層視覺上的優勢和transformer在處理視覺要素和物體之間關係上的優勢相結合,應該是一個非常有希望的方向。
  • 華為突破封鎖,對標谷歌Dropout專利,開源自研算法Disout
    乾明 金磊 發自 凹非寺量子位 報導 | 公眾號 QbitAI美國持續封鎖,華為的技術自研,已經深入到了AI底層算法層面上,並開始將研究成果面向業界開源。剛剛,華為諾亞實驗室開源Disout算法(地址在文末),直接對標谷歌申請專利的Dropout算法。而且,在多項任務上,華為的新算法都超過了Dropout。
  • 谷歌開源計算機視覺模型MobileNets:專為不同級別行動裝置優化
    ,谷歌剛剛對外發布了開源計算機視覺模型MobileNets。雷鋒網 AI 科技評論從谷歌開源博客了解到了更多信息,介紹如下。不過,在手持設備和嵌入式應用上做視覺識別目前還有不少困難,在這樣資源及其有限的環境下,視覺識別模型需要高效利用計算能力、能源和空間,高速運行並且保證準確率。為了嘗試解決這些問題,谷歌於美國時間6月14日發布了MobileNets。