在本系列文章的第一部分中,我們回顧了 Transformer 的基本工作原理,初步了解了 GPT-2 的內(nèi)部結(jié)構(gòu)。在本文中,我們將詳細(xì)介紹 GPT-2 所使用的自注意力機(jī)制,并分享只包含解碼器的 transformer 模型的精彩應(yīng)用。 第二部分:圖解自注意力機(jī)制 在前面的文章中,我們用這張圖來展示了自注意力機(jī)制在處理單詞「it」的層中的應(yīng)用: 
在本節(jié)中,我們會詳細(xì)介紹該過程是如何實(shí)現(xiàn)的。請注意,我們將會以試圖弄清單個單詞被如何處理的角度來看待這個問題。這也是我們會展示許多單個向量的原因。這實(shí)際上是通過將巨型矩陣相乘來實(shí)現(xiàn)的。但是我想直觀地看看,在單詞層面上發(fā)生了什么。 自注意力機(jī)制(不使用掩模) 首先,我們將介紹原始的自注意力機(jī)制,它是在編碼器模塊里計算的。先看一個簡易的 transformer 模塊,它一次只能處理 4 個詞(token)。 自注意力機(jī)制通過以下三個主要步驟來實(shí)現(xiàn): 1. 為每個路徑創(chuàng)建查詢、鍵和值向量。 2. 對于每個輸入的詞,通過使用其查詢向量與其它所有鍵向量相乘得到注意力得分。 3. 將值向量與它們相應(yīng)的注意力得分相乘后求和 
1. 創(chuàng)建查詢、鍵和值向量 我們重點(diǎn)關(guān)注第一條路徑。我們用它的查詢值與其它所有的鍵向量進(jìn)行比較,這使得每個鍵向量都有一個對應(yīng)的注意力得分。自注意力機(jī)制的第一步就是為每個詞(token)路徑(我們暫且忽略注意力頭)計算三個向量:查詢向量、鍵向量、值向量。 
2. 注意力得分 計算出上述三個向量后,我們在第二步中只用查詢向量和鍵向量。我們重點(diǎn)關(guān)注第一個詞,將它的查詢向量與其它所有的鍵向量相乘,得到四個詞中的每個詞的注意力得分。 
3. 求和 現(xiàn)在,我們可以將注意力得分與值向量相乘。在我們對其求和后,注意力得分較高的值將在結(jié)果向量中占很大的比重。 
注意力得分越低,我們在圖中顯示的值向量就越透明。這是為了表明乘以一個小的數(shù)是如何削弱向量值的影響的。 如果我們在每一個路徑都執(zhí)行相同的操作,最終會得到一個表征每個詞的向量,它包括了這個詞的適當(dāng)?shù)纳舷挛?,然后將這些信息在 transformer 模塊中傳遞給下一個子層(前饋神經(jīng)網(wǎng)絡(luò)): 
圖解掩模自注意力機(jī)制 現(xiàn)在我們已經(jīng)介紹了 transformer 模塊中自注意力機(jī)制的步驟,接下來我們介紹掩模自注意力機(jī)制(masked self-attention)。在掩模自注意力機(jī)制中,除了第二步,其余部分與自注意力機(jī)制相同。假設(shè)模型輸入只包含兩個詞,我們正在觀察第二個詞。在這種情況下,后兩個詞都被屏蔽了。因此模型會干擾計算注意力得分的步驟?;旧?,它總是為序列中后續(xù)的詞賦予 0 分的注意力得分,因此模型不會在后續(xù)單詞上得到較高的注意力得分: 
我們通常使用注意力掩模矩陣來實(shí)現(xiàn)這種屏蔽操作。不妨想象一個由四個單詞組成的序列(例如「robot must obey orders」(機(jī)器人必須服從命令))在語言建模場景中,這個序列被分成四步進(jìn)行處理——每個單詞一步(假設(shè)現(xiàn)在每個單詞(word)都是一個詞(token))。由于這些模型都是批量執(zhí)行的,我們假設(shè)這個小型模型的批處理大小為 4,它將整個序列(包含 4 步)作為一個批處理。 
在矩陣形式中,我們通過將查詢矩陣和鍵矩陣相乘來計算注意力得分。該過程的可視化結(jié)果如下所示,下圖使用的是與單元格中該單詞相關(guān)聯(lián)的查詢(或鍵)向量,而不是單詞本身: 
在相乘之后,我們加上注意力掩模三角矩陣。它將我們想要屏蔽的單元格設(shè)置為負(fù)無窮或非常大的負(fù)數(shù)(例如,在 GPT2 中為 -10 億): 
然后,對每一行執(zhí)行 softmax 操作,從而得到我們在自注意力機(jī)制中實(shí)際使用的注意力得分: 
此分?jǐn)?shù)表的含義如下: 當(dāng)模型處理數(shù)據(jù)集中的第一個示例(第一行)時,這里只包含了一個單詞(「robot」),所以 100% 的注意力都在該單詞上。 當(dāng)模型處理數(shù)據(jù)集中的第二個示例(第二行)時,這里包含了(「robot must」),當(dāng)它處理單詞「must」時,48% 的注意力會在「robot」上,而另外 52% 的注意力會在「must」上。 以此類推 GPT-2 的掩模自注意力機(jī)制 接下來,我們將更詳細(xì)地分析 GPT-2 的掩模自注意力機(jī)制。 1. 模型評價時:一次只處理一個詞 我們可以通過掩模自注意機(jī)制的方式執(zhí)行 GPT-2。但是在模型評價時,當(dāng)我們的模型每輪迭代后只增加一個新單詞時,沿著先前已經(jīng)處理過的路徑再重新計算詞(tokrn)的自注意力是效率極低的。 在這種情況下,我們處理第一個詞(暫時忽略 <s>) 
GPT-2 保存了詞「a」的鍵向量和值向量。每個自注意力層包括了該詞相應(yīng)的鍵和值向量: 
在下一次迭代中,當(dāng)模型處理單詞「robot」時,它不再需要為詞「a」生成查詢、鍵和值向量。它只需要復(fù)用第一次迭代中保存的向量: 現(xiàn)在,在下一次迭代中,當(dāng)模型處理單詞 robot 時,它不再需要為 token「a」生成查詢、鍵和值向量。它只需要復(fù)用第一次迭代中保存的向量: 
2. GPT-2 自注意力機(jī)制:1-創(chuàng)建查詢、鍵和值 假設(shè)模型正在處理單詞「it」。對于下圖中底部的模塊來說,它對該詞的輸入則是「it」的嵌入向量 序列中第九個位置的位置編碼: 
Transformer 中的每個模塊都有自己的權(quán)重(之后會詳細(xì)分析)。我們首先看到的是用于創(chuàng)建查詢、鍵和值的權(quán)重矩陣。 
自注意力機(jī)制將它的輸入與權(quán)重矩陣相乘(并加上一個偏置向量,這里不作圖示)。 相乘后得到的向量從基本就是單詞「it」的查詢、鍵和值向量連接 的結(jié)果。 
將輸入向量和注意力權(quán)重向量相乘(之后加上偏置向量)得到這個詞的鍵、值和查詢向量。 3. GPT-2 自注意力機(jī)制:1.5-分裂成注意力頭 在前面的示例中,我們直接介紹了自注意力機(jī)制而忽略了「多頭」的部分。現(xiàn)在,對這部分概念有所了解會大有用處。自注意力機(jī)制是在查詢(Q)、鍵(K)、值(V)向量的不同部分多次進(jìn)行的?!阜至选棺⒁饬︻^指的是,簡單地將長向量重塑成矩陣形式。在小型的 GPT-2 中,有 12 個注意力頭,因此這是重塑矩陣中的第一維: 
在前面的示例中,我們介紹了一個注意力頭的情況。多個注意力頭可以想象成這樣(下圖為 12 個注意力頭中的 3 個的可視化結(jié)果): 
4. GPT-2 自注意力機(jī)制:2-計算注意力得分 我們接下來介紹計算注意力得分的過程——此時我們只關(guān)注一個注意力頭(其它注意力頭都進(jìn)行類似的操作)。 
當(dāng)前關(guān)注的詞(token)可以對與其它鍵詞的鍵向量相乘得到注意力得分(在先前迭代中的第一個注意力頭中計算得到): 5. GPT-2 自注意力機(jī)制:3-求和 正如前文所述,我們現(xiàn)在可以將每個值向量乘上它的注意力得分,然后求和,得到的是第一個注意力頭的自注意力結(jié)果: 
6. GPT-2 自注意力機(jī)制:3.5-合并多個注意力頭 我們處理多個注意力頭的方式是先將它們連接成一個向量: 
但是這個向量還不能被傳遞到下一個子層。我們首先需要將這個隱含狀態(tài)的混合向量轉(zhuǎn)變成同質(zhì)的表示形式。 7. GPT-2 自注意力機(jī)制:4-投影 我們將讓模型學(xué)習(xí)如何較好地將連接好的自注意力結(jié)果映射到一個前饋神經(jīng)網(wǎng)絡(luò)可以處理的向量。下面是我們的第二個大型權(quán)重矩陣,它將注意力頭的結(jié)果投影到自注意力子層的輸出向量中: 
通過這個操作,我們可以生成能夠傳遞給下一層的向量: 
8. GPT-2 全連神經(jīng)網(wǎng)絡(luò):第一層 在全連接神經(jīng)網(wǎng)絡(luò)中,當(dāng)自注意力機(jī)制已經(jīng)將合適的上下文包含在其表征中之后,模塊會處理它的輸入詞。它由兩層組成:第一層的大小是模型的 4 倍(因為小型 GPT-2 的大小為 768 個單元,而這個網(wǎng)絡(luò)將有 768*4=3072 個單元)。為什么是 4 倍呢?這只是原始 transformer 的運(yùn)行大?。P途S度為 512 而模型的第一層為 2048)。這似乎給 transformer 模型足夠的表征容量來處理目前面對的任務(wù)。 
9. GPT-2 全連神經(jīng)網(wǎng)絡(luò):第二層-投影到模型的維度 第二層將第一層的結(jié)果投影回模型的維度大?。ㄐ⌒?GPT-2 的大小為 768)。這個乘法結(jié)果是該詞經(jīng)過 transformer 模塊處理的結(jié)果。 
你成功處理完單詞「it」了! 我們盡可能詳細(xì)地介紹了 transformer 模塊。現(xiàn)在,你已經(jīng)基本掌握了 transformer 語言模型內(nèi)部發(fā)生的絕大部分情況了?;仡櫼幌?,一個新的輸入向量會遇到如下所示的權(quán)重矩陣: 
而且每個模塊都有自己的一組權(quán)重。另一方面,這個模型只有一個詞嵌入矩陣和一個位置編碼矩陣: 
如果你想了解模型中的所有參數(shù),下面是對它們的詳細(xì)統(tǒng)計結(jié)果: 
出于某些原因,該模型共計有 1 億 2,400 萬個參數(shù)而不是 1 億 1,700 萬個。我不確定這是為什么,但是這似乎就是發(fā)布的代碼中的數(shù)目(如果本文統(tǒng)計有誤,請讀者指正)。 第三部分:語言建模之外 只包含解碼器的 transformer 不斷地表現(xiàn)出在語言建模之外的應(yīng)用前景。在許多應(yīng)用程序中,這類模型已經(jīng)取得了成功,它可以用與上面類似的可視化圖表來描述。在文章的最后,讓我們一起來回顧一下其中的一些應(yīng)用。 機(jī)器翻譯 進(jìn)行翻譯時,模型不需要編碼器。同樣的任務(wù)可以通過一個只有解碼器的 transformer 來解決: 
自動摘要生成 這是第一個訓(xùn)練只包含解碼器的 transformer 的任務(wù)。也就是說,該模型被訓(xùn)練來閱讀維基百科的文章(沒有目錄前的開頭部分),然后生成摘要。文章實(shí)際的開頭部分被用作訓(xùn)練數(shù)據(jù)集的標(biāo)簽: 
論文使用維基百科的文章對模型進(jìn)行了訓(xùn)練,訓(xùn)練好的模型能夠生成文章的摘要: 
遷移學(xué)習(xí) 在論文「Sample Efficient Text Summarization Using a Single Pre-Trained Transformer」(https:///abs/1905.08836)中,首先使用只包含解碼器的 transformer 在語言建模任務(wù)中進(jìn)行預(yù)訓(xùn)練,然后通過調(diào)優(yōu)來完成摘要生成任務(wù)。結(jié)果表明,在數(shù)據(jù)有限的情況下,該方案比預(yù)訓(xùn)練好的編碼器-解碼器 transformer 得到了更好的效果。 GPT2 的論文也展示了對語言建模模型進(jìn)行預(yù)訓(xùn)練后取得的摘要生成效果。 音樂生成 音樂 transformer(https://magenta./music-transformer)采用了只包含解碼器的 transformer (https://magenta./music-transformer)采用了只包含解碼器的transformer) 來生成具有豐富節(jié)奏和動感的音樂。和語言建模相似,「音樂建?!咕褪亲屇P鸵砸环N無監(jiān)督的方式學(xué)習(xí)音樂,然后讓它輸出樣本(我們此前稱之為「隨機(jī)工作」)。 你可能會好奇,在這種情境下是如何表征音樂的?請記住,語言建??梢酝ㄟ^對字符、單詞(word)、或單詞(word)某個部分的詞(token)的向量表征來實(shí)現(xiàn)。面對一段音樂演奏(暫時以鋼琴為例),我們不僅要表征這些音符,還要表征速度——衡量鋼琴按鍵力度的指標(biāo)。 
一段演奏可以被表征為一系列的 one-hot 向量。一個 MIDI 文件可以被轉(zhuǎn)換成這樣的格式。論文中展示了如下所示的輸入序列的示例: 
這個輸入序列的 one-hot 向量表征如下: 
我喜歡論文中用來展示音樂 transformer 中自注意力機(jī)制的可視化圖表。我在這里加了一些注釋: 
這段作品中出現(xiàn)了反復(fù)出現(xiàn)的三角輪廓。當(dāng)前的查詢向量位于后面一個「高峰」,它關(guān)注前面所有高峰上的高音,一直到樂曲的開頭。圖中顯示了一個查詢向量(所有的注意力線來源)和正要處理的以前的記憶(突出了有更高 softmax 概率的音符)。注意力線的顏色對應(yīng)于不同的注意力頭,而寬度對應(yīng)于 softmax 概率的權(quán)重。 如果你想進(jìn)一步了解這種音符的表征,請觀看下面的視頻:https://www./watch?v=ipzR9bhei_o 結(jié)語 至此,我們的 GPT-2 的完全解讀,以及對父類模型(只包含解碼器的 transformer)的分析就到此結(jié)束了。希望讀者能通過這篇文章對自注意力機(jī)制有更好的理解。在了解了 transformer 內(nèi)部的工作原理之后,下次再遇到它,你將更加得心應(yīng)手。 |