一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

圖解OpenAI的秘密武器GPT-2:可視化Transformer語(yǔ)言模型

 黃爸爸好 2019-11-17

來源: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模型”系列。

系列鏈接:

https://jalammar./illustrated-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)

  1. 創(chuàng)建查詢向量、鍵向量和值向量

  2. 打分

  3. 求和

圖解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:

https://jalammar./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)組成:

論文鏈接:

https:///pdf/1801.10198.pdf

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è)主要的步驟中:

  1. 為每個(gè)路徑創(chuàng)建query(查詢向量), Key(鍵向量),和 Value vectors(值向量)。
  2. 對(duì)于每個(gè)輸入token,使用其query(查詢向量)對(duì)所有其他Key(鍵向量)進(jìn)行評(píng)分。
  3. 將值向量乘以他們的相關(guān)分?jǐn)?shù)后進(jìn)行求和。
1.創(chuàng)建query(查詢向量), key(鍵向量),和 value vector(值向量)
我們來看第一條路徑。我們將取出它的query(查詢向量)然后和所有的Key(鍵向量)進(jìn)行比較。每個(gè)Key(鍵向量)會(huì)產(chǎn)生一個(gè)分?jǐn)?shù)。自注意力機(jī)制的第一步就是為每一個(gè)token路徑分別計(jì)算三個(gè)向量(我們先暫時(shí)忽略attention heads):
2.打分
現(xiàn)在我們得到了一些向量,在第二步中我們只使用query(查詢向量)和 Value vectors(值向量)。我們不妨先看第一個(gè)token,我們將它的query(查詢向量)和所有其他的key(鍵向量)相乘來得到四個(gè)tokens中每個(gè)token的分?jǐn)?shù)。
3.求和
我們現(xiàn)在可以將分?jǐn)?shù)和value vector(值向量)相乘。在我們將其相加求和后,對(duì)應(yīng)高分的value vector(值向量)將占所得向量的大部分。
分?jǐn)?shù)越低,我們看到的value vector(值向量)就越透明。這是為了表明乘以一個(gè)小數(shù)會(huì)稀釋vector的值。
如果我們對(duì)每條路徑都做同樣的操作,我們最終會(huì)得到一個(gè)向量來表示包含了適當(dāng)?shù)纳舷挛牡膖oken。將它們傳給transformer模塊的下一個(gè)子層(前饋神經(jīng)網(wǎng)絡(luò)):

圖解Masked Self-Attention

現(xiàn)在我們已經(jīng)知道了transformer內(nèi)部的self-attention機(jī)制的步驟,下面我們繼續(xù)來看masked self-attention機(jī)制。Masked self-attention機(jī)制和self-attention機(jī)制除了步驟2之外基本相同。假設(shè)這個(gè)模型只有兩個(gè)token作為輸入,我們來觀察第二個(gè)token。在這種情況下,后兩個(gè)tokens被掩蔽了。因此該模型干涉了評(píng)分的步驟。它基本上總是將未來的token記為0,因此這個(gè)模型不會(huì)在未來的單詞上達(dá)到峰值。
這種掩蔽通常用attention mask矩陣來實(shí)現(xiàn)考慮一個(gè)由四個(gè)單詞組成的序列(例如“robot must obey orders”)。在語(yǔ)言的場(chǎng)景建模中,這個(gè)序列被分為四步,每步一個(gè)單詞(假設(shè)現(xiàn)在每個(gè)單詞都是一個(gè)token)。由于這些模型分批工作,我們可以假設(shè)一個(gè)批的規(guī)模是4,這些簡(jiǎn)易模型將整個(gè)序列(包含四個(gè)步驟)作為一個(gè)批處理。
在矩陣形式中,我們將一個(gè)query(查詢向量)矩陣和一個(gè)key(鍵向量)矩陣相乘來計(jì)算分?jǐn)?shù)。我們下面來將其可視化,除單詞外,還有與該單元格中該單詞相關(guān)聯(lián)的query(查詢向量)(或key(鍵向量)):
在做乘法之后,我們將其轉(zhuǎn)化為三角矩陣。將我們想要掩蔽的單元格設(shè)置成副無窮大或一個(gè)一個(gè)非常大的負(fù)數(shù)(例如在GPT2中我們?cè)O(shè)置成-1億):
然后,對(duì)每一行使用softmax生成我們?cè)趕elf-attention機(jī)制中實(shí)際上使用的分?jǐn)?shù):
這個(gè)分?jǐn)?shù)表的意思如下所述:
當(dāng)模型處理數(shù)據(jù)集中的第一個(gè)實(shí)例時(shí)(圖中的第一行),這里只包含一個(gè)單詞(“robot”),100%的注意力都將集中在這個(gè)詞上。
當(dāng)模型處理數(shù)據(jù)集中的第二個(gè)實(shí)例時(shí)(圖中的第二行),這里包含了(“robot must”),當(dāng)模型處理單詞“must”時(shí),48%的注意力將集中在“robot”上,而另外52%的注意力將會(huì)集中在“must”上。
依次類推

