成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對Transformer中位置編碼的可視化理解

發布于 2025-6-9 00:25
瀏覽
0收藏

了解位置編碼背后的數學原理和直覺

Transformer是一種深度學習架構,它利用注意力機制來學習數據元素之間的關系。它由一個編碼器和一個解碼器組成,與傳統的循環神經網絡(RNN)或卷積神經網絡(CNN)不同,它可以并行處理輸入序列,而不依賴于順序處理。Transformer模型的一個重要組成部分是位置編碼。這種方法能夠將位置信息添加到詞嵌入中,使模型能夠理解序列中單詞的順序。這一點至關重要,因為默認情況下,Transformer是并行處理模型,它本身并不理解語言的順序性。在本文中,我們將描述位置編碼背后的直覺。此外,我們旨在使用Python對位置編碼背后的數學概念進行可視化理解。。

位置編碼

在自然語言處理中,句子中單詞的位置或順序非常重要,因為它規定了句子的語法和語義。循環神經網絡(RNN)按順序處理句子,這使它們能夠考慮單詞的順序。然而,這種順序處理存在一些缺點。它可能會使訓練RNN的計算成本很高,特別是對于長句子。此外,RNN可能會受到梯度消失問題的影響,即在網絡處理更多單詞時,句子前面部分的信息會被稀釋或丟失。

相反,Transformer架構使用多頭自注意力機制,這使得它能夠同時處理句子中的所有單詞,而不是按順序處理。這種并行處理可以使訓練過程更快,并且不太容易受到梯度消失問題的影響。然而,由于所有單詞都是同時處理的,Transformer模型無法感知句子中單詞的順序,因此它需要一個額外的機制來跟蹤單詞的順序。

位置編碼是一種將單詞順序信息注入Transformer模型的關鍵機制。圖1顯示了位置編碼在Transformer架構中的位置。它分別應用于輸入和輸出嵌入,在它們進入編碼器和解碼器之前。

對Transformer中位置編碼的可視化理解-AI.x社區

它向每個嵌入添加一個向量,該向量表示單詞在句子中的位置,如圖2所示。輸入句子首先進行分詞,也就是說,它被分解為單個單詞或子詞單元。然后,每個詞元被轉換為一個嵌入向量,該向量表示該詞元的含義。接下來,對于每個詞元,生成一個位置編碼向量。這個向量僅由詞元在句子中的位置決定,因此,不同的位置會得到不同的唯一向量。

對Transformer中位置編碼的可視化理解-AI.x社區

嵌入向量和相應的位置編碼向量按元素相加。結果是一個具有位置感知的嵌入向量,它同時攜帶了詞元的含義和位置信息。這些具有位置感知的向量隨后被發送到Transformer的編碼器和解碼器部分(圖1)。

現在讓我們看看位置編碼是如何定義的。我們知道位置編碼是一個添加到詞元嵌入向量的向量。因此,它們應該具有相同數量的元素。讓我們假設嵌入向量的維度是一個由??d_model???表示的偶數。所以,位置編碼向量將具有相同的維度。假設??pos??是一個整數變量,表示序列中詞元的位置。我們還假設它從0開始(圖3)。

對Transformer中位置編碼的可視化理解-AI.x社區

設??PE_pos???為位置??pos???處詞元的位置編碼向量。我們知道它是一個具有??d_model???個元素的向量。假設??j???是這個向量中元素的索引,并且讓??j???從0開始。現在,??PE_pos???在索引??j = 2i???和??j = 2i + 1??處的元素定義如下:

對Transformer中位置編碼的可視化理解-AI.x社區

由于??j???從0開始,??i??的范圍是(0 \dots d_{model}/2 - 1)。使用這些公式,我們現在可以為詞元創建整個位置編碼向量:

對Transformer中位置編碼的可視化理解-AI.x社區

但是為什么我們要使用三角函數來構建位置編碼向量呢?為什么我們要在這個向量中配對正弦和余弦函數呢?三角函數具有周期性,這意味著它們在規則的間隔內重復其值。周期性可以用來設計一個計數器。

