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

2021-02-09 機器之心

選自github.io

作者:Jay Alammar

機器之心編譯

參與:陳韻瑩、Geek AI

在本系列文章的第一部分中,我們回顧了 Transformer 的基本工作原理,初步了解了 GPT-2 的內部結構。在本文中,我們將詳細介紹 GPT-2 所使用的自注意力機制,並分享只包含解碼器的 transformer 模型的精彩應用。

第二部分:圖解自注意力機制

在前面的文章中,我們用這張圖來展示了自注意力機制在處理單詞「it」的層中的應用:

在本節中,我們會詳細介紹該過程是如何實現的。請注意,我們將會以試圖弄清單個單詞被如何處理的角度來看待這個問題。這也是我們會展示許多單個向量的原因。這實際上是通過將巨型矩陣相乘來實現的。但是我想直觀地看看,在單詞層面上發生了什麼。

自注意力機制(不使用掩模)

首先,我們將介紹原始的自注意力機制,它是在編碼器模塊裡計算的。先看一個簡易的 transformer 模塊,它一次只能處理 4 個詞(token)。

自注意力機制通過以下三個主要步驟來實現:

1. 為每個路徑創建查詢、鍵和值向量。

2. 對於每個輸入的詞,通過使用其查詢向量與其它所有鍵向量相乘得到注意力得分。

3. 將值向量與它們相應的注意力得分相乘後求和

1. 創建查詢、鍵和值向量

我們重點關注第一條路徑。我們用它的查詢值與其它所有的鍵向量進行比較,這使得每個鍵向量都有一個對應的注意力得分。自注意力機制的第一步就是為每個詞(token)路徑(我們暫且忽略注意力頭)計算三個向量:查詢向量、鍵向量、值向量。

2. 注意力得分

計算出上述三個向量後,我們在第二步中只用查詢向量和鍵向量。我們重點關注第一個詞,將它的查詢向量與其它所有的鍵向量相乘,得到四個詞中的每個詞的注意力得分。

3. 求和

現在,我們可以將注意力得分與值向量相乘。在我們對其求和後,注意力得分較高的值將在結果向量中佔很大的比重。

注意力得分越低,我們在圖中顯示的值向量就越透明。這是為了表明乘以一個小的數是如何削弱向量值的影響的。

如果我們在每一個路徑都執行相同的操作,最終會得到一個表徵每個詞的向量,它包括了這個詞的適當的上下文,然後將這些信息在 transformer 模塊中傳遞給下一個子層(前饋神經網絡):

圖解掩模自注意力機制

現在我們已經介紹了 transformer 模塊中自注意力機制的步驟,接下來我們介紹掩模自注意力機制(masked self-attention)。在掩模自注意力機制中,除了第二步,其餘部分與自注意力機制相同。假設模型輸入只包含兩個詞,我們正在觀察第二個詞。在這種情況下,後兩個詞都被屏蔽了。因此模型會干擾計算注意力得分的步驟。基本上,它總是為序列中後續的詞賦予 0 分的注意力得分,因此模型不會在後續單詞上得到最高的注意力得分:

我們通常使用注意力掩模矩陣來實現這種屏蔽操作。不妨想像一個由四個單詞組成的序列(例如「robot must obey orders」(機器人必須服從命令))在語言建模場景中,這個序列被分成四步進行處理——每個單詞一步(假設現在每個單詞(word)都是一個詞(token))。由於這些模型都是批量執行的,我們假設這個小型模型的批處理大小為 4,它將整個序列(包含 4 步)作為一個批處理。

在矩陣形式中,我們通過將查詢矩陣和鍵矩陣相乘來計算注意力得分。該過程的可視化結果如下所示,下圖使用的是與單元格中該單詞相關聯的查詢(或鍵)向量,而不是單詞本身:

在相乘之後,我們加上注意力掩模三角矩陣。它將我們想要屏蔽的單元格設置為負無窮或非常大的負數(例如,在 GPT2 中為 -10 億):

然後,對每一行執行 softmax 操作,從而得到我們在自注意力機制中實際使用的注意力得分:


此分數表的含義如下:

GPT-2 的掩模自注意力機制

接下來,我們將更詳細地分析 GPT-2 的掩模自注意力機制。

1. 模型評價時:一次只處理一個詞

我們可以通過掩模自注意機制的方式執行 GPT-2。但是在模型評價時,當我們的模型每輪迭代後只增加一個新單詞時,沿著先前已經處理過的路徑再重新計算詞(tokrn)的自注意力是效率極低的。

