來源:github、大數(shù)據(jù)文摘 編譯:大白、小七、池俊輝、Andy 今年,我們見識(shí)了許多令人眼花繚亂的機(jī)器學(xué)習(xí)的應(yīng)用成果。其中OpenAI訓(xùn)練的GPT-2模型就展示出了驚艷的能力,它能夠撰寫出連貫而富有激情的論文,比當(dāng)下其他所有的語(yǔ)言模型寫的都好。 GPT-2其實(shí)并不是一種特別新穎的架構(gòu),它的架構(gòu)非常類似于Transformer模型的Decoder結(jié)構(gòu)。然而,GPT2是一個(gè)非常大的基于Transformer的語(yǔ)言模型,需要基于大量數(shù)據(jù)集進(jìn)行訓(xùn)練。在這篇文章中,我們將介紹什么樣的結(jié)構(gòu)能夠讓模型產(chǎn)生好的結(jié)果,深入研究模型中的self-attention層,此外,我們將研究除語(yǔ)言建模之外的Transformer模型Decoder結(jié)構(gòu)的應(yīng)用。 我寫本文主要是為了補(bǔ)充我之前的“圖解Transformer模型”系列。 系列鏈接: 通過圖解的方式更直觀地解釋Transformer模型的內(nèi)部工作原理,以及它們自發(fā)布以來的演變過程。我希望通過這種圖形示例能夠更容易地解釋后來基于Transformer的模型,畢竟它們的內(nèi)部工作原理是在不斷發(fā)展的。 本文主要從以下幾方面展開闡述 第一部分:GPT2和語(yǔ)言建模 語(yǔ)言模型的含義 用于語(yǔ)言建模的Transformers模型 與BERT的區(qū)別 Transformer 架構(gòu)的演變 速成課程:探索GPT-2內(nèi)部工作原理 深入了解內(nèi)幕 GPT-2小結(jié) 第二部分:圖解Self-Attention(自我關(guān)注)模型 自注意力(Self-Attention,不加mask)
圖解Masked Self-Attention GPT-2的Masked Self-Attention 你做到了! 第三部分:語(yǔ)言建模番外 機(jī)器翻譯 生成摘要 遷移學(xué)習(xí) 音樂生成 結(jié)論
第一部分 GPT2和語(yǔ)言模型 那么究竟什么是語(yǔ)言模型呢? 語(yǔ)言模型的含義 在The Illustrated Word2vec中,我們研究了語(yǔ)言模型是什么,它是能根據(jù)一個(gè)句子前半部分的單詞預(yù)測(cè)出下一個(gè)單詞的機(jī)器學(xué)習(xí)模型。最著名的語(yǔ)言模型是智能手機(jī)鍵盤,可以根據(jù)您當(dāng)前鍵入的內(nèi)容建議出下一個(gè)單詞。 The Illustrated Word2vec: 從這個(gè)意義上講,我們可以說GPT-2基本上是鍵盤應(yīng)用程序的下一個(gè)單詞預(yù)測(cè)功能,但它比你手機(jī)上的鍵盤輸入法具有更大更復(fù)雜的功能。GPT-2是基于一個(gè)名為WebText大型數(shù)據(jù)集進(jìn)行的訓(xùn)練,這個(gè)數(shù)據(jù)集大約有40G,是OpenAI研究人員為了研究從互聯(lián)網(wǎng)上爬下來的。就存儲(chǔ)大小來說,我使用的鍵盤應(yīng)用程序SwiftKey占用了78MB的空間。訓(xùn)練出來的GPT-2的最小變體,占用500MB的存儲(chǔ)空間來存儲(chǔ)其所有參數(shù)。GPT-2的最大變體是最小變體的13倍,因此它可能需要占用超過6.5 GB的存儲(chǔ)空間。 使用AllenAI GPT-2 Explorer來進(jìn)行GPT-2建模是一個(gè)很好的方法,它使用GPT-2顯示10個(gè)對(duì)下一個(gè)單詞的預(yù)測(cè)結(jié)果,以及它們的概率分?jǐn)?shù)。您可以選擇其中一個(gè)單詞,然后再查看下一個(gè)預(yù)測(cè)列表,循序漸進(jìn),持續(xù)不斷地寫下去。 用于語(yǔ)言建模的Transformers模型 正如我們?cè)凇皥D解Transformer模型”中看到的那樣,原始的 transformer模型由encoder和decoder組成,每個(gè)都是我們稱之為 transformer 架構(gòu)的堆棧。這種架構(gòu)是合理的,因?yàn)樵撃P徒鉀Q了機(jī)器翻譯問題——過去encoder-decoder結(jié)構(gòu)解決的問題。 在隨后的許多研究工作中,這種架構(gòu)要么去掉了encoder,要么去掉了decoder,只使用其中一種transformer堆棧,并盡可能高地堆疊它們,為它們提供大量的訓(xùn)練文本,并投入大量的計(jì)算機(jī)設(shè)備,以訓(xùn)練其中一部分語(yǔ)言模型,這一研究需要花費(fèi)數(shù)十萬美元,就像在研究AlphaStar時(shí)也投入了數(shù)百萬美元的資金。 那么我們可以將這些塊堆疊多高呢?事實(shí)證明,堆疊的高度是不同的GPT2模型之間大小有別的主要影響因素之一。 與BERT的區(qū)別 GPT-2是基于 transformer模型的decoder架構(gòu)構(gòu)建的。而BERT則是基于 transformer模型的encoder結(jié)構(gòu)構(gòu)建的。我們將在以下部分中研究?jī)烧叩牟町悺烧咧g的一個(gè)關(guān)鍵區(qū)別是,GPT2與傳統(tǒng)語(yǔ)言模型一樣,一次輸出一個(gè)token。接下來讓我們來舉例說明,經(jīng)過訓(xùn)練的GPT-2是如何背誦機(jī)器人第一定律(First Law of Robotics)的。 這些模型實(shí)際工作的方式是在生成每個(gè)token之后,添加到輸入序列中,而新序列將成為下一步模型的輸入。這就是“自回歸(auto-regression)”的思想。但這種想法也使得RNN的效率大打折扣。 GPT2以及一些后來的模型如TransformerXL和XLNet本質(zhì)上都是自回歸的。而BERT不是,它是一種權(quán)衡。在失去自回歸的過程中,BERT可以獲得兩邊的單詞,以結(jié)合上下文去獲得更好的結(jié)果。而XLNet既使用了自回歸,同時(shí)也找到了根據(jù)兩邊單詞融合上下文的替代方法 Transformer架構(gòu)的演變 一個(gè)是encoder結(jié)構(gòu),如下圖所示: 來自原始 transformer論文的encoder模塊可以輸入直到某個(gè)最大序列長(zhǎng)度(例如512個(gè)token)。如果輸入序列短于此限制,我們可以填充序列的其余部分。 另一個(gè)是decoder結(jié)構(gòu),這個(gè)結(jié)構(gòu)與encoder具有較小的體系結(jié)構(gòu)差異——多了一層用于關(guān)注encoder中的特定片段: self-attention層的一個(gè)關(guān)鍵區(qū)別在于它隱藏了未來的tokens,而不是像BERT那樣,將單詞更改為[mask(掩碼)],而是通過干擾阻止了從正在計(jì)算的位置右側(cè)的tokens中得到的信息進(jìn)入到self-attention層計(jì)算。 例如,如果我們要強(qiáng)調(diào)位置#4的路徑,我們可以看到它只允許參與當(dāng)前和之前的tokens: 重要的是,BERT使用的self-attention和GPT-2使用的masked self-attention之間的區(qū)別是明確的。正常的self-attention允許在其右側(cè)的tokens達(dá)到峰值。而Masked self-attention可防止這種情況發(fā)生: 然后是只包含decoder的架構(gòu),在發(fā)表論文“通過總結(jié)長(zhǎng)序列來生成Wikipedia”后,提出了另一種能夠進(jìn)行語(yǔ)言建模的transformer結(jié)構(gòu)。這個(gè)架構(gòu)不再使用Transformer的encoder結(jié)構(gòu)。因此,我們將模型稱為“Transformer-Decoder”。這種早期基于transformer的語(yǔ)言模型由六個(gè)decoder結(jié)構(gòu)組成: 論文鏈接: Decoder結(jié)構(gòu)是相同的。我擴(kuò)展了第一個(gè),所以你可以看到它的self-attention層是掩碼變體。請(qǐng)注意,該模型現(xiàn)在可以在某個(gè)段中處理多達(dá)4,000個(gè)tokens——原來的 transformer只能處理512個(gè),該模型有了較大提升。 這些結(jié)構(gòu)與原始decoder結(jié)構(gòu)非常相似,只是它們消除了第二個(gè)self-attention層。在“具有更深的Self-Attention的角色級(jí)語(yǔ)言建?!保╤ttps:///pdf/1808.04444.pdf)一文中實(shí)驗(yàn)了類似的體系結(jié)構(gòu),以創(chuàng)建一次預(yù)測(cè)一個(gè)字母/字符的語(yǔ)言模型。 OpenAI GPT-2模型使用的就是只有decoder結(jié)構(gòu)的transformer模型。 速成課程:探索GPT-2內(nèi)部工作原理 看看里面,你會(huì)發(fā)現(xiàn),這些話正在我的腦海深處割裂。電閃雷鳴,鋒利的言語(yǔ)正在將我逼向瘋狂的邊緣。 讓我們來研究一個(gè)已經(jīng)訓(xùn)練好的GPT-2,看看它是如何工作的。 GPT-2可以處理1024個(gè)tokens。每個(gè)token沿其自己的路徑經(jīng)過所有的decoder結(jié)構(gòu)。 運(yùn)行經(jīng)過訓(xùn)練的GPT-2的最簡(jiǎn)單方法是允許它自己進(jìn)行漫游(技術(shù)上稱為生成無條件樣本),或者我們可以給它提示讓它生成關(guān)于某個(gè)主題的文本(也就是生成交互式條件樣本)。在不設(shè)條件的情況下,我們可以簡(jiǎn)單地給它設(shè)置一個(gè)開始token,并讓它開始生成單詞(訓(xùn)練模型使用<|endoftext|>作為其開始token,稱之為<s>)。
該模型只有一個(gè)輸入token,因此該路徑將是唯一的活動(dòng)路徑。token通過所有層依次處理,然后沿該路徑生成向量。該向量可以根據(jù)模型的詞匯量進(jìn)行評(píng)分(模型知道的所有單詞,GPT-2中的單詞為50,000個(gè))。在這種情況下,我們選擇了概率最高的token——“the”。但是我們也可能把事情搞混,因?yàn)橛袝r(shí)你連續(xù)點(diǎn)擊鍵盤應(yīng)用程序中建議的第一個(gè)單詞,它有時(shí)會(huì)卡在重復(fù)的循環(huán)中,唯一的出路就是你點(diǎn)擊第二個(gè)或第三個(gè)建議的單詞。這里就可能發(fā)生這種情況。GPT-2有一個(gè)名為top-k的參數(shù),我們可以使用該參數(shù)讓模型考慮除第一個(gè)字之外的采樣(當(dāng)top-k = 1時(shí)就是這種情況)。 在下一步中,我們將第一步的輸出添加到輸入序列,并讓模型進(jìn)行下一個(gè)預(yù)測(cè): 請(qǐng)注意,第二條路徑是此計(jì)算中唯一有效的路徑。GPT-2的每一層都保留了自己對(duì)第一個(gè)token的解釋,并將在處理第二個(gè)token時(shí)使用它(我們將在下一節(jié)中詳細(xì)介紹有關(guān)self-attention的內(nèi)容)。GPT-2不會(huì)根據(jù)第二個(gè)token重新解釋第一個(gè)token。 深入了解內(nèi)幕 輸入編碼 接下來看一下更多細(xì)節(jié),以便更清楚地了解模型。讓我們從輸入開始。正如我們之前討論過的其他NLP模型一樣,模型在其embedding matrix(嵌入矩陣)中查找輸入單詞的embedding,embedding matrix是我們訓(xùn)練模型獲得的結(jié)果之一。 每一行都是一個(gè)word embedding(單詞嵌入):一個(gè)數(shù)字列表代表一個(gè)單詞,并捕獲它的一些含義。在不同的GPT2模型大小中該列表的大小是不同的。最小的模型使用每個(gè)字或每個(gè)token的embedding大小為768。 所以在開始時(shí),我們會(huì)在embedding matrix中查找起始token<s>的嵌入。在將其交給模型中的第一個(gè)模塊之前,我們需要結(jié)合位置編碼,位置編碼是一個(gè)指示序列中的字到transformer模塊中順序的信號(hào)。經(jīng)過訓(xùn)練的模型包含一個(gè)矩陣,其中包含輸入中1024個(gè)位置中每個(gè)位置的位置編碼向量。 在此基礎(chǔ)上,我們已經(jīng)介紹了在傳遞給第一個(gè) transformer模塊之前如何處理輸入單詞。我們還知道構(gòu)成訓(xùn)練好的GPT-2模型的兩個(gè)權(quán)重矩陣。
將字發(fā)送到第一個(gè)transformer模塊意味著查找其embedding并將位置#1的位置編碼向量相加。 堆棧之旅 現(xiàn)在第一個(gè)模塊可以首先將token傳遞給self-attention層處理,然后將其傳遞給神經(jīng)網(wǎng)絡(luò)層來處理。一旦第一個(gè)transformer模塊處理了該token,它就會(huì)將其結(jié)果向量發(fā)送到堆棧中,以便由下一個(gè)模塊處理。每個(gè)模塊中的過程是相同的,但每個(gè)模塊在self-attention層和神經(jīng)網(wǎng)絡(luò)子層中都有自己的權(quán)重。 Self-Attention回顧 語(yǔ)言嚴(yán)重依賴于語(yǔ)境。例如,看看下面的機(jī)器人第二定律: A robot must obey the orders given it by human beings except where such orders would conflict with the First Law. 我在句子中突出顯示了三個(gè)地方,這三個(gè)單詞都是指的是其他單詞。如果不合并他們所指的上下文,就無法理解或處理這些單詞。當(dāng)模型處理這句話時(shí),它必須能夠知道: It指的是機(jī)器人。 Such orders指的是前面所說的人類給予的命令。 The First Law是指前面完整的第一機(jī)器人定律。 這就是self-attention層的作用。它結(jié)合了模型對(duì)有關(guān)的和相關(guān)連的詞的理解,在處理該詞之前解釋某個(gè)詞的上下文,并將其傳遞給神經(jīng)網(wǎng)絡(luò)層。它通過為分段中每個(gè)單詞的相關(guān)性分配分?jǐn)?shù),并將它們的向量表示相加來實(shí)現(xiàn)這一點(diǎn)。 作為一個(gè)例子,第一模塊中的這個(gè)self-attention層在處理單詞“it”時(shí)正在關(guān)注“a robot”。它將傳遞給它的神經(jīng)網(wǎng)絡(luò)的向量是三個(gè)單詞中每一個(gè)向量乘以它們的分?jǐn)?shù)之和。
Self-Attention處理層 Self-attention 是沿著段中每個(gè)token的路徑來處理。重要的組成部分是三個(gè)向量: 查詢向量(query):查詢是當(dāng)前單詞的代表,用來去對(duì)其他所有詞(使用他們的鍵向量)進(jìn)行打分,我們只關(guān)心我們當(dāng)前正在處理的token的查詢。 鍵向量(key):鍵向量類似于段落中所有單詞的標(biāo)簽,它們是我們搜索相關(guān)單詞時(shí)所匹配的內(nèi)容。 值向量(value):值向量是實(shí)際的單詞表示,一旦我們得出每個(gè)單詞的相關(guān)程度,這些加起來表示當(dāng)前單詞的值。 一個(gè)粗略的比喻就是把它想象成一個(gè)文件柜。查詢向量就像是一個(gè)粘滯便箋,上面有您正在研究的主題。鍵向量就像機(jī)柜內(nèi)文件夾的標(biāo)簽。當(dāng)您將標(biāo)簽與便簽匹配時(shí),我們會(huì)取出該文件夾的內(nèi)容,這些內(nèi)容是值向量。但是您不僅要查找一個(gè)值,還要使用文件夾的混合值。 將查詢向量乘以每個(gè)鍵向量會(huì)為每個(gè)文件夾生成一個(gè)得分(技術(shù)上:先進(jìn)行點(diǎn)積運(yùn)算然后再用softmax函數(shù)進(jìn)行歸一化處理)。 我們將每個(gè)值乘以其得分并相加——從而產(chǎn)生我們的self-attention結(jié)果。 這種加權(quán)的混合值向量產(chǎn)生了一個(gè)向量,它對(duì)robot這個(gè)詞的“attention”為50%,對(duì)于單詞a為30%,對(duì) 單詞it為19%。在本文的后期,我們將更深入地研究self-attention。所以,讓我們先繼續(xù)沿著堆棧走向模型的輸出。 模型輸出 當(dāng)模型中的第一模塊產(chǎn)生其輸出向量(self-attention的結(jié)果以及神經(jīng)網(wǎng)絡(luò)的結(jié)果)時(shí),模型將該向量乘以embedding matrix。 回想一下,embedding matrix中的每一行都對(duì)應(yīng)于模型詞匯表中單詞的embedding 。這種乘法的結(jié)果被解釋為模型詞匯表中每個(gè)單詞的分?jǐn)?shù)。 我們可以簡(jiǎn)單地選擇得分最高的token(top_k = 1)。但如果模型也考慮了其他條件,則可以獲得更好的結(jié)果。因此,更好的策略是使用分?jǐn)?shù)作為選擇該單詞的概率,從整個(gè)列表中去抽樣單詞(因此具有較高分?jǐn)?shù)的單詞具有更高的被選擇機(jī)會(huì))。中間地帶將top_k設(shè)置為40,并且讓模型考慮具有最高分?jǐn)?shù)的40個(gè)單詞。 由此,模型完成了迭代,從而輸出單個(gè)單詞。模型繼續(xù)迭代,直到生成整個(gè)上下文(1024個(gè)token)或直到生成序列結(jié)束token。 GPT-2模型小結(jié) 至此,關(guān)于GPT2的工作原理我就介紹完了。如果您想知道self-attention內(nèi)部工作原理是什么,那么下文部分非常適合您。我創(chuàng)建它是為了引入更多的圖形示例來描述self-attention,以便后來的transformer模型更易于檢查和描述(比如:TransformerXL和XLNet)。 我想在這篇文章中提醒一些過于簡(jiǎn)化的內(nèi)容: 在本文中“words”和“token”是可以互換使用的。但實(shí)際上,GPT2在詞匯表中創(chuàng)建token是使用的字節(jié)對(duì)編碼(Byte Pair Encoding)。這意味著token通常是words的一部分。 我們展示的示例在其推理/評(píng)估模式下運(yùn)行GPT2。這就是為什么它一次只處理一個(gè)單詞。在訓(xùn)練時(shí),模型將針對(duì)較長(zhǎng)的文本序列進(jìn)行訓(xùn)練并一次處理多個(gè)tokens。此外,在訓(xùn)練時(shí),模型將處理較大批量(512)并評(píng)估使用的批量大小。 我對(duì)向量進(jìn)行了旋轉(zhuǎn)或轉(zhuǎn)置,以便更好地管理圖像中的空間。在實(shí)施時(shí),必須更精確。 Transformers使用大量的圖層規(guī)范化,這非常重要。我們?cè)凇皥D解Transformer模型”一文中已經(jīng)注意到其中的一些,在這篇文章中要更多地關(guān)注self-attentionin。 有時(shí)我需要顯示更多的框來表示矢量,我指的是“放大”。如下圖:
第二部分:圖解self-attention(自我關(guān)注)模型 在前面的帖子當(dāng)中,我們拿出這張圖片來展示self-attention機(jī)制被應(yīng)用在處理單詞“it”的層中的示意: 在本節(jié)中,我們將詳細(xì)介紹如何完成此操作。請(qǐng)注意我們將會(huì)以一種試圖了解單個(gè)單詞會(huì)發(fā)生什么的方式來看待它。這也是我們將會(huì)展示很多單個(gè)向量的原因。而實(shí)際的實(shí)現(xiàn)則是通過巨型矩陣的相乘來完成的。但是我想把重點(diǎn)放在對(duì)單詞級(jí)別在這里會(huì)發(fā)生什么的直覺認(rèn)識(shí)上。 Self-Attention(不加mask) 讓我們首先看一下在自編碼模塊中計(jì)算出的初始的self-attention。我們使用一次只能同時(shí)處理四個(gè)tokens的簡(jiǎn)易的transformer模塊。 Self-attention被應(yīng)用在下面三個(gè)主要的步驟中:
這件作品有一個(gè)重復(fù)出現(xiàn)的三角形輪廓。這個(gè)區(qū)域出現(xiàn)在后面的一個(gè)高峰,它關(guān)注的是之前所有高峰的高音,一直到樂曲的開頭。圖中顯示了一個(gè)查詢(所有注意線的來源)和正在處理的以前的記憶(接收到更多softmax probabiliy的注釋被突出顯示)。注意線的顏色對(duì)應(yīng)不同的頭部,寬度對(duì)應(yīng)softmax概率的權(quán)重。 https://www./watch?v=ipzR9bhei_o 結(jié)論 https://github.com/openai/gpt-2 https://github.com/huggingface/pytorch-transformers https://jalammar./illustrated-gpt2 |
|