老式的汽油泵通常配備機械計數器來顯示已分配的燃油量。這些計數器使用齒輪和輪子等物理機制來跟蹤燃油流量,以加侖或升為單位顯示總量。計數器本身通常有一系列旋轉的輪子,其邊緣標有數字0到9。最右邊的輪子在每次事件發生時移動一個增量。當它完成一次旋轉時,它會回到0,但會使左邊的下一個輪子移動一個增量(圖4)。同樣,當每個輪子達到9并移動到0時,左邊相鄰的輪子會移動一個增量。因此,每個輪子在從9回到0時都表現出周期性行為。

對Transformer中位置編碼的可視化理解-AI.x社區

圖5展示了一個類似的機械計數器機制,其中使用指針而不是輪子來顯示每個數字。當然,所有指針都同時移動,類似于時鐘的指針。然而,每個指針的移動速度都比左邊相鄰的指針快。當每個指針完成一次旋轉并回到0時,左邊的下一個指針會移動一個增量。

對Transformer中位置編碼的可視化理解-AI.x社區

公式2中的位置編碼向量實現了一種類似的機制來對序列中的詞元進行計數。為了理解這種機制,我們首先繪制一個以原點為中心、半徑為1的單位圓,如圖6所示。

設(p_x)和(p_y)表示單位圓上一點(p)的坐標,并且設從原點到(p)的射線與正(x)軸形成一個角度(\theta)。現在我們可以使用(\theta)來找到(p)的坐標:

對Transformer中位置編碼的可視化理解-AI.x社區

對Transformer中位置編碼的可視化理解-AI.x社區

我們現在可以使用這個概念來理解位置編碼公式。在公式1中,每對余弦和正弦函數可以表示單位圓上一個點的位置(圖7)。因此,位置編碼向量在某種程度上類似于圖5中所示的機械計數器。在這里,每對正弦和余弦函數扮演著圖5中指針的角色。

對Transformer中位置編碼的可視化理解-AI.x社區

現在我們已經理解了位置編碼,我們可以在Python中實現它。清單1中的??positional_encoding()???函數創建給定序列的位置編碼向量。請注意,我們只需要知道序列的長度(由??max_len???表示的詞元數量)和嵌入向量的維度(??d_model??),就可以創建公式1中的位置編碼向量。詞元本身及其相應的嵌入向量不會改變位置編碼向量。

# 清單1
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle

def positional_encoding(d_model, max_len):
    pos_arr = np.arange(0, max_len).reshape(-1, 1)
    i_arr = np.arange(0, d_model, 2)
    w = 1 / 10000**(2*i_arr/d_model)
    pe = np.zeros((max_len, d_model))
    pe[:, 0::2] = np.sin(pos_arr*w)
    pe[:, 1::2] = np.cos(pos_arr*w)
    return pe

接下來,我們可以使用這個函數來創建一個有5個詞元且??d_model = 6??的序列的位置編碼向量。

# 清單2
pe = positional_encoding(6, 5)
np.round(pe, 4)

array([[ 0.    ,  1.    ,  0.    ,  1.    ,  0.    ,  1.    ],
       [ 0.8415,  0.5403,  0.0022,  1.    ,  0.    ,  1.    ],
       [ 0.9093, -0.4161,  0.0043,  1.    ,  0.    ,  1.    ],
       [ 0.1411, -0.99  ,  0.0065,  1.    ,  0.    ,  1.    ],
       [-0.7568, -0.6536,  0.0086,  1.    ,  0.    ,  1.    ]])

??positional_encoding()???的輸出是一個二維數組,其中每一行給出了序列中一個詞元的位置編碼向量。清單3可視化了一個長度為7且??d_model = 20??的給定序列的位置編碼向量。我們采用與圖7相同的可視化方法,結果如圖8所示。

# 清單3
d_model = 20
max_len = 7
pe = positional_encoding(d_model, max_len)
fig, ax = plt.subplots(nrows=max_len, ncols=int(d_model/2),
                       figsize=(12, 11), sharex=True,sharey=True)
