首頁 > 易卦

自注意力中的不同的掩碼介紹以及他們是如何工作的?

作者:由 deephub 發表于 易卦日期:2023-01-14

掩碼是怎麼確認的

在研究自注意力時,有很多的名詞需要我們著重的關注,比如填充掩碼,前瞻掩碼等等,但網上沒有太多注意力掩碼的教程和它是如何工作的資訊,另外還有以下的細節需要詳細的解釋:

為什麼要對多個層應用注意力掩碼?、

為什麼不沿鍵和查詢應用注意力掩碼?

鍵、查詢和值權重是否混淆了原始矩陣的序列順序?

所以本篇文章將透過寫出矩陣來檢視這些問題的細節。這樣可以對掩碼的工作原理有更好的瞭解。除此以外還可以連線到線性層是如何跨二維工作的,這樣可以解決上面第三點的疑問。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

問題定義

讓我們從一個有 4 個單詞的矩陣 X 開始。 當這些詞被轉換成它們的令牌嵌入,每個令牌的嵌入大小將是 3 個值。 例如下面是我們的句子:

“a b c D”

現在讓我們把這些詞變成令牌。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

向量a b c D各有3個分量,這個序列本質上是由4個令牌符號組成的。每個令牌是3個值的向量。我們把這些符號變成一個矩陣X。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

X是由向量a、b、c和D組成的4 × 3矩陣這是我們想要用自注意力來轉化的矩陣。

注意力計算前的準備

為了準備注意力,我們必須首先使用加權矩陣生成鍵K、查詢Q和值V。對於這個句子,我們想把它轉換成一個4 * 2矩陣。所以每個權重矩陣的形狀都是3或2。例如下面是Q的權值矩陣QW。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

將X矩陣轉換為Q(查詢)矩陣的權重,下面是利用QW矩陣可以得到查詢矩陣Q。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

計算的過程如下

自注意力中的不同的掩碼介紹以及他們是如何工作的?

現在我們有了 Q 的表示。注意力結果矩陣中的每個向量不是所有其他令牌的線性組合。 而每個向量都是其自身和一些權重的線性組合。 第一個向量只是 a 的線性組合。 第二個只是b的線性組合。 這種轉換不會弄亂矩陣內的序列順序。 a 仍然在矩陣的頂部,而 D 仍然在矩陣的底部。 對於未來的操作,我將使用最右邊的矩陣來表示 Q ,這樣輕鬆地視覺化 a、b、c 和 D 的向量,並且也可以說明這些向量是沒有被轉換為彼此相結合的某種組合。

對於K和V也是類似的,所以我們得到了從X矩陣和相應矩陣權重計算的K,Q,V

自注意力中的不同的掩碼介紹以及他們是如何工作的?

現在我們來計算這個序列的注意力。

QK矩陣

最原始的自注意力是用下面的公式來定義的

自注意力中的不同的掩碼介紹以及他們是如何工作的?

為了更容易地視覺化發生了什麼,我將刪除d常數。《The Attention is All You Need 》的作者宣告,使用標量d是因為“我們懷疑對於d的大值,點積的量級變大,將softmax函式推到具有非常小的梯度的區域“。所以d只是一個幫助數值量級轉換的標量,所以在本文中不用不關心它,那麼可以使用下面的公式來代替,也就是把d刪除了

自注意力中的不同的掩碼介紹以及他們是如何工作的?

但是本文中是討論的掩碼遮蔽,這時等式就有點不同了,我將在接下來的部分中解釋。

首先QK矩陣計算如下。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

看很複雜,但是這個其實是由Q和K轉置相乘得到的矩陣,我們可以把它化簡成向量積的形式。並且令牌行和列,這樣以幫助視覺化矩陣表示的內容。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

這樣是不是就好很多了,每個值基本上都乘以另一個值,包括矩陣中的自己。這個值表示當將V應用到這個矩陣時V中的每個分量將得到多少權重。

不帶掩碼的注意力

在學習如何掩碼注意力之前,我們首先需要檢視沒有掩碼的注意力是如何工作的。

計算序列注意力的下一步是對QK矩陣應用softmax函式。那麼就出現了一個問題,softmax應該應用在什麼維度上?在論文提出的自注意力中,softmax函式應用於每一行。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

在沒有掩碼的情況下,softmax函式只是一個歸一化函式。所以為了減少視覺化的複雜度,我們可以不在這個矩陣中表示它。

現在只剩下最後一步了,將QK矩陣乘以V矩陣。QK矩陣與V矩陣乘積就得到了子注意力計算的結果。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

