[DL]Difference between add/concat operation in Neural Network

Posted by John on 2019-11-23
Words 807 and Reading Time 3 Minutes
Viewed 213621 Times

最近在看學習transformer的相關介紹,再transformer中,對於input(x)的embedding(a)會再加上一個position encoding(e),目的是為了使model可以學習到句子的位置資訊,也就是:

而在Attention is all you need這篇paper中,使用的是add將這兩個資訊融合再一起,不過是使用add而不是concat感覺是不是會怪怪的?
李宏毅老師的Transformer教學中,從線性代數的角度出發給予了下面的解釋:

對於原本的輸入X,會和矩陣W做矩陣乘法得到A,也就是:

[Wi][Xi]=[Ai]

如果加入一個代表position information的one-hot vectorP,對X進行concat後則式子會變成

[WiWp][XiPi]=[Wi][Xi]+[Wp][Pi]

而多出來的那一項[Wp][Pi]就是原本圖中的E了,所以實際上兩者的運算可以達到一樣的效果。

Aspect of Computer Vision

看到上面的介紹後,感覺add和concat似乎能達到一樣的效果?下面試著從CV上來探討兩者之間的差異。

CV的model也最常使用到上述兩者的技巧,經典的例子如ResNet中是使用add來進行skip connection,而GoogleNet是使用concat來完成inception block

Introduction

假設對於input X具有X1,X2,X3Xc,而kernel是K是convolution operation,則convolution的式子如下:

Z=ci=1XiKi

如果將X與一個新的feature vector Y1,Y2,Y3Yc進行concat再做convolution,則式子變成

Z=ci=1XiKi+ci=1YiKi

如果將X與一個新的feature vector Y1,Y2,Y3Yc進行add再做convolution,則式子變成

Z=ci=1(Xi+Yi)Ki=ci=1XiKi+ci=1YiKi

Observation

  1. 可以發現差異只差在對於concat時,多出來的channel會使用不同的kernel(K)來進行運算,也因此使用concat會導致parameter size變多
  2. 對於兩個不同的input feature vector,如果對應的input channel具有類似的語意性質(比如說X1Y1代表的意義類似、X2Y2代表的意義類似…),則可以用add來代替concat,可以更節省參數和計算量

Conculsion

從訊息量的角度來看的話

  • add後的維度不變,原本的資訊意義會被改變,但也因此單一維度包含了更多的資訊量,更容易訓練
  • concat後的維度變了,可以保留原始的資訊,也使得模型能有更豐富的表達能力(因為維度增加),但相對的更不容易訓練

但沒有說上述哪個到底誰比較好,引用一句網友講的話:

NN牛叉就牛叉在这里,说得清的话,早就用特征工程搞定了,还用什么NN。

如果還有人有任何的看法或觀點,歡迎分享討論。

Reference


>