fig.subplots_adjust(wspace=0.1, hspace=0.005)
ax = ax.flatten()
r_array = np.arange(1, d_model/2+1)
i = 0
for token in pe:
    points = token.reshape(-1,2)
    for j in range(len(points)):
        ax[i].axhline(0, color='grey', linewidth=0.5)
        ax[i].axvline(0, color='grey', linewidth=0.5)
        circle = Circle((0, 0), 1, facecolor='none',
                        edgecolor='black', linewidth=0.5)
        ax[i].add_patch(circle)
        ax[i].scatter(points[j, 0], points[j,1], s=15)
        ax[i].set_aspect('equal')
        ax[i].set_aspect('equal')
        i += 1
for i in range(0, max_len):
    ax[i*int(d_model/2)].set_ylabel('Pos='+str(i), labelpad=20,
                                     fnotallow=10, rotatinotallow=0)
for i in range(0, int(d_model/2)):
    ax[i].set_title('j={},{}'.format(2*i, 2*i+1), pad=12, fnotallow=10)
plt.show()

對Transformer中位置編碼的可視化理解-AI.x社區

如你所見,它是一個由圓圈組成的二維數組。這個數組中的每一行代表一個詞元的位置編碼向量。因此,第一行代表第一個詞元(??Pos=0???),第二行代表第二個詞元(??Pos=1???),依此類推。在每一行中,我們有10個圓圈(因為??d_model = 20???),并且每個圓圈代表位置編碼向量中的一對正弦和余弦函數(參考圖7)。例如,最左邊一列的圓圈代表詞元位置編碼向量的前兩個元素(圖7中??j = 0,1???),最左邊最后一列的圓圈代表這個向量的最后兩個元素(圖7中??j = d_model - 2, d_model - 1??)。

我們還觀察到,隨著詞元位置(??pos???)的增加,第一個圓圈上的點(對應于??j = 0,1???)開始移動,并且它的移動速度比第二個圓圈上的點(對應于??j = 2,3???)快。實際上,在每一列中,圓圈上的點的移動速度都比右邊相鄰列的點快。這是因為在公式1中,正弦和余弦參數與??i???成反比,并且增加??i??會降低正弦和余弦函數的頻率。

位置編碼的數學性質

公式2中定義的位置編碼向量具有一些有趣的數學性質,我們將在本節中討論。首先,讓我們計算位置編碼向量的長度。像

對Transformer中位置編碼的可視化理解-AI.x社區

這樣的向量的長度定義為:

對Transformer中位置編碼的可視化理解-AI.x社區

現在,我們可以計算位置編碼向量的長度,如公式2所示:

對Transformer中位置編碼的可視化理解-AI.x社區

其中使用了以下三角恒等式來推導公式3:

對Transformer中位置編碼的可視化理解-AI.x社區

結果表明,位置編碼向量的長度與??pos??無關,并且對于所有詞元都是相同的。由于所有向量的長度都相同,重要的是它們之間的角度。假設我們有兩個向量(\mathbf{u})和(\mathbf{v}),它們之間的角度是(\theta)。那么有:

對Transformer中位置編碼的可視化理解-AI.x社區

這里,(\mathbf{u} \cdot \mathbf{v})是(\mathbf{u})和(\mathbf{v})的點積,也可以寫成

對Transformer中位置編碼的可視化理解-AI.x社區

其中(\mathbf{u}^T)是(\mathbf{u})的轉置。(\cos(\theta))項稱為向量(\mathbf{u})和(\mathbf{v})的余弦相似度。現在,我們可以計算

對Transformer中位置編碼的可視化理解-AI.x社區

我們從公式4開始:

對Transformer中位置編碼的可視化理解-AI.x社區

為了計算這個公式的分子,我們可以寫:

對Transformer中位置編碼的可視化理解-AI.x社區

這個結果可以使用和差化積恒等式進行簡化:

對Transformer中位置編碼的可視化理解-AI.x社區

得到:

對Transformer中位置編碼的可視化理解-AI.x社區

我們得出結論,公式5的分子與??pos???無關。我們還看到它的分母與??pos???無關。因此,??PE_pos???和??PE_(pos + k)???之間的角度僅取決于??k???和??d_model???,而與??pos??無關:

對Transformer中位置編碼的可視化理解-AI.x社區