GPT-2 Masked Self-Attention

讓我們來詳細(xì)了解一下GPT-2’s masked attention的更多細(xì)節(jié)。
評(píng)估時(shí)間:一次只處理一個(gè)token
我們可以讓GPT-2機(jī)制完全像masked self-attention機(jī)制一樣來運(yùn)作。但在整個(gè)評(píng)估過程中,當(dāng)我們的模型在每次迭代后只添加一個(gè)新單詞的時(shí)候,沿著早期路徑重新計(jì)算已經(jīng)處理過的self-attention的token是效率極低的。
在這種情況下,我們處理第一個(gè)token(暫時(shí)忽略<s>)。
GPT-2保留a的key(鍵向量)和value vector(值向量)。每一個(gè)self-attention層都保留這個(gè)token的相應(yīng)的key(鍵向量)和value vector(值向量):
現(xiàn)在在下一次迭代中,當(dāng)我們的模型處理單詞robot時(shí),它不需要再為token a 生成query(查詢向量), key(鍵向量), 和 value(值向量)查詢。它只需要復(fù)用它在第一次迭代中保存的那些:
我們假設(shè)模型正在處理單詞it。如果我們討論底層模塊,那么它對(duì)該token的輸入將是it的embedding加上插槽9處的位置encoding:
Transformer中的每一個(gè)模塊都有它的權(quán)重(稍后在帖子中細(xì)分)。我們第一個(gè)遇到的就是我們用于創(chuàng)建queries(查詢向量), key(鍵向量), 和 value vector(值向量)的權(quán)重矩陣。
Self-attention將它的輸入和它的權(quán)重矩陣相乘(并且加一個(gè)偏置向量,這里不做說明)。
乘法計(jì)算產(chǎn)生的vector基本上是單詞it的query(查詢向量),key(鍵向量), 和 value vector(值向量)共同得到的結(jié)果。
Attention權(quán)重vector和輸入vector相乘(并且在后面加上一個(gè)偏置向量)得到這個(gè)token的key(鍵向量), value vector(值向量), 和 query(查詢向量)。
在前面的例子當(dāng)中,我們直接進(jìn)入self-attention而忽略了“multi-head”部分?,F(xiàn)在對(duì)這部分概念有所了解將是大有用處的。Self attention機(jī)制在Q,K,V vectors的不同部分多次進(jìn)行。“分裂” attention heads只是簡(jiǎn)單的將長(zhǎng)向量重塑成為一個(gè)矩陣。小型的GPT2有12個(gè)attention heads,因此那將成為重塑后矩陣的第一維:
在前面的例子中,我們已經(jīng)看到一個(gè)attention head中會(huì)發(fā)生什么。一個(gè)考慮多個(gè)attention-heads 的方法是像這樣的(如果我們只想像12個(gè)attention heads中的3個(gè)): 

