Transformers中的位置编码到底是什么?
眾所周知,self-attention是不考慮輸入序列的位置的,要解決這個問題就得靠Position Encoding了,在attention is All You Need中就提出了這個方法,在每個輸入中都加上了位置編碼,如下圖紅框所示:
然后在論文3.5部分給出了以下PE公式,一個sin函數和一個cos函數,為每個position計算一個值:
說實話,看到這里時晴反正是沒看懂,公式是初中生都看的懂,d_model表示輸入的維度,pos表示單詞的索引,i表示向量中索引,用sin,cos計算出對應值,但是為什么可以這樣加到input上達到位置編碼的效果呢?這時候我們看看bert就是非常直觀的絕對位置動態編碼,就直觀很多,每個位置就是固定的embedding:
讓我們看看原文作者是怎么解釋的:
對于任何偏移量k,對pos+k的編碼都可以是pos編碼線形變換.先來看看可視化結果:
值得注意的是,每個向量第0和第1的位置,第0的位置對應于PE公式的sin式,第1的位置對應于PE公式的cos式子,但是他們的2i都是0,所以會有下式:
所以每個輸入向量的第0個和第1個位置的位置編碼只和向量所處的pos有關.但是第3個位置后就受d_model影響了,一旦d_model變小,sin/cos函數就會有“拉伸”感,如下圖所示:
對于長度為20的input,維度是50,我們可以畫出一下PE值:
我們發現,越小的pos受影響的i就越少,i如果很大,PE值就會在0和1進行變換.從上圖中,我們看到30~50列值基本沒有變化.為啥上圖這種編碼就能學到位置信息?其實有種非常直觀的解釋方式,比如讓你對數字進行編碼,最直觀的想法就是二進制編碼,如下圖所示:
PE方法就可以簡單的理解為上述版本的float編碼.
PE的方法有很多,但是有很多實驗表明,這些PE方法最終結果都很類似,本文討論的PE方法優勢在于可以支持更長的序列長度.
總結
以上是生活随笔為你收集整理的Transformers中的位置编码到底是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 那些决定模型上限的操作
- 下一篇: 模型的燃料,数据采样的秘密