這意味著,對于給定的(k)值,(PE_{pos})和(PE_{(pos + k)})之間的夾角始終保持不變,而與(pos)的值無關。讓我們來看一個例子以闡明這些結論。清單4將一個長度為12且(d_model = 2)的給定序列的位置編碼向量進行了可視化呈現。在這種情況下,每個詞元的位置編碼向量僅由兩個元素組成,這使得整個向量可以表示為單位圓上的一個點。這次,所有詞元對應的點都繪制在同一個圓上。結果如圖9所示。

# 清單4
margin = 0.03
pe = positional_encoding(2, 12)  
fig = plt.figure(figsize=(7,7))
ax = fig.add_subplot(1, 1, 1) 
circle = Circle((0, 0), 1, facecolor='none', edgecolor='black', linewidth=0.5)
ax.add_patch(circle)
for i in range(len(pe)):
    plt.scatter(pe[i, 0], pe[i,1], s=50, label=str(i))
    plt.plot([0, pe[i, 0]],[0,pe[i,1]])
    plt.text(pe[i, 0]+margin, pe[i,1]+margin, "PE"+str(i), fnotallow=14)
ax.set_aspect('equal')
plt.xlim([-1.2, 1.2])
plt.ylim([-1.2, 1.2])
plt.show()

對Transformer中位置編碼的可視化理解-AI.x社區

對于每一個位置編碼向量,我們可以看到:

對Transformer中位置編碼的可視化理解-AI.x社區

我們還發現,對于所有的(pos)值,(PE_{pos})和(PE_{(pos + k)})之間的夾角都是相同的。例如,(PE_0)和(PE_1)之間的夾角與(PE_3)和(PE_4)之間的夾角是一樣的。同樣,(PE_0)和(PE_2)之間的夾角等于(PE_1)和(PE_3)之間的夾角。當(d_model>2)時,我們無法繪制位置編碼向量。然而,本節中得到的結論仍然是有效的。

(PE_{pos})和(PE_{(pos + k)})之間的夾角取決于(k)且與(pos)無關這一事實,使得Transformer模型能夠通過相對位置來學習關注。例如,當前詞元與下一個詞元之間的夾角總是相同的,無論當前詞元的位置或者整個序列的長度如何。以下是引入Transformer模型的原始論文[1]中的一段引用:

對Transformer中位置編碼的可視化理解-AI.x社區

但是這句話的數學含義是什么呢?假設我們有公式2中給出的位置編碼向量。我們知道這個向量有(d_model)個元素。現在,基于上述結論,存在一個(d_model×d_model)的矩陣(M_k),它取決于(k)(以及(d_model)),但與(pos)無關,并且滿足以下等式:

對Transformer中位置編碼的可視化理解-AI.x社區

這個矩陣就是上述引用中提到的線性函數。我們可以很容易地證明,這個結論也可以推導出公式6。實際上,公式7表明,對于給定的(k)值,(PE_{pos})和(PE_{(pos + k)})之間的夾角保持不變,而與(pos)的值無關。在公式7中,(M_k)是一個旋轉矩陣,它將(PE_{pos})旋轉一定的角度(該角度取決于(k)),并將其轉換為(PE_{pos + k})。圖10展示了一個例子。在這里,矩陣(M_2)將(PE_0)旋轉到(PE_2)。由于這個矩陣與(pos)無關,它會以相同的角度旋轉任何其他位置編碼向量。例如,它以相同的角度旋轉(PE_3)來得到(PE_5)。因此,(PE_{pos})和(PE_{pos + 2})之間的夾角總是相同的。

對Transformer中位置編碼的可視化理解-AI.x社區

清單5創建了一個熱圖,展示了一個長度為20且(d_model = 64)的給定序列中所有位置編碼向量的成對點積。該熱圖如圖9所示。

# 清單5
pe = positional_encoding(64, 20)  
dist = pe @ pe.T
plt.imshow(dist, cmap='jet', interpolatinotallow='nearest')  
plt.colorbar()
plt.title('Heatmap of Pairwise Dot Products')
plt.xlabel('Pos')
plt.ylabel('Pos')
plt.xticks(np.arange(0, 20, step=2))
plt.yticks(np.arange(0, 20, step=2))
plt.show()

對Transformer中位置編碼的可視化理解-AI.x社區

這個熱圖是公式6的一種體現。由于所有的位置編碼向量長度相同,我們從公式5可以得出:

