Non-local Neural Networks:非局部神经网络
論文地址:https://openaccess.thecvf.com/content_cvpr_2018/papers/Wang_Non-Local_Neural_Networks_CVPR_2018_paper.pdf
代碼地址:
Non-local Neural Networks:非局部神經網絡
- Abstract
- 1. Introduction
- 2. Related Work
- Non-local image processing.
- Graphical models.
- Feedforward modeling for sequences.
- Self-attention.
- Interaction networks.
- Video classification architectures.
- 3. Non-local Neural Networks
- 3.1 定義
- 3.2 表示形式
- 3.3 Non-local Block
- 4. 視頻分類模型
- 5. 實驗
- 5.1 Instantiations(實例化)
- 5.2 Which stage to add non-local blocks?
- 5.3 Going deeper with non-local blocks.
- 5.4 Non-local in spacetime.
- 5.5 Non-local net vs. 3D ConvNet.
- 5.6 Non-local 3D ConvNet.
- 5.7 Longer sequences.
- 5.8 Comparisons with state-of-the-art results.
- 6 總結
- 6.1 Local & Non-local
- 5.2 Non-local block
- 5.3 具體實現
- 5.4 跟全連接層的聯系
- 參考文獻
Abstract
卷積運算和遞歸運算都是一次處理一個局部鄰域的構造塊。在本文中,我們將非本地操作作為一個通用的構建模塊家族來描述,用于捕獲長期依賴關系。受計算機視覺中經典非局部均值方法的啟發,我們的非局部運算將一個位置的響應計算為所有位置特征的加權和。這個構建模塊可以插入到許多計算機視覺架構中。在視頻分類的任務上,即使沒有任何花哨的東西,我們的非本地模型也可以在 Kinetics 和 Charades 數據集上競爭或超過當前的競爭獲勝者。在靜態圖像識別中,我們的非局部模型改進了COCO任務集上的對象檢測/分割和姿態估計。
1. Introduction
在深度神經網絡中,捕捉長期相關性至關重要。對于順序數據(例如,在語音、語言中),遞歸操作[38,23]是長期依賴性建模的主要解決方案。對于圖像數據,長距離相關性是由卷積運算的深層堆棧形成的大感受野模擬的[14,30]。
卷積運算和遞歸運算都在空間或時間上處理局部鄰域;因此,只有重復應用這些操作,通過數據逐步傳播信號,才能捕捉到長程相關性。重復本地操作有幾個限制。第一,計算效率低。其次,它會導致需要仔細解決的優化困難[23,21]。最后,這些挑戰使得多跳依賴性建模變得困難,例如,當消息需要在遙遠的位置之間來回傳遞時。
在本文中,我們將非局部操作作為一種高效、簡單和通用的組件,用于捕獲深度神經網絡的長程相關性。我們提出的非局部運算是計算機視覺中經典非局部均值運算[4]的推廣。直觀地,非本地操作將某個位置的響應計算為輸入要素圖中所有位置要素的加權和(圖1)。這組位置可以在空間、時間或時空中,這意味著我們的操作適用于圖像、序列和視頻問題。
使用非本地操作有幾個優點:(A)與遞歸和卷積操作的漸進行為相比,非本地操作通過計算任意兩個位置之間的交互來直接捕獲長期依賴關系,而不管它們的位置距離;(B)正如我們在實驗中所表明的那樣,非本地操作是有效的,即使只有幾層(例如,5層)也能達到最佳結果;(C)最后,我們的非本地操作保持了可變的輸入大小,并且可以很容易地與其他操作(例如,我們將使用的卷積操作)結合在一起。
我們展示了非局部操作在視頻分類應用中的有效性。在視頻中,空間和時間中的遠距離像素之間會發生遠程交互。單個非本地塊是我們的基本單位,它可以以前饋方式直接捕獲這些時空依賴關系。與2D和3D卷積網絡相比,我們稱為非局部神經網絡的體系結構在視頻分類方面比2D和3D卷積網絡[48]更準確。此外,非局部神經網絡在計算上比3D卷積神經網絡更經濟。對Kinetics[27]和Charades[44]數據集進行了全面的燒蝕研究。只使用RGB,沒有任何華而不實的東西(例如,光流、多尺度測試),我們的方法在這兩個數據集上獲得的結果與最新的競賽獲勝者不相上下,甚至更好。
為了展示非局部操作的通用性,我們進一步在COCO數據集上進行了目標檢測/分割和姿態估計實驗[33]。在強大的Mask R-CNN基線[19]之上,我們的非本地塊可以以較小的額外計算成本提高所有三個任務的準確性。再加上視頻上的證據,這些圖像實驗表明,非局部操作通常是有用的,可以成為設計深度神經網絡的基本構件。
2. Related Work
Non-local image processing.
非局部均值[4]是一種經典的過濾算法,它計算圖像中所有像素的加權均值。它允許遠距離像素在基于補丁外觀相似性的位置處對過濾的響應做出貢獻。這種非局部過濾思想后來發展成BM3D(塊匹配3D)[10],它對一組相似但非局部的補丁執行過濾。即使與深度神經網絡相比,BM3D也是一個可靠的圖像去噪基線[5]。塊匹配和神經網絡用于圖像去噪[6,31]。非局部匹配也是成功的紋理合成[12]、超分辨率[16]和修復[1]算法的本質。
Graphical models.
可以通過諸如條件隨機場(CRF)[29,28]之類的圖形模型來對遠程依賴關系進行建模。在深度神經網絡的背景下,可以利用CRF對網絡的語義分割預測進行后處理[9]。CRF的迭代平均場推理可以轉化為遞歸網絡并進行訓練[56,42,8,18,34]。相反,我們的方法是計算非局部濾波的更簡單的前饋模塊。與這些為分割而開發的方法不同,我們的通用組件用于分類和檢測。這些方法和我們的方法還涉及一種更抽象的模型,稱為圖神經網絡[41]。
Feedforward modeling for sequences.
最近出現了一種使用前饋(即非遞歸)網絡對語音和語言中的序列進行建模的趨勢[36,54,15]。在這些方法中,長期依賴關系被非常深的一維卷積貢獻的大的接受場捕獲。這些前饋模型易于并行實現,并且比廣泛使用的遞歸模型更有效。
Self-attention.
我們的工作與最近的機器翻譯自我注意[49]方法有關。自我注意模塊通過關注所有位置并取其在嵌入空間中的加權平均值來計算序列(例如,句子)中的位置處的響應。正如我們將在下一篇文章中討論的那樣,自我注意可以被視為非局部均值的一種形式[4],從這個意義上說,我們的工作將機器翻譯的自我注意與更一般的非局部過濾操作聯系起來,這些操作適用于計算機視覺中的圖像和視頻問題。
Interaction networks.
交互網絡(IN)[2,52]是最近提出的用于對物理系統建模的方法。它們對兩兩交互中涉及的對象的圖形進行操作。Hoshen [24]在多智能體預測建模的背景下提出了更有效的頂點注意力。另一個變體,稱為關系網絡[40],計算輸入中所有位置對的特征嵌入函數。我們的方法也處理所有對,正如我們將解釋的(f(xi,xj)在等式(1)中)。雖然我們的非局部網絡與這些方法相關聯,但我們的實驗表明,模型的非局部性是它們經驗成功的關鍵,該模型與注意/交互/關系(例如,網絡可以關注局部區域)的思想是正交的。非局部建模是圖像處理的一個長期的關鍵元素(例如,[12,4]),但在最近的計算機視覺神經網絡中,它在很大程度上被忽視了。
Video classification architectures.
視頻分類的一個自然解決方案是結合圖像的CNN和序列的RNN的成功[55,11]。相反,前饋模型是通過時空中的3D卷積(C3D)[26,48]來實現的,并且3D濾波器可以通過對預先訓練的2D濾波器進行“膨脹”[13,7]來形成。除了對原始視頻輸入進行端到端建模之外,已經發現光流[45]和軌跡[50,51]可能是有幫助的。流和軌跡都是現成的模塊,可能會發現遠程的、非局部的依賴關系。視頻架構的系統比較可以在[7]中找到。
3. Non-local Neural Networks
我們首先給出非本地操作的一般定義,然后提供它的幾個具體實例。
3.1 定義
在非局部平均運算[4]的基礎上,我們將深度神經網絡中的一般非局部運算定義為:
yi=1C(x)∑?jf(xi,xj)g(xj)y_i={1\over{C(x)}}\sum_{\forall j}f(x_i,x_j)g(x_j)yi?=C(x)1??j∑?f(xi?,xj?)g(xj?)
其中xxx表示輸入信號(圖片,序列,視頻等,也可能是它們的featuresfeaturesfeatures),y表示輸出信號,其size和x相同。f(xi,xj)f(x_i,x_j)f(xi?,xj?)用來計算i和所有可能關聯的位置j之間pairwise的關系,這個關系可以是比如i和j的位置距離越遠,f值越小,表示j位置對i影響越小。g(xj)g(x_j)g(xj?)用于計算輸入信號在j位置的特征值。C(x)C(x)C(x)是歸一化參數。
從上式中可以看出任意位置上的jjj,可以是時間的、空間的、時空的任意位置,都可以影響到i的輸出值。作為對比,convconvconv的操作是對一個局部鄰域內的特征值進行加權求和,比如kernelsize=3kernel size = 3kernelsize=3時,i?1≤j≤i+1i?1≤ j ≤ i+1i?1≤j≤i+1。 recurrent的操作則是i時刻的值僅基于當前時刻或前一時刻(j=iori?1)(j=i or i-1)(j=iori?1)。
另外作為對比,non-local的操作也和fc層不同。公式(1)計算的輸出值受到輸入值之間的關系的影響(因為要計算pairwise function),而fc則使用學習到的權重計算輸入到輸出的映射,在fc中xjx_jxj?和xix_ixi?的關系是不會影響到輸出的,這一定程度上損失了位置的相關性。另外,non-local能夠接受任意size的輸入,并且得到的輸出保持和輸入size一致。而fc層則只能有固定大小的輸入輸出。
non-local是一個很靈活的building block,它可以很容易地和conv、recurrent層一起使用,它可以被插入到dnn的淺層位置,不像fc通常要在網絡的最后使用。這使得我們可以通過結合non-local以及local的信息構造出更豐富的結構。
3.2 表示形式
接下來我們會討論fff和ggg的幾種形式。有意思的是我們的實驗顯示不同的表現形式其實對non-local的結果并沒有太大影響,表明non-local這個行為才是主要的提升因素。
為了簡化,我們只考慮ggg是線性的情況,即g(xj)=Wgxjg(xj)=W_g x_jg(xj)=Wg?xj?,其中WgW_gWg?是一個可學的權重矩陣,實際中是通過空間域的 1?1conv1*1 conv1?1conv 或時空域的 1?1?1conv1*1*1 conv1?1?1conv 實現的。
3.3 Non-local Block
我們將
yi=1C(x)∑?jf(xi,xj)g(xj)y_i={1\over{C(x)}}\sum_{\forall j}f(x_i,x_j)g(x_j)yi?=C(x)1??j∑?f(xi?,xj?)g(xj?)
式中的non-local操作變形成一個non-local block,以便其可以被插入到已有的結構中。
我們定義一個non-local block為:
Zi=Wzyi+XiZ_i=W_zy_i+X_i Zi?=Wz?yi?+Xi?
其中yiy_iyi?已經在(1)式中給出了,+xi+x_i+xi?則表示的是一個residualconnectionresidual connectionresidualconnection。residualconnectionresidual connectionresidualconnection的結構使得我們可以在任意的pretrain模型中插入一個新的non?localblocknon-local blocknon?localblock而不需要改變其原有的結構(如Wz=0W_z=0Wz?=0作為初始化則完全和原始結構一致)。
一個示例的non-local block如圖所示,我們看到式(2),(3),(4)中的這些pairwise function可以通過矩陣乘法來進行,(5)則可以直接concat得到。
non?localblocknon-local blocknon?localblock的pairwise的計算可以是非常lightweight的,如果它用在高層級,較小的feature map上的話。比如,圖2上的典型值是T=4,H=W=14or7T=4,H=W=14 or 7T=4,H=W=14or7。通過矩陣運算來計算parwise function的值就和計算一個conv layer的計算量類似。另外我們還通過以下方式使其更高效。
Non-local Blocks的高效策略。我們設置Wg,Wθ,W?W_g,W_θ,W_?Wg?,Wθ?,W??的channelchannelchannel的數目為x的channel數目的一半,這樣就形成了一個bottleneckbottleneckbottleneck,能夠減少一半的計算量。WzW_zWz?再重新放大到x的channel數目,保證輸入輸出維度一致。
4. 視頻分類模型
為了理解non-local networks的操作,我們在視頻分類任務上進行了一系列的ablation experiments。
2D ConvNet baseline (C2D)。為了獨立開non-local nets中時間維度的影響vs 3D ConvNets,我們構造了一個簡單的2D baseline結構。
Table 1給出了ResNet-50 C2D backbone。輸入的video clip是32幀,大小為224*224。Table 1中的所有卷積都是用的2D的kernel,即逐幀對輸入視頻進行計算。唯一和temporal有關的計算就是pooling,也就是說這個baseline模型簡單地在時間維度上做了一個聚合的操作。
Inflated 3D ConvNet (I3D)。 Table 1中的C2D模型可以通過inflate的操作轉換成一個3D卷積的結構。具體地,一個2D k*k大小的kernel可以inflate成3D t*k*k大小的kernel,只要將其權重重復t次,再縮小t倍即可。
我們討論2種inflate的方式。一種是將residual block中的3*3的kernel inflate成3*3*3的,另一種是將residual block中的1*1的kernel inflate成3*1*1的。這兩種形式我們分別用I3D3?3?3I3D_{3?3?3}I3D3?3?3?和I3D3?1?1I3D_{3?1?1}I3D3?1?1?表示。因為3D conv的計算量很大,我們只對每2個residual blocks中的1個kernel做inflate。對更多的kernel做inflate發現效果反而變差了。另外conv1層我們inflate成5*7*7。
Non-local network。 我們將non-local block插入到C2D或I3D中,就得到了non-local nets。我們研究了插入1,5,10個non-local blocks的情況,實現細節將在后面給出。
Non-local Network實現細節
Training。 我們的模型是在ImageNet上pretrain的,沒有特殊說明的話我們使用32幀的輸入。32幀是通過從原始長度的視頻中隨機選擇1個位置取出64個連續幀,然后每隔1幀取1幀得到的最終的32幀。spatial size是224*224大小,是將原始視頻rescale到短邊為[256,320]區間的隨機值,然后再random crop 224*224大小。我們在8卡GPU上進行訓練,每卡上有8 clips(也就是說總的batchsize是64 clips)。我們一共迭代了400k iterations,初始lr為0.01,然后每150k iterations lr下降1/10。momentum設為0.9,weight decay設為0.0001。dropout在global pooling層后面使用,dropout ratio設為0.5。
我們finetune模型的時候 BN是打開的,這和常見的finetune ResNet的操作不同,它們通常是frozen BN。我們發現在我們的實驗中enable BN有利于減少過擬合。
在最后一個1*1*1 conv層(表示WzW_zWz?)的后面我們加了一個BN層,其他位置我們沒有增加BN。這個BN層的scale參數初始化為0,這是為了保證整個non-local block的初始狀態相當于一個identity mapping,這樣插入到任何預訓練網絡中在一開始都能保持其原來的表現。
Inference。 推理時,在我們將視頻rescale到短邊256進行推理。時域上我們從整個視頻中平均采樣10個clip,然后分別計算他們的softmax scores,最后做平均得到整個視頻的score。
5. 實驗
關于視頻分類的實驗,我們在Kinetics上進行全面的實驗,另外也給出了Charades上的實驗結果,顯示出我們的模型的泛化性。這里只給出Kinetics上的結果,更多的請看原文。
Table 2給出了消融實驗結果。
5.1 Instantiations(實例化)
表2a比較了不同的non-local block的形式插入到C2D得到的結果(插入位置在res4的最后一個residual block之前)。即使添加一個非本地塊,也可以比基線提高約1%。
有意思的是不同的non-local block的形式效果差不多,說明是non-local block的結構在起作用,而對具體的表達方式不敏感。本文后面都采用嵌入式高斯版本(embedded Gaussian)進行實驗,因為這個版本有softmax,可以直接給出[0,1]之間的scores。
5.2 Which stage to add non-local blocks?
哪個階段加入non-local blocks?表2b比較了一個non-local block加在resnet的不同stage的效果,具體加在不同stage的最后一個residual block之前。發現在res2,res3,res4層上加non-local block效果類似,加在res5上效果稍差。這個的可能原因是res5的spatial size比較小,只有7*7,可能無法提供精確的spatial信息了。更多利用空間信息的非局部塊的證據將在表2d中調查。
5.3 Going deeper with non-local blocks.
加入更多的non-local blocks。表2c給出了加入更多non-local block的結果,我們在resnet-50上加1 block(在res4),加5 block(3個在res4,2個在res3,每隔1個residual block加1個non-local block),加10 block(在res3和res4每個residual block都加non-local block)。在resnet101的相同位置加block。發現更多non-local block通常有更好的結果。我們認為這是因為更多的non-local block能夠捕獲長距離多次轉接的依賴。信息可以在時空域上距離較遠的位置上進行來回傳遞,這是通過local models無法實現的。
另外需要提到的是增加non-local block得到的性能提升并不只是因為它給base model增加了深度。為了說明這一點,表2c中resnet50 5blocks能夠達到73.8的acc,而resnet101 baseline是73.1,同時resnet50 5block只有resnet101的約70%的參數量和80%的FLOPs。說明non-local block得到的性能提升并不只是因為它增加了深度。
5.4 Non-local in spacetime.
時空域上做non-local。我們的方法也可以處理時空域的信息,這一特性非常好,在視頻中相關的物體可能出現在較遠的空間和較長的時間,它們的相關性也可以被我們的模型捕獲。表2d給出了在時間維度,空間維度和時空維度分別做non-local的結果。僅在空間維度上做就相當于non-local的依賴僅在單幀圖像內部發生,也就是說在式(1)上僅對index i的相同幀的index j做累加。僅在時間維度上做也類似。表2d顯示只做時間維度或者只做空間維度的non-local,都比C2D baseline要好,但是沒有同時做時空維度的效果好。
5.5 Non-local net vs. 3D ConvNet.
Non-local net vs. 3D ConvNet。表2e比較了我們的non-local C2D版本和inflated 3D ConvNets的性能。Non-local的操作和3D conv的操作可以看成是將C2D推廣到時間維度的兩種方式。
表2e也比較了param的數量,FLOPs等。我們的non-local C2D模型比I3D更加精確(75.1 vs 74.4),并且有更小的FLOPs(1.2x vs 1.5x)。說明單獨使用時non-local比3D conv更高效。
5.6 Non-local 3D ConvNet.
Non-local 3D ConvNet. 不管上面的比較,其實non-local操作和3D conv各有各的優點:3D conv可以對局部依賴進行建模。表2f給出了在I3D3?1?1I3D_{3?1?1}I3D3?1?1?上插入5個non-local blocks的結果。發現NL I3D都能夠在I3D的基礎上提升1.6個點的acc,說明了non-local和3D conv是可以相互補充的。
5.7 Longer sequences.
更長的輸入序列。 最后我們也實驗了更長輸入序列的情況下模型的泛化性。輸入clip包含128幀連續幀,沒有做下采樣,是一般情況下取的32幀的4倍長度。為了將這個模型放入顯存中,每個GPU上只能放下2 clips。因為這么小的batchsize的原因,我們freeze所有的BN層。我們從32幀訓練得到的模型作為初始化模型,然后用128幀進行finetune,使用相同的iterations數目(雖然batchsize減小了),初始lr為0.0025,其他設置和之前保持一致。
表2g給出了128幀的實驗結果,和表2f的32幀的結果相比,所有模型都表現得更好,說明我們的模型在長序列上的效果也很好。
5.8 Comparisons with state-of-the-art results.
和state-of-the-art的比較。表3給出了Kinetics上各個方法的結果。
6 總結
6.1 Local & Non-local
首先我們來看一下文章說的local是什么意思。
Local這個詞主要是針對感受野(receptive field)來說的。以卷積操作為例,它的感受野大小就是卷積核大小,而我們一般都選用3*3,5*5之類的卷積核,它們只考慮局部區域,因此都是local的運算。同理,池化(Pooling)也是。相反的,non-local指的就是感受野可以很大,而不是一個局部領域。
那我們碰到過什么non-local的操作嗎?有的,全連接就是non-local的,而且是global的。但是全連接帶來了大量的參數,給優化帶來困難。這也是深度學習(主要指卷積神經網絡)近年來流行的原因,考慮局部區域,參數大大減少了,能夠訓得動了。
那我們為什么還需要non-local?
我們知道,卷積層的堆疊可以增大感受野,但是如果看特定層的卷積核在原圖上的感受野,它畢竟是有限的。這是local運算不能避免的。然而有些任務,它們可能需要原圖上更多的信息,比如attention。如果在某些層能夠引入全局的信息,就能很好地解決local操作無法看清全局的情況,為后面的層帶去更豐富的信息。這是我個人的理解。
5.2 Non-local block
好了,那我們來看一下文章是怎么設計non-local運算的。為了能夠當作一個組件接入到以前的神經網絡中,作者設計的non-local操作的輸出跟原圖大小一致,具體來說,是下面這個公式:
yi=1C(x)∑?jf(xi,xj)g(xj)(1)y_i={1\over{C(x)}}\sum_{\forall j}f(x_i,x_j)g(x_j) \space (1)yi?=C(x)1??j∑?f(xi?,xj?)g(xj?)?(1)
上面的公式中,輸入是x,輸出是y,i和j分別代表輸入的某個空間位置,xix_ixi?是一個向量,維數跟x的channel數一樣,f是一個計算任意兩點相似關系的函數,g是一個映射函數,將一個點映射成一個向量,可以看成是計算一個點的特征。也就是說,為了計算輸出層的一個點,需要將輸入的每個點都考慮一遍,而且考慮的方式很像attention:輸出的某個點在原圖上的attention,而mask則是相似性給出。參看下圖。
- Non-local操作可以看成attention
以圖像為例,為了簡化問題,作者簡單地設置g函數為一個1*1的卷積。相似性度量函數f的選擇有多種:
這相當于embedded的兩個點拼接作為帶ReLU激活函數全連接層的輸入。它在visual reasoning中用的比較多。
這里有兩點需要提一下:
- 后兩種選擇的歸一化系數C(x)選擇為x的點數,只是為了簡化計算,同時,還能保證對任意尺寸的輸入,不會產生數值上的尺度伸縮。
- Embedding的實現方式,以圖像為例,在文章中都采用1*1的卷積,也就是 θ\thetaθ 和 ?\phi? 都是卷積操作。
為了能讓non-local操作作為一個組件,可以直接插入任意的神經網絡中,作者把non-local設計成residual block的形式,讓non-local操作去學x的residual:
WzW_zWz?實際上是一個卷積操作,它的輸出channel數跟x一致。這樣以來,non-local操作就可以作為一個組件,組裝到任意卷積神經網絡中。
5.3 具體實現
如果按照上面的公式,用for循環實現肯定是很慢的。此外,如果在尺寸很大的輸入上應用non-local layer,也是計算量很大的。后者的解決方案是,只在高階語義層中引入non-local layer。還可以通過對embedding( θ,?\theta,\phiθ,? )的結果加pooling層來進一步地減少計算量。
對于前者,注意到f的計算可以化為矩陣運算,我們實際上可以將整個non-local化為矩陣乘法運算+卷積運算。如下圖所示,其中oc為output_channels,卷積操作的輸出filter數量。
原文考慮的是T幀的視頻為例,這里以一個batch的圖像、f選為embedded Gaussian為例,對于其他形式的相似性度量,可以類似地化為矩陣操作。
在tensorflow和pytorch中,batch matrix multiplication可以用matmul函數實現。在keras中,可以用batch_dot函數或者dot layer實現。
keras: https://github.com/titu1994/keras-non-local-nets
pytorch: https://link.zhihu.com/?target=https%3A//github.com/AlexHex7/Non-local_pytorch
5.4 跟全連接層的聯系
我們知道,non-local block利用兩個點的相似性對每個位置的特征做加權,而全連接層則是利用position-related的weight對每個位置做加權。于是,全連接層可以看成non-local block的一個特例:
-
任意兩點的相似性僅跟兩點的位置有關,而與兩點的具體坐標無關,即
-
g是identity函數,即
-
歸一化系數為1。歸一化系數跟輸入無關,全連接層不能處理任意尺寸的輸入。
參考文獻
總結
以上是生活随笔為你收集整理的Non-local Neural Networks:非局部神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch必须掌握的的4种学习率衰减
- 下一篇: IT日常技能:VMware网络配置