我們現(xiàn)在可以著手進(jìn)行評(píng)分,在已知我們只關(guān)注一個(gè)attention head的情況下(并且其他所有的都進(jìn)行類似的操作):
現(xiàn)在,token可以針對(duì)其他所有token進(jìn)行評(píng)分(在先前迭代的attention head #1中計(jì)算的):
正如我們之前所看到的,我們現(xiàn)在將每個(gè)value乘以其得分,然后把它們加起來,產(chǎn)生的就是attention-head #1的self-attention結(jié)果。
我們處理各種attention heads的方式是我們首先將它們連接成一個(gè)vector:
但是這個(gè)vector尚未準(zhǔn)備好發(fā)送到下一個(gè)子層。我們需要首先將這個(gè)隱藏狀態(tài)的弗蘭肯斯坦怪物(人造的)變成一個(gè)同質(zhì)的表示。
我們將讓模型學(xué)習(xí)如何最好地將連接的self-attention結(jié)果映射到前饋神經(jīng)網(wǎng)絡(luò)可以處理的向量中。這是我們的第二個(gè)大權(quán)重矩陣,它將attention heads的結(jié)果映射到self-attention子層的輸出向量中:
有了這個(gè),我們就可以生成可以發(fā)送到下一層的向量。
全連接神經(jīng)網(wǎng)絡(luò)是該模塊在self-attention在其表示中已經(jīng)包含了適當(dāng)?shù)纳舷挛暮筇幚硭妮斎雝oken的地方。它由兩層組成。第一層是模型大小的4倍(當(dāng)小型GPT2的規(guī)模為768,這個(gè)網(wǎng)絡(luò)將有768*4=3072個(gè)單元)。為什么有四倍呢?這只是初始transformer運(yùn)行的大?。P途S度是512,該模型的第一層是2048).這似乎為transformer模型提供了足夠的表示能力來處理迄今為止面臨的任務(wù)。
  
第二層將第一層的結(jié)果投影回模型維度(小型GPT2為768)。這個(gè)乘法的結(jié)果是這個(gè)token的transformer模塊的結(jié)果。

你做到了!

這是我們將要進(jìn)入的transformer模塊的最詳細(xì)的版本!你現(xiàn)在幾乎擁有一個(gè)transformer語(yǔ)言模型內(nèi)部發(fā)生的絕大部分圖片?;仡櫼幌?,我們勇敢的輸入向量遇到了這些權(quán)重矩陣:
每一個(gè)模塊都有它自己的一組權(quán)重。另一方面,這個(gè)模型只有一個(gè)token embedding矩陣和一個(gè)位置encoding矩陣:
如果你想看看模型的全部參數(shù),現(xiàn)在我把它們都羅列出來:
由于某些原因,它們總共增加了127M個(gè)參數(shù)而不是117M個(gè)。我不確定這是為什么,但是這是在發(fā)布的代碼中它們看起來的數(shù)量(如果我錯(cuò)了,請(qǐng)聯(lián)系我糾正)。

第三部分:語(yǔ)言建模番外

decoder-only transformer在語(yǔ)言模型之外不斷獲得超越。這里有很多成功的應(yīng)用,可以通過類似視覺的效果來進(jìn)行描述。讓我們來看一些這里成功的應(yīng)用結(jié)束這篇文章。

機(jī)器翻譯
Encoder不需要進(jìn)行翻譯。同樣的任務(wù)可以用decoder-only transformer來解決。

生成摘要

這是第一個(gè)decoder-only transformer被訓(xùn)練的來解決的任務(wù)。也即是說,它被訓(xùn)練來讀維基百科的文章(去掉在目錄之前的開頭部分),然后生成摘要。文章的實(shí)際開頭部分被用作訓(xùn)練集的標(biāo)簽。
本文針對(duì)維基百科的文章對(duì)模型進(jìn)行了訓(xùn)練,因此訓(xùn)練后的模型可以用來生成文章的摘要。

遷移學(xué)習(xí)

在使用單個(gè)預(yù)訓(xùn)練transformer的樣本高效文本摘要中,首先使用 decoder-only transformer對(duì)語(yǔ)言模型進(jìn)行預(yù)訓(xùn)練,然后進(jìn)行微調(diào)來生成摘要。事實(shí)證明,在有限的數(shù)據(jù)設(shè)置下,它比預(yù)訓(xùn)練的encoder-decoder transformer獲得了更好的效果。
GPT2論文還顯示了在對(duì)語(yǔ)言建模進(jìn)行預(yù)訓(xùn)練之后的摘要結(jié)果。

