67 自注意力【動手學深度學習v2】

關于自注意力層和全連接層(以下簡稱MLP層)的區(qū)別,我覺得可以這樣思考:
首先,的確二者很相似,最終輸出時都是矩陣乘以矩陣,但是還是有所不同的。
MLP層間乘的那個權重W雖然算在做“加權”,但是這個W和SA層的Q-K矩陣是不一樣的
從機制上講,Q-K注意力權重矩陣會考慮序列各元素之間的關系,而MLP層的W沒有任何機制來保證這一點。
所以,盡管從數(shù)學架構上二者在輸出時都是矩陣乘矩陣,但是效果是不同的(更何況自注意力還多了$ QK^T $這個乘法,參數(shù)量也是比單純MLP層要多的)
這里我們還可以發(fā)散地想一個問題,可不可以直接設計一個$ W_{qkd} $這樣的一個三階張量權重來對$ V_{kd} $來做全連接乘法?也就是說,“用一個大張量來讓所有元素互相關聯(lián)”,這樣一來不僅可以照顧到不同元素之間的關系,還可以針對不同的d特征采用不同的權重。
但實際上這樣會麻煩,這種設計的公式可以寫為:
$$
Output_{qk} = Σ_{j} W_{qkd} · V_{kd}
$$
這樣一來,雖然也矩陣乘法可以并行,但實際計算時,需要先把 V_{kd} 廣播成 V_{qkd},就是在q的這個分量上重復q的個數(shù)次,然后再和 W_{qkd} 做元素積,其結(jié)果可以理解為一個三維立方體,然后再對k分量求和,消去k,把立方體壓縮為矩陣Output_{qk},再輸出。
要注意,這里的計算量比自注意力層要大,雖然復雜度依然為O(n^2d)(需要做n×n×d次元素積,或者說q×k×d次元素積),但多了一個對k的求和;內(nèi)存占用上,由于做元素積之前要對$ V_{kd} $進行廣播,V的內(nèi)存占用顯著增加,序列越長越明顯。而自注意力層就沒有這個問題。
所以,自注意力機制在盡可能減少算力壓力的情況下,達到近似三階張量全連接層參數(shù)量的效果,并且序列內(nèi)部互相關聯(lián)的機制使得它更能把握序列的特征。與二階張量(矩陣)形式的MLP是不同的。