詳解Transformer中位置編碼Positional Encoding
提到 Transformer,大家就會(huì)聯(lián)想到位置編碼、注意力機(jī)制、編碼器-解碼器結(jié)構(gòu),本系列教程將探索 Transformer 的不同模塊在故障診斷等信號分類任務(wù)中扮演什么樣角色,到底哪些模塊起作用?

前言
本期基于凱斯西儲(chǔ)大學(xué)(CWRU)軸承數(shù)據(jù),進(jìn)行 Transformer 中位置編碼 (Positional Encoding)的詳細(xì)介紹,同時(shí)探索位置編碼對故障分類任務(wù)的影響力。
1 位置編碼相關(guān)介紹
1.1 數(shù)據(jù)中的順序信息
在任何一門語言中,詞語的位置和順序?qū)渥右馑急磉_(dá)都是至關(guān)重要的。傳統(tǒng)的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)中,模型是逐詞處理輸入序列的,每個(gè)時(shí)刻的輸出依賴于前一個(gè)時(shí)刻的輸出。這種逐序處理的方式使得RNN天生適合處理序列數(shù)據(jù),因?yàn)樗軌螂[式地保留序列中詞語的順序信息。

由于Transformer模型沒有RNN(循環(huán)神經(jīng)網(wǎng)絡(luò))或CNN(卷積神經(jīng)網(wǎng)絡(luò))結(jié)構(gòu),句子中的詞語都是同時(shí)進(jìn)入網(wǎng)絡(luò)進(jìn)行處理,所以沒有明確的關(guān)于單詞在源句子中位置的相對或絕對的信息。為了讓模型理解序列中每個(gè)單詞的位置(順序),Transformer論文中提出了使用一種叫做 Positional Encoding(位置編碼) 的技術(shù)。這種技術(shù)通過為每個(gè)單詞添加一個(gè)額外的編碼來表示它在序列中的位置,這樣模型就能夠理解單詞在序列中的相對位置。

1.2 位置編碼的概念
RNN作為特征提取器,是自帶詞的前后順序信息的;而Attention機(jī)制并沒有考慮先后順序信息,但前后順序信息對語義影響很大,因此需要通過Positional Embedding這種方式把前后位置信息加在輸入的Embedding上。
一句話概括,Positional Encoding就是將位置信息添加(嵌入)到Embedding詞向量中,讓Transformer保留詞向量的位置信息,可以提高模型對序列的理解能力。
1.3 位置編碼分類
對于transformer模型的positional encoding有兩種主流方式:
(1)絕對位置編碼:
Learned Positional Embedding方法是最普遍的絕對位置編碼方法,該方法直接對不同的位置隨機(jī)初始化一個(gè) postion embedding,加到 word embedding 上輸入模型,作為參數(shù)進(jìn)行訓(xùn)練。

(2)相對位置編碼
使用絕對位置編碼,不同位置對應(yīng)的 positional embedding 固然不同,但是位置1和位置2的距離比位置3和位置10的距離更近,位置1和位置2、位置3和位置4都只相差1,這些體現(xiàn)了相對位置編碼。
常用的相對位置編碼方法有Sinusoidal Positional Encoding 和 Learned Positional Encoding。其中,Sinusoidal Positional Encoding 是通過將正弦和余弦函數(shù)的不同頻率應(yīng)用于輸入序列的位置來計(jì)算位置編碼;Learned Positional Encoding 是通過學(xué)習(xí)一組可學(xué)習(xí)參數(shù)來計(jì)算位置編碼。
(3)復(fù)雜編碼-Complex embedding
在《Attention is all you need》里提到,Learned Positional Embedding和Sinusoidal Position Encoding兩種方式的效果沒有明顯的差別。在論文 《Encoding Word Oder In Complex Embeddings》,實(shí)驗(yàn)結(jié)果表明使用Complex embedding相較前兩種方法有較明顯的提升。
1.4 位置向量與詞向量
一般來說,可以使用向量拼接或者相加的方式,將位置向量和詞向量相結(jié)合。相當(dāng)于做了輸入數(shù)據(jù)和位置信息數(shù)據(jù)的矩陣疊加!

這里,input_embedding 是通過常規(guī)Embedding層,將每一個(gè)token的向量維度,也就是輸入維度,從數(shù)據(jù)本身的維度映射到 d_model。由于是相加關(guān)系,則 positional_encoding 也是一個(gè) d_model 維度的向量。(原論文中,d_model=512)
關(guān)于這個(gè) d_model:
在深度學(xué)習(xí)和Transformer模型的上下文中,d_model中的“d”通常代表“dimension”,即“維度”的簡寫。因此,d_model指的是模型中向量的維度大小,這是一個(gè)關(guān)鍵的參數(shù),d_model 定義了每層的大小、嵌入層的大小、自注意力機(jī)制的大小、前饋網(wǎng)絡(luò)的輸入和輸出大小。
選擇合適的d_model對模型的性能有重大影響。如果d_model太小,模型可能無法捕捉到足夠的信息;而如果d_model太大,則會(huì)增加計(jì)算成本和過擬合的風(fēng)險(xiǎn)。因此,在設(shè)計(jì)模型時(shí)需要仔細(xì)考量d_model的大小。
2 位置編碼原理
2.1 原理解析
Transformer論文中,使用正余弦函數(shù)表示絕對位置,通過兩者乘積得到相對位置。因?yàn)檎嘞液瘮?shù)具有周期性,可以很好地表示序列中單詞的相對位置。我們以Sinusoidal Positional Encoding為例,進(jìn)行講解。
首先解釋下論文中的公式,并給出對應(yīng)代碼,Positional Encoding 的公式如下:

