最近在看學習transformer的相關介紹,再transformer中,對於input($x$)的embedding($a$)會再加上一個position encoding($e$),目的是為了使model可以學習到句子的位置資訊,也就是:
而在Attention is all you need這篇paper中,使用的是add將這兩個資訊融合再一起,不過是使用add而不是concat感覺是不是會怪怪的?
李宏毅老師的Transformer教學中,從線性代數的角度出發給予了下面的解釋:
對於原本的輸入$X$,會和矩陣$W$做矩陣乘法得到$A$,也就是:
如果加入一個代表position information的one-hot vector$P$,對$X$進行concat後則式子會變成
而多出來的那一項$\left[\begin{matrix} W^p \end{matrix}\right] \left[\begin{matrix} P^i \end{matrix}\right]$就是原本圖中的$E$了,所以實際上兩者的運算可以達到一樣的效果。
Aspect of Computer Vision
看到上面的介紹後,感覺add和concat似乎能達到一樣的效果?下面試著從CV上來探討兩者之間的差異。
CV的model也最常使用到上述兩者的技巧,經典的例子如ResNet中是使用add來進行skip connection,而GoogleNet是使用concat來完成inception block。
Introduction
假設對於input $X$具有$X_1, X_2, X_3…X_c$,而kernel是$K$,$*$是convolution operation,則convolution的式子如下:
如果將$X$與一個新的feature vector $Y_1, Y_2, Y_3…Y_c$進行concat再做convolution,則式子變成
如果將$X$與一個新的feature vector $Y_1, Y_2, Y_3…Y_c$進行add再做convolution,則式子變成
Observation
- 可以發現差異只差在對於concat時,多出來的channel會使用不同的kernel($K’$)來進行運算,也因此使用concat會導致parameter size變多
- 對於兩個不同的input feature vector,如果對應的input channel具有類似的語意性質(比如說$X_1$和$Y_1$代表的意義類似、$X_2$和$Y_2$代表的意義類似…),則可以用add來代替concat,可以更節省參數和計算量
Conculsion
從訊息量的角度來看的話
- add後的維度不變,原本的資訊意義會被改變,但也因此單一維度包含了更多的資訊量,更容易訓練
- concat後的維度變了,可以保留原始的資訊,也使得模型能有更豐富的表達能力(因為維度增加),但相對的更不容易訓練
但沒有說上述哪個到底誰比較好,引用一句網友講的話:
NN牛叉就牛叉在这里,说得清的话,早就用特征工程搞定了,还用什么NN。
如果還有人有任何的看法或觀點,歡迎分享討論。