神經網絡中通過add和concate(cat)的方式融合特徵的不同

 

cat與add

 

 

 

對於兩路輸入來說,如果是通道數相同且後面帶卷積的話,add等價於concat之後對應通道共享同一個卷積核。下面具體用式子解釋一下。由於每個輸出通道的卷積核是獨立的,我們可以只看單個通道的輸出。假設兩路輸入的通道分別爲X1, X2, …, Xc和Y1, Y2, …, Yc。那麼concat的單個輸出通道爲(*表示卷積):

而add的單個輸出通道爲:

因此add相當於加了一種prior,當兩路輸入可以具有“對應通道的特徵圖語義類似”(可能不太嚴謹)的性質的時候,可以用add來替代concat,這樣更節省參數和計算量(concat是add的2倍)。FPN[1]裏的金字塔,是希望把分辨率最小但語義最強的特徵圖增加分辨率,從性質上是可以用add的。如果用concat,因爲分辨率小的特徵通道數更多,計算量是一筆不少的開銷

CPN[2]爲了進一步減少計算量,對於分辨率小的特徵圖在add前用1x1的卷積減少了通道數。

又比如edge detection[3]的工作,裏面不同層輸出的edge map也通過weighted add融合在一起,這是因爲這些輸出的語義本來就是相同的,都用了label的loss來約束。

還有一個例子是ResNet[4]的skip connection。這裏的add主要是爲了保持mapping的identity性質,使梯度回傳得更加容易。同樣的操作在LSTM[5]裏的cell state也能看到。

當然,如果不在乎計算量且數據足夠的時候,用concat也是可以的,因爲這兩個本身就是包含關係。實際上concat在skip connection裏用的也比add更普遍,比如題主提到的U-Net[6]、DenseNet[7]。

 

參考文獻:

[1] Lin T Y, Dollár P, Girshick R B, et al. Feature Pyramid Networks for Object Detection[C]//CVPR. 2017, 1(2): 4.

[2] Chen Y, Wang Z, Peng Y, et al. Cascaded pyramid network for multi-person pose estimation[J]. arXiv preprint arXiv:1711.07319, 2017.

[3] Xie S, Tu Z. Holistically-nested edge detection[C]//Proceedings of the IEEE international conference on computer vision. 2015: 1395-1403.

[4] He K, Zhang X, Ren S, et al. Identity mappings in deep residual networks[C]//European conference on computer vision. Springer, Cham, 2016: 630-645.

[5] Hochreiter S, Schmidhuber J. Long short-term memory[J]. Neural computation, 1997, 9(8): 1735-1780.

[6] Ronneberger O, Fischer P, Brox T. U-net: Convolutional networks for biomedical image segmentation[C]//International Conference on Medical image computing and computer-assisted intervention. Springer, Cham, 2015: 234-241.

[7] Huang G, Liu Z, Van Der Maaten L, et al. Densely connected convolutional networks[C]//CVPR. 2017, 1(2): 3.

 

  • 作者二:王若霄

concat是肯定是計算量大於element-wise add的,但個人認爲,concat避免了直接add對信息造成的負面影響。而且逐元素加和的方式要求不同層的feature map具有完全一致的channel數量,而cancat不受channel數量的限制(yolov3裏就是concat,做concat操作的兩層通道數不同)

 

  • 作者三:Hanjie WU

add操作經典代表網絡是ResNet,concate操作經典代表網絡是Inception系統網絡中的Inception結構和DenseNet。

正如之前的回答有人說的,add操作相當於加入一種先驗知識。我覺得也就是相當於你對原始特徵進行人爲的特徵融合。而你選擇的特徵處理的操作是element-wise add。通過add操作,會得到新的特徵,這個新的特徵可以反映原始特徵的一些特性,但是原始特徵的一些信息也會在這個過程中損失。

但是concate就是將原始特徵直接拼接,讓網絡去學習,應該如何融合特徵,這個過程中信息不會損失。

所以我認爲add其實只是concate的一種特殊情況。但是concate帶來的計算量較大,在明確原始特徵的關係可以使用add操作融合的話,使用add操作可以節省計算代價。

 

  • 作者四:店長

我認爲沒有人能徹底回答這個問題。NN領域很多問題都這樣。

add操作必然會帶來信息損失。兩頭羊加兩頭羊等於四頭羊,這時候加法沒有損失信息。但是如果兩個被加的向量不具備同類特徵含義時怎麼辦?事實上,如果有了加法操作,訓練過程會把加法之後那個特徵分解爲加法前的兩個子特徵。如果這兩個子特徵之和超過了某個閾值,哪怕一正一負,就有激活功能。這兩個子特徵未必需要是同類特徵含義。信息損失如果“損失”得當,就是信息提取!

NN牛叉就牛叉在這裏,說得清的話,早就用特徵工程搞定了,還用什麼NN。

 

  • 作者五:Cyunsiu To

add作爲一種特徵融合的方式在沒有時序的網絡中是無害的,concat是add的泛華形式,對比densenet和resnet即可知道。

但是在時序步共享的網絡中,add簡直是災難性的,因爲時序共享的網絡諸如lstm和gru,要求每一個時間步共享參數,那麼處在後時序步的網絡輸出值域要遠遠大於最開始前幾部的值域,所以rnn會有梯度的問題,因此lstm和gru應運而生,不過個人覺得lstm和gru絕對稱不上是好網絡,解釋性太差,每個門的動作僅僅基於啓發式的yy來設計,我們需要有能力的學者探討如何在時序網絡中進行特徵的融合。




總結:
Resnet是做值的疊加,通道數是不變的,DenseNet是做通道的合併。你可以這麼理解,add是描述圖像的特徵下的信息量增多了,但是描述圖像的維度本身並沒有增加,只是每一維下的信息量在增加,這顯然是對最終的圖像的分類是有益的。而concatenate是通道數的合併,也就是說描述圖像本身的特徵增加了,而每一特徵下的信息是沒有增加。

 

cat和add 在pool上的例子(組合池化)

​ 組合池化則是同時利用最大值池化與均值池化兩種的優勢而引申的一種池化策略。常見組合策略有兩種:Cat與Add。其代碼描述如下:

def add_avgmax_pool2d(x, output_size=1):
    x_avg = F.adaptive_avg_pool2d(x, output_size)
    x_max = F.adaptive_max_pool2d(x, output_size)
    return 0.5 * (x_avg + x_max)

def cat_avgmax_pool2d(x, output_size=1):
    x_avg = F.adaptive_avg_pool2d(x, output_size)
    x_max = F.adaptive_max_pool2d(x, output_size)
    return torch.cat([x_avg, x_max], 1)

 


 

 

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