詳解Transformer中位置編碼Positional Encoding
提到 Transformer,大家就會聯(lián)想到位置編碼、注意力機制、編碼器-解碼器結構,本系列教程將探索 Transformer 的不同模塊在故障診斷等信號分類任務中扮演什么樣角色,到底哪些模塊起作用?
前言
本期基于凱斯西儲大學(CWRU)軸承數(shù)據(jù),進行 Transformer 中位置編碼 (Positional Encoding)的詳細介紹,同時探索位置編碼對故障分類任務的影響力。
1 位置編碼相關介紹
1.1 數(shù)據(jù)中的順序信息
在任何一門語言中,詞語的位置和順序對句子意思表達都是至關重要的。傳統(tǒng)的循環(huán)神經(jīng)網(wǎng)絡(RNN)中,模型是逐詞處理輸入序列的,每個時刻的輸出依賴于前一個時刻的輸出。這種逐序處理的方式使得RNN天生適合處理序列數(shù)據(jù),因為它能夠隱式地保留序列中詞語的順序信息。
由于Transformer模型沒有RNN(循環(huán)神經(jīng)網(wǎng)絡)或CNN(卷積神經(jīng)網(wǎng)絡)結構,句子中的詞語都是同時進入網(wǎng)絡進行處理,所以沒有明確的關于單詞在源句子中位置的相對或絕對的信息。為了讓模型理解序列中每個單詞的位置(順序),Transformer論文中提出了使用一種叫做 Positional Encoding(位置編碼) 的技術。這種技術通過為每個單詞添加一個額外的編碼來表示它在序列中的位置,這樣模型就能夠理解單詞在序列中的相對位置。
1.2 位置編碼的概念
RNN作為特征提取器,是自帶詞的前后順序信息的;而Attention機制并沒有考慮先后順序信息,但前后順序信息對語義影響很大,因此需要通過Positional Embedding這種方式把前后位置信息加在輸入的Embedding上。
一句話概括,Positional Encoding就是將位置信息添加(嵌入)到Embedding詞向量中,讓Transformer保留詞向量的位置信息,可以提高模型對序列的理解能力。
1.3 位置編碼分類
對于transformer模型的positional encoding有兩種主流方式:
(1)絕對位置編碼:
Learned Positional Embedding方法是最普遍的絕對位置編碼方法,該方法直接對不同的位置隨機初始化一個 postion embedding,加到 word embedding 上輸入模型,作為參數(shù)進行訓練。
(2)相對位置編碼
使用絕對位置編碼,不同位置對應的 positional embedding 固然不同,但是位置1和位置2的距離比位置3和位置10的距離更近,位置1和位置2、位置3和位置4都只相差1,這些體現(xiàn)了相對位置編碼。
常用的相對位置編碼方法有Sinusoidal Positional Encoding 和 Learned Positional Encoding。其中,Sinusoidal Positional Encoding 是通過將正弦和余弦函數(shù)的不同頻率應用于輸入序列的位置來計算位置編碼;Learned Positional Encoding 是通過學習一組可學習參數(shù)來計算位置編碼。
(3)復雜編碼-Complex embedding
在《Attention is all you need》里提到,Learned Positional Embedding和Sinusoidal Position Encoding兩種方式的效果沒有明顯的差別。在論文 《Encoding Word Oder In Complex Embeddings》,實驗結果表明使用Complex embedding相較前兩種方法有較明顯的提升。
1.4 位置向量與詞向量
一般來說,可以使用向量拼接或者相加的方式,將位置向量和詞向量相結合。相當于做了輸入數(shù)據(jù)和位置信息數(shù)據(jù)的矩陣疊加!
這里,input_embedding 是通過常規(guī)Embedding層,將每一個token的向量維度,也就是輸入維度,從數(shù)據(jù)本身的維度映射到 d_model。由于是相加關系,則 positional_encoding 也是一個 d_model 維度的向量。(原論文中,d_model=512)
關于這個 d_model:
在深度學習和Transformer模型的上下文中,d_model中的“d”通常代表“dimension”,即“維度”的簡寫。因此,d_model指的是模型中向量的維度大小,這是一個關鍵的參數(shù),d_model 定義了每層的大小、嵌入層的大小、自注意力機制的大小、前饋網(wǎng)絡的輸入和輸出大小。
選擇合適的d_model對模型的性能有重大影響。如果d_model太小,模型可能無法捕捉到足夠的信息;而如果d_model太大,則會增加計算成本和過擬合的風險。因此,在設計模型時需要仔細考量d_model的大小。
2 位置編碼原理
2.1 原理解析
Transformer論文中,使用正余弦函數(shù)表示絕對位置,通過兩者乘積得到相對位置。因為正余弦函數(shù)具有周期性,可以很好地表示序列中單詞的相對位置。我們以Sinusoidal Positional Encoding為例,進行講解。
首先解釋下論文中的公式,并給出對應代碼,Positional Encoding 的公式如下:
對應代碼實現(xiàn)如下:
class PositionalEncoding(nn.Module):
"Implement the PE function."
def __init__(self, d_model, dropout, max_len=5000):
super(PositionalEncoding, self).__init__()
self.dropout = nn.Dropout(p=dropout)
# Compute the positional encodings once in log space.
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) *
-(math.log(10000.0) / d_model))
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
pe = pe.unsqueeze(0)
self.register_buffer('pe', pe)
def forward(self, x):
x = x + Variable(self.pe[:, :x.size(1)],
requires_grad=False)
return self.dropout(x)
從公式中可以看出,一個詞語的位置編碼是由不同頻率的余弦函數(shù)組成的,這樣設計的好處是:pos+k 位置的 positional encoding 可以被 pos 線性表示,體現(xiàn)其相對位置關系。雖然 Sinusoidal Position Encoding 看起來很復雜,但是證明 pos+k 可以被 pos 線性表示,只需要用到高中的正弦余弦公式:
對于 pos+k 的 positional encoding:
可以看出,對于 pos+k 位置的位置向量某一維 2?? 或 2??+1 而言,可以表示為,pos 位置與 k 位置的位置向量的2?? 與 2??+1維的線性組合,這樣的線性組合意味著位置向量中蘊含了相對位置信息。
2.2 通俗理解
最簡單直觀的加入位置信息的方式就是使用1,2,3,4,…直接對句子進行位置編碼(one-hot)。用二進制轉化舉個例子:
圖中維度0,維度1,維度2,維度3拼成的數(shù)字就是該位置對應的二進制表示??梢钥吹矫總€維度(每一列)其實都是有周期的,并且周期是不同的。具體來說,每個比特位的變化率都是不一樣的,越低位的變化越快(越往右邊走,變化頻率越快),紅色位置0和1每個數(shù)字會變化一次,而黃色位,每8個數(shù)字才會變化一次。這樣就能夠說明使用多個周期不同的周期函數(shù)組成的多維度編碼和遞增序列編碼其實是可以等價的。這也回答了為什么周期函數(shù)能夠引入位置信息。
最后,我們需要將位置向量與詞向量相結合。一般來說,可以使用向量拼接或直接相加的方式將二者結合起來。下面我們結合軸承故障數(shù)據(jù)進行實驗講解:
3 軸承故障數(shù)據(jù)的預處理
3.1 導入數(shù)據(jù)
參考之前的文章,進行故障10分類的預處理,凱斯西儲大學軸承數(shù)據(jù)10分類數(shù)據(jù)集:
train_set、val_set、test_set 均為按照7:2:1劃分訓練集、驗證集、測試集,最后保存數(shù)據(jù)
3.2 故障數(shù)據(jù)預處理與數(shù)據(jù)集制作
4 加入位置編碼和 input_embedding 的實驗對比
4.1 定義位置編碼PositionalEncoding 和 input_embedding
對比模型為:
- 模型 A :Transformer 編碼器層
- 模型 B :Transformer 編碼器層 + input_embedding -PositionalEncoding
4.2 西儲大學十分類數(shù)據(jù)集實驗對比
(1)模型 A:
模型評估:
準確率、精確率、召回率、F1 Score
(2)模型 B:
模型評估:
準確率、精確率、召回率、F1 Score
4.3 東南大學齒輪箱軸承故障-五分類數(shù)據(jù)集實驗對比
(1)模型 A:
模型評估:
準確率、精確率、召回率、F1 Score
(2)模型 B:
模型評估:
準確率、精確率、召回率、F1 Score
5 實驗對比結果分析
通過兩個數(shù)據(jù)集的對比實驗,我們可以發(fā)現(xiàn),僅用Transformer 編碼器層在故障信號分類任務上取得了不錯的效果,但是加入輸入編碼和位置編碼后,分類效果反而下降了,證明位置編碼在故障信號分類任務上作用并不是特別明顯!下一期我們將進一步討論 Transformer 中哪些核心模塊對分類精度起著重要作用。
本文轉載自 ??建模先鋒??,作者: 小蝸愛建模
