最近在看學習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,X3…Xc,而kernel是K,∗是convolution operation,則convolution的式子如下:
Z=c∑i=1Xi∗Ki如果將X與一個新的feature vector Y1,Y2,Y3…Yc進行concat再做convolution,則式子變成
Z=c∑i=1Xi∗Ki+c∑i=1Yi∗K′i如果將X與一個新的feature vector Y1,Y2,Y3…Yc進行add再做convolution,則式子變成
Z=c∑i=1(Xi+Yi)∗Ki=c∑i=1Xi∗Ki+c∑i=1Yi∗KiObservation
- 可以發現差異只差在對於concat時,多出來的channel會使用不同的kernel(K′)來進行運算,也因此使用concat會導致parameter size變多
- 對於兩個不同的input feature vector,如果對應的input channel具有類似的語意性質(比如說X1和Y1代表的意義類似、X2和Y2代表的意義類似…),則可以用add來代替concat,可以更節省參數和計算量
Conculsion
從訊息量的角度來看的話
- add後的維度不變,原本的資訊意義會被改變,但也因此單一維度包含了更多的資訊量,更容易訓練
- concat後的維度變了,可以保留原始的資訊,也使得模型能有更豐富的表達能力(因為維度增加),但相對的更不容易訓練
但沒有說上述哪個到底誰比較好,引用一句網友講的話:
NN牛叉就牛叉在这里,说得清的话,早就用特征工程搞定了,还用什么NN。
如果還有人有任何的看法或觀點,歡迎分享討論。