對Transformer中位置編碼的可視化理解-AI.x社區

因此,一對位置編碼向量的點積與它們之間的夾角成反比(因為(\cos(\theta))與(\theta)成反比)。我們可以看到,熱圖矩陣中每條對角線上的元素顏色是相同的。這是因為對于特定的(k)值,(PE_{pos})和(PE_{(pos + k)})之間的夾角保持不變,所以它們的點積也不變。如圖12所示,每條對角線代表一個特定的(k)值。

對Transformer中位置編碼的可視化理解-AI.x社區

這個熱圖還有另一個有趣的特征。當兩個詞元的位置距離變遠時,我們預期它們的位置編碼向量之間的夾角會增大,而它們的點積會減小(點積與(\cos(\theta))成正比,而(\cos(\theta))與(\theta)成反比)。然而,熱圖顯示,兩個詞元的位置編碼向量的點積并不總是隨著它們位置距離的變遠而減小。

圖13展示了一個例子。如果我們沿著熱圖矩陣的第一行觀察,點積呈現出周期性變化,并且會表現出振蕩行為。這意味著這些向量之間的夾角會反復增大和減小。這可能看起來有悖直覺,但原因在于正弦和余弦函數的周期性。

對Transformer中位置編碼的可視化理解-AI.x社區

為了解釋原因,我們繪制了圖8中位置編碼向量的成對點積的熱圖,其中序列長度為7,且(d_model = 20)。在這里,對應于((j = 0,1))的圓上的點移動得很快。在(PE_3)中,這個點與它在(PE_0)中的原始位置相距很遠,因此,(PE_0)和(PE_3)的點積很小(向量之間的夾角很大)。然而,在(PE_6)中,這個點幾乎回到了它的原始位置,而第二個圓((j = 2,3))上的點并沒有移動那么多。結果,(PE_0)和(PE_6)之間的夾角變小了,并且它們的點積相比(PE_0)和(PE_3)的點積增大了。

對Transformer中位置編碼的可視化理解-AI.x社區

增大(d_model)可以減輕這種周期性行為。圖15展示了一個長度為20且(d_model = 512)的給定序列中所有位置編碼向量的成對點積的熱圖。現在,當兩個向量的(pos)差值增大時,它們的點積會持續減小。

對Transformer中位置編碼的可視化理解-AI.x社區

參考文獻

[1] Vaswani, Ashish; Shazeer, Noam; Parmar, Niki; Uszkoreit, Jakob; Jones, Llion; Gomez, Aidan N; Kaiser, ?ukasz; Polosukhin, Illia. 2017.Attention is All you Need .In Advances in Neural Information Processing Systems . Vol. 30. Curran Associates, Inc.arXiv :1706.03762.

本文轉載自????柏企閱文???,作者:tailet

收藏
回復
舉報
回復
相關推薦
主站蜘蛛池模板: 日韩高清中文字幕 | av毛片在线免费观看 | 精品国产乱码久久久久久图片 | 国产高清视频一区二区 | 色吧久久 | 精品一区二区av | 天天色天天射天天干 | 国产精品视频一区二区三区四蜜臂 | 手机av在线 | 黄色一级毛片 | 在线免费观看成人 | 国产精品国产精品国产专区不卡 | 精品一区二区三区日本 | 欧美a级成人淫片免费看 | 成人在线免费视频观看 | 欧美久 | 91欧美| 亚洲精品在线视频 | 精品在线播放 | 国产999精品久久久久久 | 成年人在线观看视频 | 欧美成人免费在线 | 精品亚洲国产成av人片传媒 | 噜噜噜噜狠狠狠7777视频 | 成年人黄色小视频 | 亚洲乱码一区二区三区在线观看 | 亚洲综合色站 | 秋霞国产 | 中文字幕 欧美 日韩 | 黄a网站| 日韩网站免费观看 | 日韩成人av在线 | 欧洲成人免费视频 | 精品无码久久久久久国产 | 亚洲精品在线播放 | 成人免费视频观看 | 伊色综合久久之综合久久 | 人人人干 | 久久尤物免费一区二区三区 | 亚洲欧美视频 | 超碰97人人人人人蜜桃 |