在這種情況下,我們處理第一個詞(暫時忽略 <s>)

GPT-2 保存了詞「a」的鍵向量和值向量。每個自注意力層包括了該詞相應的鍵和值向量:

在下一次迭代中,當模型處理單詞「robot」時,它不再需要為詞「a」生成查詢、鍵和值向量。它只需要復用第一次迭代中保存的向量:

現在,在下一次迭代中,當模型處理單詞 robot 時,它不再需要為 token「a」生成查詢、鍵和值向量。它只需要復用第一次迭代中保存的向量:

2. GPT-2 自注意力機制:1-創建查詢、鍵和值

假設模型正在處理單詞「it」。對於下圖中底部的模塊來說,它對該詞的輸入則是「it」的嵌入向量+序列中第九個位置的位置編碼:

Transformer 中的每個模塊都有自己的權重(之後會詳細分析)。我們首先看到的是用於創建查詢、鍵和值的權重矩陣。

自注意力機制將它的輸入與權重矩陣相乘(並加上一個偏置向量,這裡不作圖示)。

相乘後得到的向量從基本就是單詞「it」的查詢、鍵和值向量連接 的結果。

將輸入向量和注意力權重向量相乘(之後加上偏置向量)得到這個詞的鍵、值和查詢向量。

3. GPT-2 自注意力機制:1.5-分裂成注意力頭

在前面的示例中,我們直接介紹了自注意力機制而忽略了「多頭」的部分。現在,對這部分概念有所了解會大有用處。自注意力機制是在查詢(Q)、鍵(K)、值(V)向量的不同部分多次進行的。「分裂」注意力頭指的是,簡單地將長向量重塑成矩陣形式。在小型的 GPT-2 中,有 12 個注意力頭,因此這是重塑矩陣中的第一維:

在前面的示例中,我們介紹了一個注意力頭的情況。多個注意力頭可以想像成這樣(下圖為 12 個注意力頭中的 3 個的可視化結果):

4. GPT-2 自注意力機制:2-計算注意力得分

我們接下來介紹計算注意力得分的過程——此時我們只關注一個注意力頭(其它注意力頭都進行類似的操作)。

當前關注的詞(token)可以對與其它鍵詞的鍵向量相乘得到注意力得分(在先前迭代中的第一個注意力頭中計算得到):

5. GPT-2 自注意力機制:3-求和

正如前文所述,我們現在可以將每個值向量乘上它的注意力得分,然後求和,得到的是第一個注意力頭的自注意力結果:

6. GPT-2 自注意力機制:3.5-合併多個注意力頭

我們處理多個注意力頭的方式是先將它們連接成一個向量:

但是這個向量還不能被傳遞到下一個子層。我們首先需要將這個隱含狀態的混合向量轉變成同質的表示形式。

7. GPT-2 自注意力機制:4-投影

我們將讓模型學習如何最好地將連接好的自注意力結果映射到一個前饋神經網絡可以處理的向量。下面是我們的第二個大型權重矩陣,它將注意力頭的結果投影到自注意力子層的輸出向量中:

通過這個操作,我們可以生成能夠傳遞給下一層的向量:

8. GPT-2 全連神經網絡:第一層

在全連接神經網絡中,當自注意力機制已經將合適的上下文包含在其表徵中之後,模塊會處理它的輸入詞。它由兩層組成:第一層的大小是模型的 4 倍(因為小型 GPT-2 的大小為 768 個單元,而這個網絡將有 768*4=3072 個單元)。為什麼是 4 倍呢?這只是原始 transformer 的運行大小(模型維度為 512 而模型的第一層為 2048)。這似乎給 transformer 模型足夠的表徵容量來處理目前面對的任務。

9. GPT-2 全連神經網絡:第二層-投影到模型的維度

第二層將第一層的結果投影回模型的維度大小(小型 GPT-2 的大小為 768)。這個乘法結果是該詞經過 transformer 模塊處理的結果。

你成功處理完單詞「it」了!

我們儘可能詳細地介紹了 transformer 模塊。現在,你已經基本掌握了 transformer 語言模型內部發生的絕大部分情況了。回顧一下,一個新的輸入向量會遇到如下所示的權重矩陣:

而且每個模塊都有自己的一組權重。另一方面,這個模型只有一個詞嵌入矩陣和一個位置編碼矩陣:

如果你想了解模型中的所有參數,下面是對它們的詳細統計結果:

出於某些原因,該模型共計有 1 億 2,400 萬個參數而不是 1 億 1,700 萬個。我不確定這是為什麼,但是這似乎就是發布的代碼中的數目(如果本文統計有誤,請讀者指正)。

第三部分:語言建模之外

只包含解碼器的 transformer 不斷地表現出在語言建模之外的應用前景。在許多應用程式中,這類模型已經取得了成功,它可以用與上面類似的可視化圖表來描述。在文章的最後,讓我們一起來回顧一下其中的一些應用。

機器翻譯

進行翻譯時,模型不需要編碼器。同樣的任務可以通過一個只有解碼器的 transformer 來解決:

自動摘要生成

這是第一個訓練只包含解碼器的 transformer 的任務。也就是說,該模型被訓練來閱讀維基百科的文章(沒有目錄前的開頭部分),然後生成摘要。文章實際的開頭部分被用作訓練數據集的標籤:

論文使用維基百科的文章對模型進行了訓練,訓練好的模型能夠生成文章的摘要:

遷移學習

在論文「Sample Efficient Text Summarization Using a Single Pre-Trained Transformer」(https://arxiv.org/abs/1905.08836)中,首先使用只包含解碼器的 transformer 在語言建模任務中進行預訓練,然後通過調優來完成摘要生成任務。結果表明,在數據有限的情況下,該方案比預訓練好的編碼器-解碼器 transformer 得到了更好的效果。

GPT2 的論文也展示了對語言建模模型進行預訓練後取得的摘要生成效果。

音樂生成

音樂 transformer(https://magenta.tensorflow.org/music-transformer)採用了只包含解碼器的 transformer (https://magenta.tensorflow.org/music-transformer%EF%BC%89%E9%87%87%E7%94%A8%E4%BA%86%E5%8F%AA%E5%8C%85%E5%90%AB%E8%A7%A3%E7%A0%81%E5%99%A8%E7%9A%84transformer) 來生成具有豐富節奏和動感的音樂。和語言建模相似,「音樂建模」就是讓模型以一種無監督的方式學習音樂,然後讓它輸出樣本(我們此前稱之為「隨機工作」)。

 

你可能會好奇,在這種情境下是如何表徵音樂的?請記住,語言建模可以通過對字符、單詞(word)、或單詞(word)某個部分的詞(token)的向量表徵來實現。面對一段音樂演奏(暫時以鋼琴為例),我們不僅要表徵這些音符,還要表徵速度——衡量鋼琴按鍵力度的指標。

一段演奏可以被表徵為一系列的 one-hot 向量。一個 MIDI 文件可以被轉換成這樣的格式。論文中展示了如下所示的輸入序列的示例:

這個輸入序列的 one-hot 向量表徵如下:

我喜歡論文中用來展示音樂 transformer 中自注意力機制的可視化圖表。我在這裡加了一些注釋:

這段作品中出現了反覆出現的三角輪廓。當前的查詢向量位於後面一個「高峰」,它關注前面所有高峰上的高音,一直到樂曲的開頭。圖中顯示了一個查詢向量(所有的注意力線來源)和正要處理的以前的記憶(突出了有更高 softmax 概率的音符)。注意力線的顏色對應於不同的注意力頭,而寬度對應於 softmax 概率的權重。

如果你想進一步了解這種音符的表徵,請觀看下面的視頻:https://www.youtube.com/watch?v=ipzR9bhei_o

結語 

至此,我們的 GPT-2 的完全解讀,以及對父類模型(只包含解碼器的 transformer)的分析就到此結束了。希望讀者能通過這篇文章對自注意力機制有更好的理解。在了解了 transformer 內部的工作原理之後,下次再遇到它,你將更加得心應手。

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

✄---加入機器之心(全職記者 / 實習生):hr@jiqizhixin.com投稿或尋求報導:content@jiqizhixin.com廣告 & 商務合作:bd@jiqizhixin.com

相關焦點

  • 完全圖解GPT-2:看完這篇就夠了(一)
    本文將帶你一起探索取得優異性能的 GPT-2 模型架構,重點闡釋其中關鍵的自注意力(self-attention)層,並且看一看 GPT-2 採用的只有解碼器的 transformer 架構在語言建模之外的應用。
  • 五行代碼玩轉GPT-2,新加坡高中生開源輕量級GPT-2「客戶端」
    魚羊 發自 凹非寺量子位 報導 | 公眾號 QbitAIOpenAI會講故事的文本生成模型GPT-2,現在有了更易用的封裝版本。輕鬆上手,輕量級,速度快。這就是這隻名叫gpt2-client的包裝器的突出特性。
  • 圖解OpenAI的秘密武器GPT-2:可視化Transformer語言模型
    在這篇文章中,我們將介紹什麼樣的結構能夠讓模型產生好的結果,深入研究模型中的self-attention層,此外,我們將研究除語言建模之外的Transformer模型Decoder結構的應用。我寫本文主要是為了補充我之前的「圖解Transformer模型」系列。
  • 只需單擊三次,讓中文GPT-2為你生成定製故事
    項目地址:https://github.com/imcaspar/gpt2-mlColab 演示地址:https://colab.research.google.com/github/imcaspar/gpt2-ml/blob/master/pretrained_model_demo.ipynb既然昨天才過完雙十一,那麼我們先看看這個預訓練模型能生成什麼樣的故事
  • OpenAI「假新聞」生成器GPT-2的最簡Python實現
    這是一個簡單的 Python 軟體包,它封裝了 OpenAI GPT-2 文本生成模型(特別是它是具有 1.17 億超參數的「較小」版本)的現有模型微調和生成腳本。此外,這個軟體包讓我們可以更容易地生成文本,生成一個文件以便於管理,從而允許前綴強制文本以給定的短語開頭。
  • OpenAI的GPT-2:用Python構建世界上最先進的文本生成器
    這並不是某位總統或首相,當然也不是像Raghuram Rajan那樣的頂尖經濟學家說出來的。這句話是由我們的機器產生的!是的,你沒聽錯,這是一個在OpenAI的GPT-2框架上訓練的自然語言處理(NLP)模型訓練「說出」了這句話。所以你現在覺得機器學習的狀態完全在另一個層次上了嗎?在NLP真正的黃金時代,OpenAI的GPT-2改變了我們處理文本數據的方式。
  • 如何用 GPT2 和 BERT 建立一個可信的 reddit 自動回復機器人?
    以下是我將在這篇文章中解釋的步驟。我不是一個深度學習專家,但幸運的是,對我來說,一個非常優秀的專家已經建立了一些非常簡單的打包好的實用程序,它就是 gpt-2-simple,可以用於微調 gpt-2,是不是很簡單?!最棒的是,gpt-2-simple 的作者甚至建立了一個經過微調的 Google Colab notebook。
  • GPT-2沒什麼神奇的,PyTorch 就可以復現代碼
    ——Jeffrey Friedl 在《Mastering Regular Expressions》一書中寫道              GPT-2 一開始看起來像是魔術,它的看起來太美麗了,但希望我能為你解釋魔術,在你讀完這篇文章時揭示所有的技巧,這是我的目標。使那些熱衷於理解 GPT-2 模型是如何工作的人更好理解。
  • 圖解老面饅頭的製作方法(續:答疑篇)
    昨天發了一篇關於老面饅頭製作的文章,發完之後有很多朋友問了很多的問題,今天把問題匯總了一下,算是給昨天文章做個補充,希望對大家有幫助。
  • <1>教你學看鉤針圖解!鉤針新手篇:符號
    有人問:我只是想學鉤針,為什麼還需要看圖解呢?簡單說,任何一個精緻的鉤針作品背後都有一個精密無誤的圖解結構。好比你要起樓房,你總要有圖紙吧。那圖解要怎麼看呢?圖解是由一個個不同形狀的小符號組成,當你看不懂圖解時候,你會有密集恐懼地感覺;當你學會看符號以後,就像看中文一樣順暢。所以你找到看圖解的秘訣了嗎?就是學會每一個針法符號!圖解的能拆分成一個個符號,1個符號代表一種針法。符號可以由1個針法構成,也可以多個針法構成。
  • 「看這篇就夠了」Mysql join條件是要寫在on裡還是在where裡?
    我們先建兩個表和添加一批數據,注意只有a表的f1有索引,a表和B表的數據不完全一致:結果集區別上圖可以看出,結果集是不一樣的,條件寫在ON裡,數據有6條,比條件放在where裡面多出2條。「看這篇就夠了」Mysql大表中查詢全表掃描是否會佔用完內存?
  • 科目二S彎實操技巧圖解,一看就懂!
    評論:0科目二S彎實操技巧圖解,一看就懂!1/ 7科目二S彎實操技巧圖解,一看就懂! 2、當左邊引擎蓋的縫隙貼到右黃線的時候,方向盤向左打一圈,成功順利的通過第一個彎。 3、當車子過完第一個彎,車身回正的時候,方法如同剛第一個彎進來一樣,這次我們看引擎蓋右邊的縫隙和左邊的黃線碰到的時候,方向盤向右打一圈,如果方向盤打早了,或者打晚了,有所偏差,可以90度之間來進行修正,跟著邊線行駛就可以
  • 肝癌患者的肝功能維護,看完這篇就夠了 | CLDW 2020
    圖1 肝癌的治療手段肝癌的治療手段多樣,各類肝癌治療措施對患者的肝功能均有一定要求,這是因為各類治療均可能對肝癌患者的肝功能帶來損傷,而部分肝癌患者發現時已處於晚期,本身即存在肝功能不全。下面我們來具體看一下不同治療措施對肝功能的要求。A.手術切除對肝功能的要求肝臟儲備功能良好;Child-Paugh A級;ICG 15(靛氰綠排洩試驗)<30%;正常肝組織的30%或肝硬變組織的50%。
  • 看完這篇文章就夠啦
    希望我的這篇文章能夠幫到大家,少走一些彎路。我當年高考是610分,而我去的學校投檔線(最低錄取分數線)是605,我有幸進了該校的王牌專業(一般分數較高)。雖然我成績不怎麼樣,但是在填報志願這方面至少還是沒有失誤。這個分和這個學校,是對等的。在這裡肯定要感謝我兄弟旺財和旺財他爸常叔,在這方面給了我很多指導性建議。
  • 模擬風洞完全圖解,看完就懂
    全文原創,本號版權所有,侵權必究前言:本文採用虛擬風洞對NASA真實翼型機翼進行吹風演示,直觀明了,完全圖解機翼升力產生原理,乾貨滿滿,敬請讀者收藏轉發從基本原理上來說,這話是沒錯的,但是放到實際問題中一看,這句話就存在很多疑點了,比如說:機翼真的是上表面弧度大嗎?
  • 面試圖解電影時,我提出了這4種意見
    這篇文章是我去年在面試圖解電影後,把面試的經歷再加上回來自己的總結而成,那時候初稿沒怎麼完善,也不知道人人都是產品經理註冊後就能夠投稿。今年4月份的時候,我把這篇文章重新整理後,直接在微博@了圖解電影CEO,將之前的文章連結發給了他,在後面App的新版本中,發現自己寫的2條產品建議被採納了,能看到自己的想法被實現,這大概是最能讓我驚喜的吧。最近,我去面試了圖解電影,之前雖然有看過電影圖解這種形式,也有用過他們的產品,但用的不多,在準備面試的過程中,讓我對這款產品有了如下的思考。
  • 這款「狗屁不通」文章生成器火了,效果確實比GPT 2差太遠
    ,本來很簡單的一個問題,但是回答中很多跑偏題的,於是本項目的貢獻者之一表示看不下去了,並「隨便寫了個項目」:狗屁不通文章生成器,幫助這位同學寫了一篇退會申請。 用 Python 生成的這篇文章長這樣:
  • 200集photoshop入門教程分享,看完這篇你就夠了
    200集photoshop入門教程分享,看完這篇你就夠了 多數想學ps的人基礎都沒有打牢,就想學更高級的課程,這會導致整個學習過程非常緩慢,最後學無所成。因為基礎對PS學者來說太重要了,有些人連最基本的工具都不知道怎麼用,就想學創意合成和高級調色,總以為高級的課程,會講解的更加深入和詳細一些。其實不然。
  • gpt分區安裝win7系統詳細方法
    很多朋友不知道gpt分區安裝win7系統的方法,其實操作還是很簡單的,下面就給您帶來gpt分區安裝win764位的方法。gpt分區安裝win7系統方法1.首先製作好u盤啟動盤,推薦使用裝機吧u盤啟動盤,具體製作方法可以百度搜索一下。
  • 兒童補鈣,看這篇就夠了
    到二十幾歲時,男性和女性都達到了峰值骨量。而峰值骨量的高低,會影響你一生的骨健康,峰值骨量越高,今後的骨健康越好。根據美國國立衛生研究院(簡稱NIH)的研究顯示,人在不同的階段都必須有充足的鈣攝入,鈣是維持骨量峰值以及預防骨質疏鬆的重要營養元素。