對應(yīng)代碼實(shí)現(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)從公式中可以看出,一個(gè)詞語的位置編碼是由不同頻率的余弦函數(shù)組成的,這樣設(shè)計(jì)的好處是:pos+k 位置的 positional encoding 可以被 pos 線性表示,體現(xiàn)其相對位置關(guān)系。雖然 Sinusoidal Position Encoding 看起來很復(fù)雜,但是證明 pos+k 可以被 pos 線性表示,只需要用到高中的正弦余弦公式:

對于 pos+k 的 positional encoding:

可以看出,對于 pos+k 位置的位置向量某一維 2?? 或 2??+1 而言,可以表示為,pos 位置與 k 位置的位置向量的2?? 與 2??+1維的線性組合,這樣的線性組合意味著位置向量中蘊(yùn)含了相對位置信息。
2.2 通俗理解
最簡單直觀的加入位置信息的方式就是使用1,2,3,4,…直接對句子進(jìn)行位置編碼(one-hot)。用二進(jìn)制轉(zhuǎn)化舉個(gè)例子:

圖中維度0,維度1,維度2,維度3拼成的數(shù)字就是該位置對應(yīng)的二進(jìn)制表示。可以看到每個(gè)維度(每一列)其實(shí)都是有周期的,并且周期是不同的。具體來說,每個(gè)比特位的變化率都是不一樣的,越低位的變化越快(越往右邊走,變化頻率越快),紅色位置0和1每個(gè)數(shù)字會(huì)變化一次,而黃色位,每8個(gè)數(shù)字才會(huì)變化一次。這樣就能夠說明使用多個(gè)周期不同的周期函數(shù)組成的多維度編碼和遞增序列編碼其實(shí)是可以等價(jià)的。這也回答了為什么周期函數(shù)能夠引入位置信息。
最后,我們需要將位置向量與詞向量相結(jié)合。一般來說,可以使用向量拼接或直接相加的方式將二者結(jié)合起來。下面我們結(jié)合軸承故障數(shù)據(jù)進(jìn)行實(shí)驗(yàn)講解:
3 軸承故障數(shù)據(jù)的預(yù)處理
3.1 導(dǎo)入數(shù)據(jù)
參考之前的文章,進(jìn)行故障10分類的預(yù)處理,凱斯西儲(chǔ)大學(xué)軸承數(shù)據(jù)10分類數(shù)據(jù)集:

train_set、val_set、test_set 均為按照7:2:1劃分訓(xùn)練集、驗(yàn)證集、測試集,最后保存數(shù)據(jù)
3.2 故障數(shù)據(jù)預(yù)處理與數(shù)據(jù)集制作

4 加入位置編碼和 input_embedding 的實(shí)驗(yàn)對比
4.1 定義位置編碼PositionalEncoding 和 input_embedding

對比模型為:
- 模型 A :Transformer 編碼器層
- 模型 B :Transformer 編碼器層 + input_embedding -PositionalEncoding
4.2 西儲(chǔ)大學(xué)十分類數(shù)據(jù)集實(shí)驗(yàn)對比
(1)模型 A:

模型評估:
準(zhǔn)確率、精確率、召回率、F1 Score

(2)模型 B:

模型評估:
準(zhǔn)確率、精確率、召回率、F1 Score

4.3 東南大學(xué)齒輪箱軸承故障-五分類數(shù)據(jù)集實(shí)驗(yàn)對比
(1)模型 A:

模型評估:
準(zhǔn)確率、精確率、召回率、F1 Score

(2)模型 B:

模型評估:
準(zhǔn)確率、精確率、召回率、F1 Score

5 實(shí)驗(yàn)對比結(jié)果分析

通過兩個(gè)數(shù)據(jù)集的對比實(shí)驗(yàn),我們可以發(fā)現(xiàn),僅用Transformer 編碼器層在故障信號分類任務(wù)上取得了不錯(cuò)的效果,但是加入輸入編碼和位置編碼后,分類效果反而下降了,證明位置編碼在故障信號分類任務(wù)上作用并不是特別明顯!下一期我們將進(jìn)一步討論 Transformer 中哪些核心模塊對分類精度起著重要作用。
本文轉(zhuǎn)載自 ??建模先鋒??,作者: 小蝸愛建模

















