positional encoding位置编码详解:绝对位置与相对位置编码对比
目錄
前言
Why
What
絕對位置編碼
相對位置編碼
Sinusoidal Position Encoding
Complex embedding
How
前言
相信熟悉BERT的小伙伴對positional encoding(位置表示) 肯定都不會陌生~ 雖然positional encoding只是BERT中比較小的一個組成部分,但是實際上卻暗藏玄機。所以,今天呢我們就把positional encoding單獨拎出來對其進行一個全面的剖析~~
-
Why?為什么需要positional encoding
-
What?兩種positional encoding方式:絕對位置編碼與相對位置編碼
-
How?不同方法優(yōu)缺點對比
Why
眾所周知,文本是時序型數據,詞與詞之間的順序關系往往影響整個句子的含義。舉個栗子:
小夕/是/一個/萌/妹子。一個/妹子/是/萌/小夕??萌/小夕/是/一個/妹子??
為了避免不必要的誤會,所以我們在對文本數據進行建模的時候需要考慮詞與詞之間的順序關系。
可是,要建模文本中的順序關系必須要用positional encoding嗎?
答案是No!
只有當我們使用對位置不敏感(position-insensitive)的模型對文本數據建模的時候,才需要額外使用positional encoding。
什么是對位置敏感的模型??什么又是對位置不敏感的模型??
如果模型的輸出會隨著輸入文本數據順序的變化而變化,那么這個模型就是關于位置敏感的,反之則是位置不敏感的。
用更清晰的數學語言來解釋。設模型為函數,其中輸入為一個詞序列,輸出結果為向量。對的任意置換,都有
則模型是關于位置不敏感的。
在我們常用的文本模型中,RNN和textCNN都是關于位置敏感的,使用它們對文本數據建模時,模型結構天然考慮了文本中詞與詞之間的順序關系。而以attention為核心的transformer則是位置不敏感的,使用這一類位置不敏感的模型的時候需要額外加入positional encoding引入文本中詞與詞的順序關系。
What
對于transformer模型的positional encoding有兩種主流方式:
絕對位置編碼
現在普遍使用的一種方法Learned Positional Embedding編碼絕對位置,相對簡單也很容易理解。直接對不同的位置隨機初始化一個postion embedding,加到word embedding上輸入模型,作為參數進行訓練。
相對位置編碼
使用絕對位置編碼,不同位置對應的positional embedding固然不同,但是位置1和位置2的距離比位置3和位置10的距離更近,位置1和位置2與位置3和位置4都只相差1,這些關于位置的相對含義模型能夠通過絕對位置編碼get到嗎?使用Learned Positional Embedding編碼,位置之間沒有約束關系,我們只能期待它隱式地學到,是否有更合理的方法能夠顯示的讓模型理解位置的相對關系呢?
所以就有了另一種更直觀地方法——相對位置編碼。下面介紹兩種編碼相對位置的方法:Sinusoidal Position Encoding和Complex embedding。
Sinusoidal Position Encoding
使用正余弦函數表示絕對位置,通過兩者乘積得到相對位置:
這樣設計的好處是位置的psotional encoding可以被位置線性表示,反應其相對位置關系。
Sinusoidal Position Encoding雖然看起來很復雜,但是證明可以被線性表示,只需要用到高中的正弦余弦公式:(注意:長公式可以左右滑動噢!)
對于位置的positional encoding
其中
將公式(5)(6)稍作調整,就有
注意啦,和相對距離是常數,所以有
其中為常數。
所以可以被線性表示。
計算和的內積,有
其中.
和的內積會隨著相對位置的遞增而減小,從而表征位置的相對距離。但是不難發(fā)現,由于距離的對稱性,Sinusoidal Position Encoding雖然能夠反映相對位置的距離關系,但是無法區(qū)分方向/(ㄒoㄒ)/~~
更加直觀的對其可視化[1],可以看到圖像關于對稱,無法區(qū)分前后關系。
Complex embedding
為了更好的讓模型捕獲更精確的相對位置關系,比如相鄰,前序(precedence)等,ICLR 2020發(fā)表的文章《Encoding Word Oder In Complex Embeddings》使用了復數域的連續(xù)函數來編碼詞在不同位置的表示。
不管是Learned Postional Embdedding還是Sinusoidal Position Encoding,某個詞在位置上的表示為其word embedding加上對應位置的embedding,即:
同word embedding 都是從整數域到實數域的一個映射。
對于word embedding來說,這樣的設計是合理的。因為不同詞的index是獨立的,僅和我們具體使用的詞典怎么排序有關系,某個詞是否在另外一個詞前面或者相鄰沒有任何的信息。但是位置的index并不是滿足獨立的假設,其順序關系對文本的正確理解有非常重要的影響。
所以,為了解決pos index的依賴問題(position-insensitive problem),文章使用了關于位置的連續(xù)函數來表征詞在的表示,即:
把公式(13)展開有
其中是關于位置在復數域上的函數。
為了讓上述函數更好的表征位置的相對信息,要求函數滿足以下兩個性質:
Position-free offset transformation
存在一個函數 使得
其中在不影響理解的情況下,我們把簡寫成。也就是說,詞在pos或者pos+k的表示可以由只和相對位置k有關的一個變換得到,而與具體這個詞無關。
Boundedness
要求函數有界。非常合理的一個限制。
最后,論文證明了在復數域上滿足這個兩個條件的函數一定為下面這樣的形式:
將其改寫成指數的形式,則為
其中,為振幅,為角頻率,為初相,都是需要學習的參數~~
將式(17)代入(14)有
要表征詞在pos上的embedding,需要學習的參數有, 以及。以此類推,要表示詞表中所有的詞,那么需要學習的參數量為????.由于參數量較大,論文后續(xù)還提出了一些減小參數量的方法,有興趣的同學可以看具體查閱原文哦~~~
How
以上三種positional encoding都不同程度、各有側重的編碼了文本數據中的順序關系,那么到底哪個更好?我們在平時使用的時候應該如何選擇呢?
結果導向的話,肯定是哪種方法效果好選哪種啦~~在《Attention is all you need》[2]里面提到,Learned Positional Embedding和Sinusoidal Position Encoding兩種方式的效果沒有明顯的差別。在論文[3],實驗結果表明使用Complex embedding相較前兩種方法有較明顯的提升。(不過介于這個方法還比較新,大家可以多多嘗試對比)。
從方法的可理解性上,相比相對位置編碼的兩種方法,Learned Positional Embedding更加的簡單直接,易于理解。從參數維度上,使用Sinusoidal Position Encoding不會引入額外參數,Learned Positional Embedding增加的參數量會隨線性增長,而Complex Embedding在不做優(yōu)化的情況下,會增加三倍word embedding的參數量。在可擴展性上,Learned Positional Embedding可擴展性較差,只能表征在以內的位置,而另外兩種方法沒有這樣的限制,可擴展性更強。
講了這么多,相信大家對positional encoding已經有了充分的理解~~至于到底應該如何選擇,還是需要基于大家對方法的理解實際問題實際分析哦????
?
參考文獻
[1] 可視化: https://kazemnejad.com/blog/transformer_architecture_positional_encoding/#what-is-positional-encoding-and-why-do-we-need-it-in-the-first-place[2] Attention is all you need: https://arxiv.org/pdf/1706.03762.pdf
[3] Complex Embeddings: https://openreview.net/pdf?id=Hke-WTVtwr
?
?
總結
以上是生活随笔為你收集整理的positional encoding位置编码详解:绝对位置与相对位置编码对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不是所有问题都适合用神经网络去搞!
- 下一篇: 抓住训练集中真正有用的样本,提升模型整体