音樂生成

音樂transformer使用decoder-only transformer來生成具有表現(xiàn)力和動(dòng)態(tài)的音樂?!耙魳纺P汀本拖裾Z(yǔ)言模型一樣,就是讓模型以無監(jiān)督的方式來學(xué)習(xí)音樂,然后讓它輸出樣本(我們此前稱之為“漫游”)。
你可能會(huì)對(duì)在這種情況下如何表示音樂感到好奇。記著,語(yǔ)言模型可以通過將作為單詞部分的字符或單詞或token轉(zhuǎn)化為向量表示來完成。通過音樂表演(讓我們暫時(shí)先考慮鋼琴),我們必須表示音符,但同時(shí)還要表示速度——衡量鋼琴鍵按下的力度。
一首曲子只是這一系列one-hot vectors的載體。一個(gè)midi文件可以轉(zhuǎn)換成為這種格式。本文有以下示例輸入序列:
用one-hot vector表示這些輸入序列可以看做下面這樣:
我喜歡文章中的可視化,展示了音樂Transformer中的self-attention。我在這里添加了一些注釋:

這件作品有一個(gè)重復(fù)出現(xiàn)的三角形輪廓。這個(gè)區(qū)域出現(xiàn)在后面的一個(gè)高峰,它關(guān)注的是之前所有高峰的高音,一直到樂曲的開頭。圖中顯示了一個(gè)查詢(所有注意線的來源)和正在處理的以前的記憶(接收到更多softmax probabiliy的注釋被突出顯示)。注意線的顏色對(duì)應(yīng)不同的頭部,寬度對(duì)應(yīng)softmax概率的權(quán)重。

如果你不清楚這種音符表示,請(qǐng)查看這個(gè)視頻。
視頻鏈接:

https://www./watch?v=ipzR9bhei_o

結(jié)論

這就結(jié)束了我們的GPT2以及對(duì)其父模型decoder-only transformer的探索之旅。我希望你能夠更好的理解self-attention,你越是深入transformer越能更好的理解這一機(jī)制。
一些資源:
來自O(shè)penAI的GPT2 Implementation:

https://github.com/openai/gpt-2

pytorch-transformers library:

https://github.com/huggingface/pytorch-transformers

原文鏈接:

https://jalammar./illustrated-gpt2

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日韩一区二区三区18| 激情亚洲内射一区二区三区| 91人妻人人澡人人人人精品| 精品人妻一区二区三区四区久久| 亚洲一区二区精品免费视频| 成人免费视频免费观看| 欧美精品专区一区二区| 欧美美女视频在线免费看| 伊人天堂午夜精品草草网| 东京不热免费观看日本| 中文字幕久久精品亚洲乱码| 在线免费国产一区二区| 亚洲欧美日韩精品永久| 久久99一本色道亚洲精品| 日韩精品人妻少妇一区二区| 免费一区二区三区少妇| 日本男人女人干逼视频| 免费观看成人免费视频| 狠狠做五月深爱婷婷综合| 国产精品激情在线观看| 精品国产av一区二区三区不卡蜜| 欧美日韩国产成人高潮| 亚洲最大的中文字幕在线视频| 日本精品啪啪一区二区三区| 日韩免费午夜福利视频| 中文字幕欧美精品人妻一区| 熟女一区二区三区国产| 日本在线不卡高清欧美| 精品少妇人妻av一区二区蜜桃| 97人妻精品免费一区二区| 国产无摭挡又爽又色又刺激| 欧美激情视频一区二区三区| 2019年国产最新视频| 国产精品免费精品一区二区| 护士又紧又深又湿又爽的视频| 国产高清精品福利私拍| 少妇毛片一区二区三区| 婷婷基地五月激情五月| 日本二区三区在线播放| 精品国产丝袜一区二区| 午夜精品一区免费视频|