1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        完全圖解GPT-2:看完這篇就夠了(一)

        共 6992字,需瀏覽 14分鐘

         ·

        2022-05-09 23:41


        點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號(hào)

        重磅干貨,第一時(shí)間送達(dá)

        選自github.io,作者:Jay Alammar

        機(jī)器之心編譯


        今年涌現(xiàn)出了許多機(jī)器學(xué)習(xí)的精彩應(yīng)用,令人目不暇接,OpenAI 的 GPT-2 就是其中之一。它在文本生成上有著驚艷的表現(xiàn),其生成的文本在上下文連貫性和情感表達(dá)上都超過(guò)了人們對(duì)目前階段語(yǔ)言模型的預(yù)期。僅從模型架構(gòu)而言,GPT-2 并沒(méi)有特別新穎的架構(gòu),它和只帶有解碼器的 transformer 模型很像。

        然而,GPT-2 有著超大的規(guī)模,它是一個(gè)在海量數(shù)據(jù)集上訓(xùn)練的基于 transformer 的巨大模型。GPT-2 成功的背后究竟隱藏著什么秘密?本文將帶你一起探索取得優(yōu)異性能的 GPT-2 模型架構(gòu),重點(diǎn)闡釋其中關(guān)鍵的自注意力(self-attention)層,并且看一看 GPT-2 采用的只有解碼器的 transformer 架構(gòu)在語(yǔ)言建模之外的應(yīng)用。


        作者之前寫(xiě)過(guò)一篇相關(guān)的介紹性文章「The Illustrated Transformer」,本文將在其基礎(chǔ)上加入更多關(guān)于 transformer 模型內(nèi)部工作原理的可視化解釋?zhuān)约斑@段時(shí)間以來(lái)關(guān)于 transformer 模型的新進(jìn)展。基于 transformer 的模型在持續(xù)演進(jìn),我們希望本文使用的這一套可視化表達(dá)方法可以使此類(lèi)模型更容易解釋。


        第一部分:GPT-2 和語(yǔ)言建模


        首先,究竟什么是語(yǔ)言模型(language model)?


        何為語(yǔ)言模型


        簡(jiǎn)單說(shuō)來(lái),語(yǔ)言模型的作用就是根據(jù)已有句子的一部分,來(lái)預(yù)測(cè)下一個(gè)單詞會(huì)是什么。最著名的語(yǔ)言模型你一定見(jiàn)過(guò),就是我們手機(jī)上的輸入法,它可以根據(jù)當(dāng)前輸入的內(nèi)容智能推薦下一個(gè)詞。


        從這個(gè)意義上說(shuō),我們可以說(shuō) GPT-2 基本上相當(dāng)于輸入法的單詞聯(lián)想功能,但它比你手機(jī)上安裝的此類(lèi)應(yīng)用大得多,也更加復(fù)雜。OpenAI 的研究人員使用了一個(gè)從網(wǎng)絡(luò)上爬取的 40GB 超大數(shù)據(jù)集「WebText」訓(xùn)練 GPT-2,該數(shù)據(jù)集也是他們的工作成果的一部分。

        如果從占用存儲(chǔ)大小的角度進(jìn)行比較,我現(xiàn)在用的手機(jī)輸入法「SwiftKey」也就占用了 50MB 的空間,而 GPT-2 的最小版本也需要至少 500MB 的空間來(lái)存儲(chǔ)它的全部參數(shù),最大版本的 GPT-2 甚至需要超過(guò) 6.5GB 的存儲(chǔ)空間。


        讀者可以用「AllenAI GPT-2 Explorer」(https://gpt2.apps.allenai.org/?text=Joel%20is)來(lái)體驗(yàn) GPT-2 模型。它可以給出可能性排名前十的下一個(gè)單詞及其對(duì)應(yīng)概率,你可以選擇其中一個(gè)單詞,然后看到下一個(gè)可能單詞的列表,如此往復(fù),最終完成一篇文章。


        使用 Transformers 進(jìn)行語(yǔ)言建模


        正如本文作者在「The Illustrated Transformer 」這篇文章中所述,原始的 transformer 模型由編碼器(encoder)和解碼器(decoder)組成,二者都是由被我們稱(chēng)為「transformer 模塊」的部分堆疊而成。這種架構(gòu)在機(jī)器翻譯任務(wù)中取得的成功證實(shí)了它的有效性,值得一提的是,這個(gè)任務(wù)之前效果最好的方法也是基于編碼器-解碼器架構(gòu)的。



        Transformer 的許多后續(xù)工作嘗試去掉編碼器或解碼器,也就是只使用一套堆疊得盡可能多的 transformer 模塊,然后使用海量文本、耗費(fèi)大量的算力進(jìn)行訓(xùn)練(研究者往往要投入數(shù)百甚至數(shù)千美元來(lái)訓(xùn)練這些語(yǔ)言模型,而在 AlphaStar 項(xiàng)目中則可能要花費(fèi)數(shù)百萬(wàn)美元)。



        那么我們究竟能將這些模塊堆疊到多深呢?事實(shí)上,這個(gè)問(wèn)題的答案也就是區(qū)別不同 GPT-2 模型的主要因素之一,如下圖所示。「小號(hào)」的 GPT-2 模型堆疊了 12 層,「中號(hào)」24 層,「大號(hào)」36 層,還有一個(gè)「特大號(hào)」堆疊了整整 48 層。



        與 BERT 的區(qū)別


        機(jī)器人第一法則

        機(jī)器人不得傷害人類(lèi),或者目睹人類(lèi)將遭受危險(xiǎn)而袖手旁觀。


        GPT-2 是使用「transformer 解碼器模塊」構(gòu)建的,而 BERT 則是通過(guò)「transformer 編碼器」模塊構(gòu)建的。我們將在下一節(jié)中詳述二者的區(qū)別,但這里需要指出的是,二者一個(gè)很關(guān)鍵的不同之處在于:GPT-2 就像傳統(tǒng)的語(yǔ)言模型一樣,一次只輸出一個(gè)單詞(token)。下面是引導(dǎo)訓(xùn)練好的模型「背誦」機(jī)器人第一法則的例子:


        這種模型之所以效果好是因?yàn)樵诿總€(gè)新單詞產(chǎn)生后,該單詞就被添加在之前生成的單詞序列后面,這個(gè)序列會(huì)成為模型下一步的新輸入。這種機(jī)制叫做自回歸(auto-regression),同時(shí)也是令 RNN 模型效果拔群的重要思想。



        GPT-2,以及一些諸如 TransformerXL 和 XLNet 等后續(xù)出現(xiàn)的模型,本質(zhì)上都是自回歸模型,而 BERT 則不然。這就是一個(gè)權(quán)衡的問(wèn)題了。雖然沒(méi)有使用自回歸機(jī)制,但 BERT 獲得了結(jié)合單詞前后的上下文信息的能力,從而取得了更好的效果。XLNet 使用了自回歸,并且引入了一種能夠同時(shí)兼顧前后的上下文信息的方法。


        Transformer 模塊的演進(jìn)

        原始的 transformer 論文引入了兩種類(lèi)型的 transformer 模塊,分別是:編碼器模塊和解碼器模塊。


        1. 編碼器模塊


        首先是編碼器(encoder)模塊:



        原始 transformer 論文中的編碼器模塊可以接受長(zhǎng)度不超過(guò)最大序列長(zhǎng)度(如 512 個(gè)單詞)的輸入。如果序列長(zhǎng)度小于該限制,我們就在其后填入預(yù)先定義的空白單詞(如上圖中的)。


        2. 解碼器模塊


        其次是解碼器模塊,它與編碼器模塊在架構(gòu)上有一點(diǎn)小差異——加入了一層使得它可以重點(diǎn)關(guān)注編碼器輸出的某一片段,也就是下圖中的編碼器-解碼器自注意力(encoder-decoder self-attention)層。


        解碼器在自注意力(self-attention)層上還有一個(gè)關(guān)鍵的差異:它將后面的單詞掩蓋掉了。但并不像 BERT 一樣將它們替換成特殊定義的單詞,而是在自注意力計(jì)算的時(shí)候屏蔽了來(lái)自當(dāng)前計(jì)算位置右邊所有單詞的信息。


        舉個(gè)例子,如果我們重點(diǎn)關(guān)注 4 號(hào)位置單詞及其前續(xù)路徑,我們可以模型只允許注意當(dāng)前計(jì)算的單詞以及之前的單詞:


        能夠清楚地區(qū)分 BERT 使用的自注意力(self-attention)模塊和 GPT-2 使用的帶掩模的自注意力(masked self-attention)模塊很重要。普通的自注意力模塊允許一個(gè)位置看到它右側(cè)單詞的信息(如下左圖),而帶掩模的自注意力模塊則不允許這么做(如下右圖)。



        3. 只包含解碼器的模塊


        在 transformer 原始論文發(fā)表之后,一篇名為「Generating Wikipedia by Summarizing Long Sequences」的論文提出用另一種 transformer 模塊的排列方式來(lái)進(jìn)行語(yǔ)言建模——它直接扔掉了所有的 transformer 編碼器模塊……我們姑且就管它叫做「Transformer-Decoder」模型吧。這個(gè)早期的基于 transformer 的模型由 6 個(gè) transformer 解碼器模塊堆疊而成:


        圖中所有的解碼器模塊都是一樣的,因此本文只展開(kāi)了第一個(gè)解碼器的內(nèi)部結(jié)構(gòu)。可以看見(jiàn),它使用了帶掩模的自注意力層。請(qǐng)注意,該模型在某個(gè)片段中可以支持最長(zhǎng) 4000 個(gè)單詞的序列,相較于 transformer 原始論文中最長(zhǎng) 512 單詞的限制有了很大的提升。


        這些解碼器模塊和 transformer 原始論文中的解碼器模塊相比,除了去除了第二個(gè)自注意力層之外,并無(wú)很大不同。一個(gè)相似的架構(gòu)在字符級(jí)別的語(yǔ)言建模中也被驗(yàn)證有效,它使用更深的自注意力層構(gòu)建語(yǔ)言模型,一次預(yù)測(cè)一個(gè)字母/字符。


        OpenAI 的 GPT-2 模型就用了這種只包含編碼器(decoder-only)的模塊。


        GPT-2 內(nèi)部機(jī)制速成


        在我內(nèi)心,字字如刀;電閃雷鳴,使我瘋癲。
        ——Budgie



        接下來(lái),我們將深入剖析 GPT-2 的內(nèi)部結(jié)構(gòu),看看它是如何工作的。


        GPT-2 可以處理最長(zhǎng) 1024 個(gè)單詞的序列。每個(gè)單詞都會(huì)和它的前續(xù)路徑一起「流過(guò)」所有的解碼器模塊。


        想要運(yùn)行一個(gè)訓(xùn)練好的 GPT-2 模型,最簡(jiǎn)單的方法就是讓它自己隨機(jī)工作(從技術(shù)上說(shuō),叫做生成無(wú)條件樣本)。換句話(huà)說(shuō),我們也可以給它一點(diǎn)提示,讓它說(shuō)一些關(guān)于特定主題的話(huà)(即生成交互式條件樣本)。在隨機(jī)情況下,我們只簡(jiǎn)單地提供一個(gè)預(yù)先定義好的起始單詞(訓(xùn)練好的模型使用「|endoftext|」作為它的起始單詞,不妨將其稱(chēng)為),然后讓它自己生成文字。


        此時(shí),模型的輸入只有一個(gè)單詞,所以只有這個(gè)單詞的路徑是活躍的。單詞經(jīng)過(guò)層層處理,最終得到一個(gè)向量。向量可以對(duì)于詞匯表的每個(gè)單詞計(jì)算一個(gè)概率(詞匯表是模型能「說(shuō)出」的所有單詞,GPT-2 的詞匯表中有 50000 個(gè)單詞)。在本例中,我們選擇概率最高的單詞「The」作為下一個(gè)單詞。

        但有時(shí)這樣會(huì)出問(wèn)題——就像如果我們持續(xù)點(diǎn)擊輸入法推薦單詞的第一個(gè),它可能會(huì)陷入推薦同一個(gè)詞的循環(huán)中,只有你點(diǎn)擊第二或第三個(gè)推薦詞,才能跳出這種循環(huán)。同樣的,GPT-2 也有一個(gè)叫做「top-k」的參數(shù),模型會(huì)從概率前 k 大的單詞中抽樣選取下一個(gè)單詞。顯然,在之前的情況下,top-k = 1。



        接下來(lái),我們將輸出的單詞添加在輸入序列的尾部構(gòu)建新的輸入序列,讓模型進(jìn)行下一步的預(yù)測(cè):


        請(qǐng)注意,第二個(gè)單詞的路徑是當(dāng)前唯一活躍的路徑了。GPT-2 的每一層都保留了它們對(duì)第一個(gè)單詞的解釋?zhuān)⑶覍⑦\(yùn)用這些信息處理第二個(gè)單詞(具體將在下面一節(jié)對(duì)自注意力機(jī)制的講解中詳述),GPT-2 不會(huì)根據(jù)第二個(gè)單詞重新解釋第一個(gè)單詞。


        更加深入了解內(nèi)部原理


        1. 輸入編碼


        讓我們更加深入地了解一下模型的內(nèi)部細(xì)節(jié)。首先,讓我們從模型的輸入開(kāi)始。正如我們之前討論過(guò)的其它自然語(yǔ)言處理模型一樣,GPT-2 同樣從嵌入矩陣中查找單詞對(duì)應(yīng)的嵌入向量,該矩陣也是模型訓(xùn)練結(jié)果的一部分。



        每一行都是一個(gè)詞嵌入向量:一個(gè)能夠表征某個(gè)單詞,并捕獲其意義的數(shù)字列表。嵌入向量的長(zhǎng)度和 GPT-2 模型的大小有關(guān),最小的模型使用了長(zhǎng)為 768 的嵌入向量來(lái)表征一個(gè)單詞。


        所以在一開(kāi)始,我們需要在嵌入矩陣中查找起始單詞對(duì)應(yīng)的嵌入向量。但在將其輸入給模型之前,我們還需要引入位置編碼——一些向 transformer 模塊指出序列中的單詞順序的信號(hào)。1024 個(gè)輸入序列位置中的每一個(gè)都對(duì)應(yīng)一個(gè)位置編碼,這些編碼組成的矩陣也是訓(xùn)練模型的一部分。



        至此,輸入單詞在進(jìn)入模型第一個(gè) transformer 模塊之前所有的處理步驟就結(jié)束了。如上文所述,訓(xùn)練后的 GPT-2 模型包含兩個(gè)權(quán)值矩陣:嵌入矩陣和位置編碼矩陣。



        將單詞輸入第一個(gè) transformer 模塊之前需要查到它對(duì)應(yīng)的嵌入向量,再加上 1 號(hào)位置位置對(duì)應(yīng)的位置向量。


        3. 堆棧之旅


        第一個(gè) transformer 模塊處理單詞的步驟如下:首先通過(guò)自注意力層處理,接著將其傳遞給神經(jīng)網(wǎng)絡(luò)層。第一個(gè) transformer?模塊處理完但此后,會(huì)將結(jié)果向量被傳入堆棧中的下一個(gè) transformer 模塊,繼續(xù)進(jìn)行計(jì)算。每一個(gè) transformer 模塊的處理方式都是一樣的,但每個(gè)模塊都會(huì)維護(hù)自己的自注意力層和神經(jīng)網(wǎng)絡(luò)層中的權(quán)重。



        4. 回顧自注意力機(jī)制


        語(yǔ)言的含義是極度依賴(lài)上下文的,比如下面這個(gè)機(jī)器人第二法則:


        機(jī)器人第二法則
        機(jī)器人必須遵守人類(lèi)給它的命令,除非該命令違背了第一法則。


        我在這句話(huà)中高亮表示了三個(gè)地方,這三處單詞指代的是其它單詞。除非我們知道這些詞指代的上下文聯(lián)系起來(lái),否則根本不可能理解或處理這些詞語(yǔ)的意思。當(dāng)模型處理這句話(huà)的時(shí)候,它必須知道:


        • 「它」指代機(jī)器人

        • 「命令」指代前半句話(huà)中人類(lèi)給機(jī)器人下的命令,即「人類(lèi)給它的命令」

        • 「第一法則」指機(jī)器人第一法則的完整內(nèi)容


        這就是自注意力機(jī)制所做的工作,它在處理每個(gè)單詞(將其傳入神經(jīng)網(wǎng)絡(luò))之前,融入了模型對(duì)于用來(lái)解釋某個(gè)單詞的上下文的相關(guān)單詞的理解。具體做法是,給序列中每一個(gè)單詞都賦予一個(gè)相關(guān)度得分,之后對(duì)他們的向量表征求和。


        舉個(gè)例子,最上層的 transformer 模塊在處理單詞「it」的時(shí)候會(huì)關(guān)注「a robot」,所以「a」、「robot」、「it」這三個(gè)單詞與其得分相乘加權(quán)求和后的特征向量會(huì)被送入之后的神經(jīng)網(wǎng)絡(luò)層。



        自注意力機(jī)制沿著序列中每一個(gè)單詞的路徑進(jìn)行處理,主要由 3 個(gè)向量組成:


        1. 查詢(xún)向量(Query 向量):當(dāng)前單詞的查詢(xún)向量被用來(lái)和其它單詞的鍵向量相乘,從而得到其它詞相對(duì)于當(dāng)前詞的注意力得分。我們只關(guān)心目前正在處理的單詞的查詢(xún)向量。

        2. 鍵向量(Key 向量):鍵向量就像是序列中每個(gè)單詞的標(biāo)簽,它使我們搜索相關(guān)單詞時(shí)用來(lái)匹配的對(duì)象。

        3. 值向量(Value 向量):值向量是單詞真正的表征,當(dāng)我們算出注意力得分后,使用值向量進(jìn)行加權(quán)求和得到能代表當(dāng)前位置上下文的向量。






        一個(gè)簡(jiǎn)單粗暴的比喻是在檔案柜中找文件。查詢(xún)向量就像一張便利貼,上面寫(xiě)著你正在研究的課題。鍵向量像是檔案柜中文件夾上貼的標(biāo)簽。當(dāng)你找到和便利貼上所寫(xiě)相匹配的文件夾時(shí),拿出它,文件夾里的東西便是值向量。只不過(guò)我們最后找的并不是單一的值向量,而是很多文件夾值向量的混合。


        將單詞的查詢(xún)向量分別乘以每個(gè)文件夾的鍵向量,得到各個(gè)文件夾對(duì)應(yīng)的注意力得分(這里的乘指的是向量點(diǎn)乘,乘積會(huì)通過(guò) softmax 函數(shù)處理)。



        我們將每個(gè)文件夾的值向量乘以其對(duì)應(yīng)的注意力得分,然后求和,得到最終自注意力層的輸出。



        這樣將值向量加權(quán)混合得到的結(jié)果是一個(gè)向量,它將其 50% 的「注意力」放在了單詞「robot」上,30% 的注意力放在了「a」上,還有 19% 的注意力放在「it」上。我們之后還會(huì)更詳細(xì)地講解自注意力機(jī)制,讓我們先繼續(xù)向前探索 transformer 堆棧,看看模型的輸出。


        5. 模型輸出


        當(dāng)最后一個(gè) transformer 模塊產(chǎn)生輸出之后(即經(jīng)過(guò)了它自注意力層和神經(jīng)網(wǎng)絡(luò)層的處理),模型會(huì)將輸出的向量乘上嵌入矩陣。



        我們知道,嵌入矩陣的每一行都對(duì)應(yīng)模型的詞匯表中一個(gè)單詞的嵌入向量。所以這個(gè)乘法操作得到的結(jié)果就是詞匯表中每個(gè)單詞對(duì)應(yīng)的注意力得分。


        我們簡(jiǎn)單地選取得分最高的單詞作為輸出結(jié)果(即 top-k = 1)。但其實(shí)如果模型考慮其他候選單詞的話(huà),效果通常會(huì)更好。所以,一個(gè)更好的策略是對(duì)于詞匯表中得分較高的一部分單詞,將它們的得分作為概率從整個(gè)單詞列表中進(jìn)行抽樣(得分越高的單詞越容易被選中)。通常一個(gè)折中的方法是,將 top-k 設(shè)為 40,這樣模型會(huì)考慮注意力得分排名前 40 位的單詞。


        這樣,模型就完成了一輪迭代,輸出了一個(gè)單詞。模型會(huì)接著不斷迭代,直到生成一個(gè)完整的序列——序列達(dá)到 1024 的長(zhǎng)度上限或序列中產(chǎn)生了一個(gè)終止符。


        第一部分結(jié)語(yǔ):大家好,這就是 GPT-2


        本文是 GPT-2 模型工作原理的一個(gè)概覽。如果你還是對(duì)自注意力層內(nèi)部深層的細(xì)節(jié)很好奇,請(qǐng)繼續(xù)關(guān)注機(jī)器之心的系列文章。我們將引入更多可視化語(yǔ)言來(lái)試著解釋自注意力層的工作原理,同時(shí)也是為了能夠更好地描述之后基于 transformer 的模型(說(shuō)的就是你們,TransformerXL 還有 XLNet)。


        這篇文章中有一些過(guò)分簡(jiǎn)化的地方:


        1. 混用了「單詞」(word)和「詞」(token)這兩個(gè)概念。但事實(shí)上,GPT-2 使用字節(jié)對(duì)編碼(Byte Pair Encoding)方式來(lái)創(chuàng)建詞匯表中的詞(token),也就是說(shuō)詞(token)其實(shí)通常只是單詞的一部分。

        2. 舉的例子其實(shí)是 GPT-2 在「推斷/評(píng)價(jià)」(inference / evaluation)模式下運(yùn)行的流程,所以一次只處理一個(gè)單詞。在訓(xùn)練過(guò)程中,模型會(huì)在更長(zhǎng)的文本序列上進(jìn)行訓(xùn)練,并且一次處理多個(gè)詞(token)。訓(xùn)練過(guò)程的批處理大?。╞atch size)也更大(512),而評(píng)價(jià)時(shí)的批處理大小只有 1。

        3. 為了更好地組織空間中的圖像,作者畫(huà)圖時(shí)隨意轉(zhuǎn)置了向量,但在實(shí)現(xiàn)時(shí)需要更精確。

        4. Transformer 模塊使用了很多歸一化(normalization)層,這在訓(xùn)練中是很關(guān)鍵的。我們?cè)凇窽he Illustrated Transformer」(https://jalammar.github.io/illustrated-transformer/)譯文中提到了其中一些,但本文更關(guān)注自注意力層。

        5. 有時(shí)文章需要用更多的小方塊來(lái)代表一個(gè)向量,我把這些情況叫做「放大」,如下圖所示。









        原文地址:https://jalammar.github.io/illustrated-gpt2/


        國(guó)產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(wàn)(后續(xù))

        年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了

        中國(guó)聯(lián)通官網(wǎng)被發(fā)現(xiàn)含木馬腳本,可向用戶(hù)推廣色情APP

        張一鳴:每個(gè)逆襲的年輕人,都具備的底層能力


        關(guān)


        ,學(xué),西學(xué)學(xué)運(yùn)營(yíng)護(hù)號(hào),樂(lè)質(zhì),結(jié)識(shí),關(guān)[],學(xué)習(xí)進(jìn)!


        瀏覽 32
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

          <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            色噜噜狠狠色综合无码久久欧美 | 欧美日韩黄色小说 | 欧美在线日韩 | 欧美老女人性爱视频网 | 在线观看视频中文字幕 | 男人把我添到了高潮a | bl拍戏被cao翻了h | 一女被多男玩喷潮3p免费 | 久热热热 | 国产尻屄|