non-local neural network

以下論文筆記摘自:知乎

理解non-local:

爲了能夠當作一個組件接入到以前的神經網絡中,作者設計的non-local操作的輸出跟原圖大小一致,具體來說,是下面這個公式:
在這裏插入圖片描述

上面的公式中,輸入是x,輸出是y,i和j分別代表輸入的某個空間位置,x_i是一個向量,維數跟x的channel數一樣,f是一個計算任意兩點相似關係的函數,g是一個映射函數,將一個點映射成一個向量,可以看成是計算一個點的特徵。也就是說,爲了計算輸出層的一個點,需要將輸入的每個點都考慮一遍,而且考慮的方式很像attention:輸出的某個點在原圖上的attention,而mask則是相似性給出。

參看下圖:
在這裏插入圖片描述

以圖像爲例,爲了簡化問題,作者簡單地設置g函數爲一個1*1的卷積。相似性度量函數f的選擇有多種:
在這裏插入圖片描述

  • 後兩種選擇的歸一化係數C(x)選擇爲x的點數,只是爲了簡化計算,同時,還能保證對任意尺寸的輸入,不會產生數值上的尺度伸縮。
  • Embedding的實現方式,以圖像爲例,在文章中都採用1*1的卷積

爲了能讓non-local操作作爲一個組件,可以直接插入任意的神經網絡中,作者把non-local設計成residual block的形式,讓non-local操作去學x的residual:
在這裏插入圖片描述

Wz 實際上是一個卷積操作,它的輸出channel數跟x一致。這樣以來,non-local操作就可以作爲一個組件,組裝到任意卷積神經網絡中。

Local & non-local

首先我們來看一下文章說的local是什麼意思。

Local這個詞主要是針對感受野(receptive field)來說的。以卷積操作爲例,它的感受野大小就是卷積核大小,而我們一般都選用33,55之類的卷積核,它們只考慮局部區域,因此都是local的運算。同理,池化(Pooling)也是。相反的,non-local指的就是感受野可以很大,而不是一個局部領域。

那我們碰到過什麼non-local的操作嗎?有的,全連接就是non-local的,而且是global的。但是全連接帶來了大量的參數,給優化帶來困難。這也是深度學習(主要指卷積神經網絡)近年來流行的原因,考慮局部區域,參數大大減少了,能夠訓得動了。

那我們爲什麼還需要non-local?

我們知道,卷積層的堆疊可以增大感受野,但是如果看特定層的卷積核在原圖上的感受野,它畢竟是有限的。這是local運算不能避免的。然而有些任務,它們可能需要原圖上更多的信息,比如attention。如果在某些層能夠引入全局的信息,就能很好地解決local操作無法看清全局的情況,爲後面的層帶去更豐富的信息。這是我個人的理解。

具體實現

如果按照上面的公式,用for循環實現肯定是很慢的。此外,如果在尺寸很大的輸入上應用non-local layer,也是計算量很大的 。後者的解決方案是,只在高階語義層中引入non-local layer。還可以通過對embedding在這裏插入圖片描述的結果加pooling層來進一步地減少計算量。

對於前者,注意到f的計算可以化爲矩陣運算,我們實際上可以將整個non-local化爲矩陣乘法運算+卷積運算。如下圖所示,其中oc爲output_channels,卷積操作的輸出filter數量。
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

博客推薦:

-【論文筆記】Non-local Neural Networks (寫得很詳細)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章