矩陣中的每個編碼是QK矩陣中的值和權重的線性組合。實際上得到的矩陣中的每一行都是QK矩陣中的相應行和V矩陣中的相應列的線性組合。不帶掩碼的注意力模組的輸出可以理解為讓每個令牌注意所有其他令牌。這意味著每一個令牌對所有其他令牌都有影響。

對得到的矩陣也重新格式化一下:

自注意力中的不同的掩碼介紹以及他們是如何工作的?

QK矩陣與V矩陣乘積的向量表示,注意力轉換本質上產生了一組新的向量,序列中的每個單詞對應一個向量。

注意力的填充掩碼

在使用填充掩碼(padding mask)計算注意力之前,我們需要將掩碼 M 新增到等式中:

自注意力中的不同的掩碼介紹以及他們是如何工作的?

我們已經有了QK和V,但是M是什麼樣的呢?我們的序列是

“ a b c D ”

用一個更實際的例子替換這些任意:

I like coffee

注意這裡有一個PAD令牌。這個令牌出現的原因是,句子的長度是變化的而矩陣並不能處理不同的大小。所以為了把很多句子放在一起作為一批處理,可以在較短句子中新增令牌,使所有句子的長度相同。

但是使用PAD令牌的一個問題是PAD成為句子中最頻繁出現的部分。而訓練時模型會注意到這一點,並錯誤的認為PAD是句子的基礎,這樣就會產生很多問題。

為了防止模型對 PAD令牌進行建模,我們可以透過找到 QK 矩陣中PAD位置並進行遮蔽的方法來實現。 如上例所示,D 是一個PAD令牌,如果我們想要遮蔽它則需要使用與 QK 具有相同維度的掩碼,並在表示在要掩碼的列上使用 -∞。 M矩陣將如下所示:

自注意力中的不同的掩碼介紹以及他們是如何工作的?

填充掩碼的矩陣表示中 D 列是被遮蔽的,但 DQ 行不是。 下一步是將M新增到QK

自注意力中的不同的掩碼介紹以及他們是如何工作的?

任何數值與-∞ 相加結果都變為 -∞,所以結果列 D 是 -∞ 列。 那麼當 softmax 應用於矩陣時會發生什麼?

自注意力中的不同的掩碼介紹以及他們是如何工作的?

Softmax後D都是0,基本上不會影響權重矩陣中其他值的權重。 這裡的D 不是其他行的一部分,而是僅在其自己的 DQ 行中。 這裡我們不會擔心非∞ 值的 softmax ,因為該函式只是起到歸一化的作用。 最後讓我們看看將權重矩陣乘以 V 矩陣時得到的矩陣的樣子。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

透過將遮蔽QK矩陣與V矩陣相乘得到最終的自注意力結果,讓我們仔細看看最終的矩陣。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

結果矩陣中的每一行如何沒有 D 分量。所以D對任何其他元素都沒有影響,這意味著任何PAD令牌(這裡的D)對序列的其餘部分都沒有影響。這就是使用對填充進行掩碼的原因:不希望它影響序列中的任何其他令牌。

那麼DQ 呢,它仍然存在並且沒有被遮蔽掉。這是因為如果 DQ 被遮蔽了,矩陣中的 DQ 向量將在應用 softmax 變換後產生一個均勻值的向量,也就是說 DQ 將丟失它之前擁有的所有資訊。而我們進行掩碼遮蔽的目的不是完全去除 D 的所有資訊而是讓它不影響其他令牌。所以在結果矩陣中仍然需要關於 D 的資訊,也就是說我們要告訴模型的是那裡有一個PAD令牌,我們只希望PAD令牌不與其他的令牌令牌產生影響,但是PAD令牌的位置和資訊模型還是要知道的。

那麼如果同時遮蔽了 DQ 和 D,生成的矩陣將如下所示:

自注意力中的不同的掩碼介紹以及他們是如何工作的?

填充掩碼同時覆蓋DQ和D時的結果可以看到,由於 DQ 和 D 是常數,因此它們不會對結果增加太多。 但是矩陣最後一部分的結果向量只是 V 的 1/4 加權分量的組合。 這會導致 D 丟失其自身的所有資訊,這也意味著結果向量中 D 的新表示將是 D 的的一個糟糕的表示方式。

注意力的前瞻掩碼

Look-ahead mask (前瞻掩碼)最初來自 Attention is All You Need的論文。使用前瞻掩碼的目的是一次在整個文字序列上訓練模型而不是一次訓練一個單詞。原始的 Transformer 模型就是所謂的自迴歸模型,它僅使用過去的資料進行預測。因為最初的Transformer 是為翻譯而製作的,所以這種型別的模型是有意義的。在預測翻譯後的句子時,模型會一次預測一個單詞。比如:

“How are you”

該模型一次將句子翻譯成西班牙語:

預測1:給定“”,模型預測下一個詞是“cómo”

預測 2:給定“cómo”,模型預測下一個詞是“estás”

預測 3:給定“cómo estás”,模型預測下一個詞是“”,表示序列的結束

如果想讓模型學習這種翻譯怎麼辦?如果一次輸入一個詞,則需要輸入三次並且做三次的預測,這個過程非常緩慢,因為它需要模型的 S(序列長度)個預測才能從模型中獲得單句翻譯。但是如果將整個句子“cómo estás 。。。”提供給它,並使用巧妙的掩碼技巧,讓模型就不能向前看到未來的令牌,只能看到過去的令牌。這樣,只需要一個推理步驟就能從模型中獲得整個句子的翻譯。這就是Look-ahead mask 的由來,所以我們這裡將他翻譯為前瞻掩碼。

使用前瞻掩碼進行自注意力的公式與填充掩碼相同。唯一的變化與掩碼有關。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

前瞻掩碼的矩陣在右上角有一個三角形 -∞,在其他地方是 0。 讓我們看看這如何影響權重矩陣的 softmax。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

使用前瞻掩碼的掩碼查詢鍵矩陣的 Softmax時,權重矩陣會得到一些有趣的結果。 第一行 aQ 僅由自身 a 加權。 由於 a 是序列中的第一個令牌,因此它不應受到序列中任何其他令牌的影響,沒有不存在其他令牌。

在第二行,b 同時受到 a 和 b 的影響。 由於 b 是第二個令牌,它應該只受第一個令牌 a 的影響。

同理在最後一行中,序列中的最後一個令牌 D 受到所有其他令牌的影響,因為它是序列中的最後一個令牌,應該具有序列中所有其他令牌的上下文。

讓我們看看掩碼如何影響注意力函式的輸出。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

使用前瞻掩碼時自注意力的最終結果,與權重矩陣類似,結果向量僅受該向量中表示的令牌之前的令牌的影響。 a 的新令牌嵌入在結果向量的第一行。 由於這個令牌只有它自己的上下文,它只會是它自己的組合。

第二個令牌 b 具有 a 的上下文,因此結果向量是 a 和 b 的組合。

最後一個令牌 D 具有所有其他令牌的上下文,因此結果向量是所有其他令牌的組合。

矩陣結果對比

為了視覺化生成的矩陣有何不同,我將他們放在一起,下圖是使用 no mask、padding mask 和 look-ahead mask 時的 self-attention 函式的最終結果

自注意力中的不同的掩碼介紹以及他們是如何工作的?

在多層中使用掩碼

最後一點要說明的是為什麼要在多層中使用相同的掩碼。如果你仔細看了矩陣就會發現。

首先注意力函式時可以總結為從矩陣X到矩陣a的一個單一變換。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

矩陣間的自注意力變換

自注意力中的不同的掩碼介紹以及他們是如何工作的?

向量的向量之間的自注意力變換

上面已經講過了,自注意力轉換保留了每個向量的上下文。輸出序列只是輸入序列的形式變換。

假設我們想要遮蔽所有PAD令牌,並且我們認為上面問題定義中的D 是一個PAD令牌。 那麼輸出 D 仍然是一個 PAD令牌,只是這個令牌已經被表示為一個轉換後的嵌入了。 所以任何正在進行的自注意力都需要一個掩碼來確保 PAD令牌不會影響任何其他令牌。

我們甚至可以把一個transformer想象成一系列的self-attention函式。 線性層和歸一化層不會弄亂令牌之間的序列關係,所以在本例中可以忽略不計。

自注意力中的不同的掩碼介紹以及他們是如何工作的?

向量的向量之間的多重自注意力轉換,由於保留了自注意力層之間的序列,每個自注意力函式都需要使用相同的掩碼。 在填充掩碼的例子中,如果 掩碼只用在第一個自注意力層上,那麼序列將不受第一個自注意力層中的PAD令牌的影響。 而在所有其他層中因為缺少掩碼序列將會受到PAD令牌的影響,這樣就會產生糟糕的結果。

總結

注意力掩碼本質上是一種阻止模型看我們不想讓它看的資訊的方法。這不是一種非常複雜的方法,但是它卻非常有效。我希望這篇文章能讓你更好地理解掩碼在自注意力中的作用,希望以上的矩陣計算是正確的,如果有錯誤,歡迎指出。

https://avoid。overfit。cn/post/1042640faa8249da92e405db1cbc3738

作者:Gabriel Mongaras