HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運營
CASE 服務(wù)案例
NEWS 熱點資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    gpt3和transformer的關(guān)系(gpt transformer)

    發(fā)布時間:2023-03-13 01:58:42     稿源: 創(chuàng)意嶺    閱讀: 93        問大家

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于gpt3和transformer的關(guān)系的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    ChatGPT國內(nèi)免費在線使用,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端

    官網(wǎng):https://ai.de1919.com

    本文目錄:

    gpt3和transformer的關(guān)系(gpt transformer)

    一、BERT詳解(附帶ELMo、GPT 介紹)

    首先我會詳細闡述 BERT 原理,然后簡單介紹一下 ELMO 以及 GPT

    BERT 全稱為 B idirectional E ncoder R epresentation from T ransformer,是 Google 以 無監(jiān)督的方式利用大量無標注文本 「煉成」的語言模型,其架構(gòu)為 Transformer 中的 Encoder(BERT=Encoder of Transformer)

    我在 Transformer 詳解 中已經(jīng)詳細的解釋了所有 Transformer 的相關(guān)概念,這里就不再贅述

    以往為了解決不同的 NLP 任務(wù),我們會為該任務(wù)設(shè)計一個最合適的神經(jīng)網(wǎng)絡(luò)架構(gòu)并做訓練,以下是一些簡單的例子

    不同的 NLP 任務(wù)通常需要不同的模型,而設(shè)計這些模型并測試其 performance 是非常耗成本的(人力,時間,計算資源)。如果有一個能 直接處理各式 NLP 任務(wù)的通用架構(gòu) 該有多好?

    隨著時代演進,不少人很自然地有了這樣子的想法,而 BERT 就是其中一個將此概念付諸實踐的例子

    Google 在預(yù)訓練 BERT 時讓它同時進行兩個任務(wù):

    1. 漏字填空

    2. 下個句子預(yù)測

    對正常人來說,要完成這兩個任務(wù)非常簡單。只要稍微看一下前后文就知道完形填空任務(wù)中 [MASK] 里應(yīng)該填 退了 ;而 醒醒吧 后面接 你沒有妹妹 也十分合理(?)

    接下來我會分別詳細介紹論文中這兩個任務(wù)的設(shè)計細節(jié)

    在 BERT 中,Masked LM(Masked Language Model)構(gòu)建了語言模型,簡單來說,就是 隨機遮蓋或替換 一句話里面的任意字或詞,然后讓模型通過上下文預(yù)測那一個被遮蓋或替換的部分,之后 做 Loss 的時候也只計算被遮蓋部分的 Loss ,這其實是一個很容易理解的任務(wù),實際操作如下:

    這樣做的好處是,BERT 并不知道 [MASK] 替換的是哪一個詞,而且 任何一個詞都有可能是被替換掉的,比如它看到的 apple 可能是被替換的詞 。這樣強迫模型在編碼當前時刻詞的時候 不能太依賴當前的詞 ,而要考慮它的上下文,甚至根據(jù)上下文進行 "糾錯"。比如上面的例子中,模型在編碼 apple 時,根據(jù)上下文 my dog is,應(yīng)該 把 apple 編碼成 hairy 的語義而不是 apple 的語義

    我們首先拿到屬于上下文的一對句子,也就是兩個句子,之后我們要在這兩個句子中加一些特殊的 token: [CLS]上一句話[SEP]下一句話[SEP] 。也就是在句子開頭加一個 [CLS] ,在兩句話之間和句末加 [SEP] ,具體地如下圖所示

    可以看到,上圖中的兩句話明顯是連續(xù)的。如果現(xiàn)在有這么一句話 [CLS] 我的狗很可愛 [SEP] 企鵝不擅長飛行 [SEP] ,可見這兩句話就 不是連續(xù)的 。在實際訓練中,我們會讓這兩種情況出現(xiàn)的數(shù)量為** 1:1**

    Token Embedding 就是正常的詞向量,即 PyTorch 中的 nn.Embedding()

    Segment Embedding 的作用是用 embedding 的信息讓模型 分開上下句 ,我們給上句的 token 全 0,下句的 token 全 1,讓模型得以判斷上下句的起止位置,例如

    Position Embedding 和 Transformer 中的不一樣,不是三角函數(shù),而是 學習出來的

    BERT 預(yù)訓練階段實際上是將上述兩個任務(wù)結(jié)合起來,同時進行,然后將所有的 Loss 相加,例如

    BERT 的 Fine-Tuning 共分為 4 種類型,以下內(nèi)容、圖片均來自臺大李宏毅老師 Machine Learning 課程 (以下內(nèi)容 圖在上,解釋在下)

    為什么要用CLS?

    這里李宏毅老師有一點沒講到,就是為什么要用第一個位置,即 [CLS] 位置的 output。這里我看了網(wǎng)上的一些博客,結(jié)合自己的理解解釋一下。因為 BERT 內(nèi)部是 Transformer,而 Transformer 內(nèi)部又是 Self-Attention, 所以 [CLS] 的 output 里面肯定含有整句話的完整信息 ,這是毋庸置疑的。但是 Self-Attention 向量中,自己和自己的值其實是占大頭的,現(xiàn)在假設(shè)使用 的 output 做分類,那么這個 output 中實際上會更加看重 ,而 又是一個有實際意義的字或詞,這樣難免會影響到最終的結(jié)果。但是 [CLS] 是沒有任何實際意義的,只是一個占位符而已,所以就算 [CLS] 的 output 中自己的值占大頭也無所謂。當然你 也可以將所有詞的 output 進行 concat,作為最終的 output

    首先將問題和文章通過 [SEP] 分隔,送入 BERT 之后,得到上圖中黃色的輸出。此時我們還要訓練兩個 vector,即上圖中橙色和黃色的向量。首先將橙色和所有的黃色向量進行 dot product,然后通過 softmax,看哪一個輸出的值最大,例如上圖中 對應(yīng)的輸出概率最大,那我們就認為 s=2

    同樣地,我們用藍色的向量和所有黃色向量進行 dot product,最終預(yù)測得 的概率最大,因此 e=3。最終,答案就是 s=2,e=3

    你可能會覺得這里面有個問題,假設(shè)最終的輸出 s>e 怎么辦,那不就矛盾了嗎?其實在某些訓練集里,有的問題就是沒有答案的,因此此時的預(yù)測搞不好是對的,就是沒有答案

    以上就是 BERT 的詳細介紹,參考以下文章

    ELMo是Embedding from language Model的縮寫,它通過無監(jiān)督的方式對語言模型進行預(yù)訓練來學習單詞表示

    這篇論文的想法其實非常簡單,但是效果卻很好。它的思路是用 深度的雙向 Language Model 在大量未標注數(shù)據(jù)上訓練語言模型 ,如下圖所示

    在實際任務(wù)中,對于輸入的句子,我們使用上面的語言模型來處理它,得到輸出向量,因此這可以看作是一種 特征提取 。但是 ELMo 與普通的 Word2Vec 或 GloVe 不同,ELMo 得到的 Embedding 是 有上下文信息

    具體來說,給定一個長度為 N 的句子,假設(shè)為 ,語言模型會計算給定 的條件下出現(xiàn) 的概率:

    傳統(tǒng)的 N-gram 模型 不能考慮很長的歷史 ,因此現(xiàn)在的主流是使用 多層雙向 LSTM 。在時刻 ,LSTM 的第 層會輸出一個隱狀態(tài) ,其中 , 是 LSTM 的層數(shù)。最上層是 ,對它進行 softmax 之后得到輸出詞的概率

    類似的,我們可以用 一個反向 來計算概率:

    通過這個 LSTM,我們可以得到 。我們的損失函數(shù)是這兩個 LSTM 的 加和 :

    這兩個 LSTM 有各自的參數(shù) 和 ,而 Word Embedding 參數(shù) 和 Softmax 參數(shù) 是共享的

    為了用于下游(DownStream)的特定任務(wù),我們會把不同層的隱狀態(tài)組合起來,具體組合的參數(shù)是根據(jù)不同的特定任務(wù)學習出來的,公式如下:

    GPT 得到的語言模型參數(shù)不是固定的,它會根據(jù)特定的任務(wù)進行調(diào)整(通常是微調(diào)),這樣的到的句子表示能更好的適配特定任務(wù)。它的思想也很簡單,使用 單向 Transformer 學習一個語言模型 ,對句子進行無監(jiān)督的 Embedding,然后 根據(jù)具體任務(wù)對 Transformer 的參數(shù)進行微調(diào) 。GPT 與 ELMo 有兩個主要的區(qū)別:

    這里解釋一下上面提到的 單向 Transformer 。在 Transformer 的文章中,提到了 Encoder 與 Decoder 使用的 Transformer Block 是不同的。在 Decoder Block 中,使用了 Masked Self-Attention ,即句子中的每個詞都只能對 包括自己在內(nèi)的前面所有詞進行 Attention ,這就是單向 Transformer。GPT 使用的 Transformer 結(jié)構(gòu)就是將 Encoder 中的 Self-Attention 替換成了 Masked Self-Attention ,具體結(jié)構(gòu)如下圖所示

    訓練的過程也非常簡單,就是將 n 個詞的詞嵌入 ( ) 加上位置嵌入 ( ),然后輸入到 Transformer 中,n 個輸出分別預(yù)測該位置的下一個詞

    這里的位置編碼沒有使用傳統(tǒng) Transformer 固定編碼的方式,而是動態(tài)學習的

    Pretraining 之后,我們還需要針對特定任務(wù)進行 Fine-Tuning。假設(shè)監(jiān)督數(shù)據(jù)集合 的輸入 是一個詞序列 ,輸出是一個分類的標簽 ,比如情感分類任務(wù)

    我們把 輸入 Transformer 模型,得到最上層最后一個時刻的輸出 ,將其通過我們新增的一個 Softmax 層(參數(shù)為 )進行分類,最后用 CrossEntropyLoss 計算損失,從而根據(jù)標準數(shù)據(jù)調(diào)整 Transformer 的參數(shù)以及 Softmax 的參數(shù) 。這等價于最大似然估計:

    正常來說,我們應(yīng)該調(diào)整參數(shù)使得 最大,但是 為了提高訓練速度和模型的泛化能力 ,我們使用 Multi-Task Learning,同時讓它最大似然 和

    這里使用的 還是之前語言模型的損失(似然),但是使用的數(shù)據(jù)不是前面無監(jiān)督的數(shù)據(jù) ,而是使用當前任務(wù)的數(shù)據(jù) ,而且只使用其中的 ,而不需要標簽

    針對不同任務(wù),需要簡單修改下輸入數(shù)據(jù)的格式,例如對于相似度計算或問答,輸入是兩個序列,為了能夠使用 GPT,我們需要一些特殊的技巧把兩個輸入序列變成一個輸入序列

    ELMo 和 GPT 最大的問題就是 傳統(tǒng)的語言模型是單向的 —— 我們根據(jù)之前的歷史來預(yù)測當前詞。但是我們不能利用后面的信息。比如句子 The animal didn’t cross the street because it was too tired 。我們在編碼 it 的語義的時候需要同時利用前后的信息,因為在這個句子中, it 可能指代 animal 也可能指代 street 。根據(jù) tired ,我們推斷它指代的是 animal 。但是如果把 tired 改成 wide ,那么 it 就是指代 street 了。傳統(tǒng)的語言模型,都 只能利用單方向的信息 。比如前向的 RNN,在編碼 it 的時候它看到了 animal 和 street ,但是它還沒有看到 tired ,因此它不能確定 it 到底指代什么。如果是后向的 RNN,在編碼的時候它看到了 tired ,但是它還根本沒看到 animal ,因此它也不能知道指代的是 animal 。 Transformer 的 Self-Attention 理論上是可以同時關(guān)注到這兩個詞的,但是根據(jù)前面的介紹,為了使用 Transformer 學習語言模型,必須 用 Mask 來讓它看不到未來的信息 ,所以它也不能解決這個問題的

    根據(jù)上文內(nèi)容預(yù)測下一個可能跟隨的單詞,就是常說的自左向右的語言模型任務(wù),或者反過來也行,就是根據(jù)下文預(yù)測前面的單詞,這種類型的LM被稱為自回歸語言模型。(GPT,ELMO)GPT 就是典型的自回歸語言模型。ELMO盡管看上去利用了上文,也利用了下文,但是本質(zhì)上仍然是自回歸LM,這個跟模型具體怎么實現(xiàn)有關(guān)系。ELMO是做了兩個方向(從左到右以及從右到左兩個方向的語言模型),但是是分別有兩個方向的自回歸LM,然后把LSTM的兩個方向的隱節(jié)點狀態(tài)拼接到一起,來體現(xiàn)雙向語言模型這個事情的。所以其實是兩個自回歸語言模型的拼接,本質(zhì)上仍然是自回歸語言模型。

    自回歸語言模型有優(yōu)點有缺點,缺點是只能利用上文或者下文的信息,不能同時利用上文和下文的信息,當然,貌似ELMO這種雙向都做,然后拼接看上去能夠解決這個問題,因為融合模式過于簡單,所以效果其實并不是太好。它的優(yōu)點,其實跟下游NLP任務(wù)有關(guān),比如生成類NLP任務(wù),比如文本摘要,機器翻譯等,在實際生成內(nèi)容的時候,就是從左向右的, 自回歸語言模型天然匹配這個過程 。而Bert這種DAE模式,在生成類NLP任務(wù)中,就面臨訓練過程和應(yīng)用過程不一致的問題,導致 生成類的NLP任務(wù)到目前為止都做不太好 。

    自回歸語言模型只能根據(jù)上文預(yù)測下一個單詞,或者反過來,只能根據(jù)下文預(yù)測前面一個單詞。相比而言,Bert通過 在輸入X中隨機Mask掉一部分單詞 ,然后預(yù)訓練過程的主要任務(wù)之一是根據(jù)上下文單詞來預(yù)測這些被Mask掉的單詞,如果你對Denoising Autoencoder比較熟悉的話,會看出,這確實是典型的DAE的思路。那些被Mask掉的單詞就是在輸入側(cè)加入的所謂噪音。類似Bert這種預(yù)訓練模式,被稱為DAE LM。

    這種DAE LM的優(yōu)缺點正好和自回歸LM反過來,它能比較自然地融入雙向語言模型,同時看到被預(yù)測單詞的上文和下文,這是好處。缺點是啥呢? 主要在輸入側(cè)引入[Mask]標記,導致預(yù)訓練階段和Fine-tuning階段不一致的問題 ,因為Fine-tuning階段是看不到[Mask]標記的。DAE嗎,就要引入噪音,[Mask] 標記就是引入噪音的手段,這個正常。

    XLNet的出發(fā)點就是:能否 融合自回歸LM和DAE LM兩者的優(yōu)點 。就是說如果站在自回歸LM的角度,如何引入和雙向語言模型等價的效果;如果站在DAE LM的角度看,它本身是融入雙向語言模型的,如何拋掉表面的那個[Mask]標記,讓預(yù)訓練和Fine-tuning保持一致。當然,XLNet還講到了一個Bert被Mask單詞之間相互獨立的問題。

    二、為什么說Transformer的注意力機制是相對廉價的?注意力機制相對更對于RNN系列及CNN系列算法有何優(yōu)勢?

    QA形式對自然語言處理中注意力機制(Attention)進行總結(jié),并對Transformer進行深入解析。

    二、Transformer(Attention Is All You Need)詳解

    1、Transformer的整體架構(gòu)是怎樣的?由哪些部分組成?

    2、Transformer Encoder 與 Transformer Decoder 有哪些不同?

    3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?

    4、multi-head self-attention mechanism具體的計算過程是怎樣的?

    5、Transformer在GPT和Bert等詞向量預(yù)訓練模型中具體是怎么應(yīng)用的?有什么變化?

    一、Attention機制剖析

    1、為什么要引入Attention機制?

    根據(jù)通用近似定理,前饋網(wǎng)絡(luò)和循環(huán)網(wǎng)絡(luò)都有很強的能力。但為什么還要引入注意力機制呢?

    • 計算能力的限制:當要記住很多“信息“,模型就要變得更復(fù)雜,然而目前計算能力依然是限制神經(jīng)網(wǎng)絡(luò)發(fā)展的瓶頸。

    • 優(yōu)化算法的限制:雖然局部連接、權(quán)重共享以及pooling等優(yōu)化操作可以讓神經(jīng)網(wǎng)絡(luò)變得簡單一些,有效緩解模型復(fù)雜度和表達能力之間的矛盾;但是,如循環(huán)神經(jīng)網(wǎng)絡(luò)中的長距離以來問題,信息“記憶”能力并不高。

    • 可以借助人腦處理信息過載的方式,例如Attention機制可以提高神經(jīng)網(wǎng)絡(luò)處理信息的能力。

      2、Attention機制有哪些?(怎么分類?)

      當用神經(jīng)網(wǎng)絡(luò)來處理大量的輸入信息時,也可以借鑒人腦的注意力機制,只 選擇一些關(guān)鍵的信息輸入進行處理,來提高神經(jīng)網(wǎng)絡(luò)的效率。按照認知神經(jīng)學中的注意力,可以總體上分為兩類:

    • 聚焦式(focus)注意力:自上而下的有意識的注意力,主動注意——是指有預(yù)定目的、依賴任務(wù)的、主動有意識地聚焦于某一對象的注意力;

    • 顯著性(saliency-based)注意力:自下而上的有意識的注意力,被動注意——基于顯著性的注意力是由外界刺激驅(qū)動的注意,不需要主動干預(yù),也和任務(wù)無關(guān);可以將max-pooling和門控(gating)機制來近似地看作是自下而上的基于顯著性的注意力機制。

    • 在人工神經(jīng)網(wǎng)絡(luò)中,注意力機制一般就特指聚焦式注意力。

      3、Attention機制的計算流程是怎樣的?

    • Attention機制的實質(zhì):尋址(addressing)
    • Attention機制的實質(zhì)其實就是一個尋址(addressing)的過程,如上圖所示:給定一個和任務(wù)相關(guān)的查詢Query向量 q,通過計算與Key的注意力分布并附加在Value上,從而計算Attention Value,這個過程實際上是Attention機制緩解神經(jīng)網(wǎng)絡(luò)模型復(fù)雜度的體現(xiàn):不需要將所有的N個輸入信息都輸入到神經(jīng)網(wǎng)絡(luò)進行計算,只需要從X中選擇一些和任務(wù)相關(guān)的信息輸入給神經(jīng)網(wǎng)絡(luò)。

    • 注意力機制可以分為三步:一是信息輸入;二是計算注意力分布α;三是根據(jù)注意力分布α 來計算輸入信息的加權(quán)平均。
    • step1-信息輸入:用X = [x1, · · · , xN ]表示N 個輸入信息;

      step2-注意力分布計算:令Key=Value=X,則可以給出注意力分布

      我們將  稱之為注意力分布(概率分布),  為注意力打分機制,有幾種打分機制:

      step3-信息加權(quán)平均:注意力分布  可以解釋為在上下文查詢q時,第i個信息受關(guān)注的程度,采用一種“軟性”的信息選擇機制對輸入信息X進行編碼為:

      這種編碼方式為軟性注意力機制(soft Attention),軟性注意力機制有兩種:普通模式(Key=Value=X)和鍵值對模式(Key!=Value)。

    • 軟性注意力機制(soft Attention)
    • 4、Attention機制的變種有哪些?

      與普通的Attention機制(上圖左)相比,Attention機制有哪些變種呢?

    • 變種1-硬性注意力:之前提到的注意力是軟性注意力,其選擇的信息是所有輸入信息在注意力 分布下的期望。還有一種注意力是只關(guān)注到某一個位置上的信息,叫做硬性注意力(hard attention)。硬性注意力有兩種實現(xiàn)方式:(1)一種是選取最高概率的輸入信息;(2)另一種硬性注意力可以通過在注意力分布式上隨機采樣的方式實現(xiàn)。硬性注意力模型的缺點:

    • 硬性注意力的一個缺點是基于最大采樣或隨機采樣的方式來選擇信息。因此最終的損失函數(shù)與注意力分布之間的函數(shù)關(guān)系不可導,因此無法使用在反向傳播算法進行訓練。為了使用反向傳播算法,一般使用軟性注意力來代替硬性注意力。硬性注意力需要通過強化學習來進行訓練。——《神經(jīng)網(wǎng)絡(luò)與深度學習》
    • 變種2-鍵值對注意力:即上圖右邊的鍵值對模式,此時Key!=Value,注意力函數(shù)變?yōu)椋?/p>

    • 變種3-多頭注意力:多頭注意力(multi-head attention)是利用多個查詢Q = [q1, · · · , qM],來平行地計算從輸入信息中選取多個信息。每個注意力關(guān)注輸入信息的不同部分,然后再進行拼接:

    • 5、一種強大的Attention機制:為什么自注意力模型(self-Attention model)在長距離序列中如此強大?

      (1)卷積或循環(huán)神經(jīng)網(wǎng)絡(luò)難道不能處理長距離序列嗎?

      當使用神經(jīng)網(wǎng)絡(luò)來處理一個變長的向量序列時,我們通常可以使用卷積網(wǎng)絡(luò)或循環(huán)網(wǎng)絡(luò)進行編碼來得到一個相同長度的輸出向量序列,如圖所示:

    • 基于卷積網(wǎng)絡(luò)和循環(huán)網(wǎng)絡(luò)的變長序列編碼
    • 從上圖可以看出,無論卷積還是循環(huán)神經(jīng)網(wǎng)絡(luò)其實都是對變長序列的一種“局部編碼”:卷積神經(jīng)網(wǎng)絡(luò)顯然是基于N-gram的局部編碼;而對于循環(huán)神經(jīng)網(wǎng)絡(luò),由于梯度消失等問題也只能建立短距離依賴。

      (2)要解決這種短距離依賴的“局部編碼”問題,從而對輸入序列建立長距離依賴關(guān)系,有哪些辦法呢?

    • 如果要建立輸入序列之間的長距離依賴關(guān)系,可以使用以下兩種方法:一 種方法是增加網(wǎng)絡(luò)的層數(shù),通過一個深層網(wǎng)絡(luò)來獲取遠距離的信息交互,另一種方法是使用全連接網(wǎng)絡(luò)。 ——《神經(jīng)網(wǎng)絡(luò)與深度學習》
    • 全連接模型和自注意力模型:實線表示為可學習的權(quán)重,虛線表示動態(tài)生成的權(quán)重。
    • 由上圖可以看出,全連接網(wǎng)絡(luò)雖然是一種非常直接的建模遠距離依賴的模型, 但是無法處理變長的輸入序列。不同的輸入長度,其連接權(quán)重的大小也是不同的。

      這時我們就可以利用注意力機制來“動態(tài)”地生成不同連接的權(quán)重,這就是自注意力模型(self-attention model)。由于自注意力模型的權(quán)重是動態(tài)生成的,因此可以處理變長的信息序列。

      總體來說,為什么自注意力模型(self-Attention model)如此強大:利用注意力機制來“動態(tài)”地生成不同連接的權(quán)重,從而處理變長的信息序列。

      (3)自注意力模型(self-Attention model)具體的計算流程是怎樣的呢?

      同樣,給出信息輸入:用X = [x1, · · · , xN ]表示N 個輸入信息;通過線性變換得到為查詢向量序列,鍵向量序列和值向量序列:

      上面的公式可以看出,self-Attention中的Q是對自身(self)輸入的變換,而在傳統(tǒng)的Attention中,Q來自于外部。

    • self-Attention計算過程剖解(來自《細講 | Attention Is All You Need 》)
    • 注意力計算公式為:

      自注意力模型(self-Attention model)中,通常使用縮放點積來作為注意力打分函數(shù),輸出向量序列可以寫為:

      二、Transformer(Attention Is All You Need)詳解

      從Transformer這篇論文的題目可以看出,Transformer的核心就是Attention,這也就是為什么本文會在剖析玩Attention機制之后會引出Transformer,如果對上面的Attention機制特別是自注意力模型(self-Attention model)理解后,Transformer就很容易理解了。

      1、Transformer的整體架構(gòu)是怎樣的?由哪些部分組成?

    • Transformer模型架構(gòu)
    • Transformer其實這就是一個Seq2Seq模型,左邊一個encoder把輸入讀進去,右邊一個decoder得到輸出:

    • Seq2Seq模型
    • Transformer=Transformer Encoder+Transformer Decoder

      (1)Transformer Encoder(N=6層,每層包括2個sub-layers):

    • Transformer Encoder
    • sub-layer-1:multi-head self-attention mechanism,用來進行self-attention。

    • sub-layer-2:Position-wise Feed-forward Networks,簡單的全連接網(wǎng)絡(luò),對每個position的向量分別進行相同的操作,包括兩個線性變換和一個ReLU激活輸出(輸入輸出層的維度都為512,中間層為2048):

    • gpt3和transformer的關(guān)系(gpt transformer)

      每個sub-layer都使用了殘差網(wǎng)絡(luò):

      (2)Transformer Decoder(N=6層,每層包括3個sub-layers):

    • Transformer Decoder
    • sub-layer-1:Masked multi-head self-attention mechanism,用來進行self-attention,與Encoder不同:由于是序列生成過程,所以在時刻 i 的時候,大于 i 的時刻都沒有結(jié)果,只有小于 i 的時刻有結(jié)果,因此需要做Mask。

    • sub-layer-2:Position-wise Feed-forward Networks,同Encoder。

    • sub-layer-3:Encoder-Decoder attention計算。

    • 2、Transformer Encoder 與 Transformer Decoder 有哪些不同?

      (1)multi-head self-attention mechanism不同,Encoder中不需要使用Masked,而Decoder中需要使用Masked;

      (2)Decoder中多了一層Encoder-Decoder attention,這與 self-attention mechanism不同。

      3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?

      它們都是用了 multi-head計算,不過Encoder-Decoder attention采用傳統(tǒng)的attention機制,其中的Query是self-attention mechanism已經(jīng)計算出的上一時間i處的編碼值,Key和Value都是Encoder的輸出,這與self-attention mechanism不同。代碼中具體體現(xiàn):

    • ## Multihead Attention ( self-attention)
    •            self.dec = multihead_attention(queries=self.dec,
    •                                           keys=self.dec,
    •                                           num_units=hp.hidden_units,
    •                                           num_heads=hp.num_heads,
    •                                           dropout_rate=hp.dropout_rate,
    •                                           is_training=is_training,
    •                                           causality=True,
    •                                           scope="self_attention")
    • ## Multihead Attention ( Encoder-Decoder attention)
    •            self.dec = multihead_attention(queries=self.dec,
    •                                           keys=self.enc,
    •                                           num_units=hp.hidden_units,
    •                                           num_heads=hp.num_heads,
    •                                           dropout_rate=hp.dropout_rate,
    •                                           is_training=is_training,
    •                                           causality=False,
    •                                           scope="vanilla_attention")
    • 4、multi-head self-attention mechanism具體的計算過程是怎樣的?

    • multi-head self-attention mechanism計算過程
    • Transformer中的Attention機制由Scaled Dot-Product Attention和Multi-Head Attention組成,上圖給出了整體流程。下面具體介紹各個環(huán)節(jié):

    • Expand:實際上是經(jīng)過線性變換,生成Q、K、V三個向量;

    • Split heads: 進行分頭操作,在原文中將原來每個位置512維度分成8個head,每個head維度變?yōu)?4;

    • Self Attention:對每個head進行Self Attention,具體過程和第一部分介紹的一致;

    • Concat heads:對進行完Self Attention每個head進行拼接;

    • 上述過程公式為:

      5、Transformer在GPT和Bert等詞向量預(yù)訓練模型中具體是怎么應(yīng)用的?有什么變化?

    • GPT中訓練的是單向語言模型,其實就是直接應(yīng)用Transformer Decoder;

    • Bert中訓練的是雙向語言模型,應(yīng)用了Transformer Encoder部分,不過在Encoder基礎(chǔ)上還做了Masked操作;

    • BERT Transformer 使用雙向self-attention,而GPT Transformer 使用受限制的self-attention,其中每個token只能處理其左側(cè)的上下文。雙向 Transformer 通常被稱為“Transformer encoder”,而左側(cè)上下文被稱為“Transformer decoder”,decoder是不能獲要預(yù)測的信息的。

    三、gpt人工智能縮寫

    GPT是GenerativePretrainedTransformer(生成預(yù)訓練變換器)的縮寫。

    數(shù)字技術(shù)的發(fā)展,推動社會經(jīng)濟形態(tài)從農(nóng)業(yè)經(jīng)濟、工業(yè)經(jīng)濟向數(shù)字經(jīng)濟(智慧經(jīng)濟)發(fā)展,數(shù)字經(jīng)濟直接或間接地利用數(shù)據(jù)方式推動經(jīng)濟發(fā)展。得益于人工智能,數(shù)字經(jīng)濟得到了極大的發(fā)展,人工智能作為一種日新月異的數(shù)字技術(shù)在經(jīng)濟領(lǐng)域廣泛滲透,其顛覆了傳統(tǒng)經(jīng)濟模式,為新經(jīng)濟形式注入活力,加速了生產(chǎn)力的提升。

    四、理解Bert

    離開深度學習瞎折騰了一段時間后,我終于又回來了。

    于是趕緊回顧了下18年之后NLP的發(fā)展,基本就是將遷移學習更廣泛的用于NLP領(lǐng)域,以及把17年年底的《Attention is all you need》里的思想給發(fā)揚光大了,ELMO彌補了傳統(tǒng)word2vec多義詞表示的不足,GPT使用更強大的特征提取器Transformer取代LSTM,Bert使用雙向Transformer進一步改進了GPT成為這兩年發(fā)展的集大成者。

    從Bert模型所帶來的NLP界里程碑式的影響和所取得的成就來看,無疑Bert將會是未來兩三年NLP應(yīng)用發(fā)展的基石,于是有必要仔細的看看其模型的結(jié)構(gòu),數(shù)據(jù)是如何流動的,訓練的和測試的。

    不得不說現(xiàn)在的學習環(huán)境相對幾年前好太多了,本文主要參考了以下幾篇文章,然后加了點自己的理解:

    Dissecting BERT Part 1: The Encoder

    The Illustrated Transformer

    Dissecting BERT Appendix: The Decoder

    它的總體框架同lstm時代的MNT或者是attention is all you need中的 transformer 一樣的 encoder-decoder 結(jié)構(gòu):

    我們先來介紹一下Encoder部分。

    為了理解這個架構(gòu),我們使用一個簡單的具體的例子,來看一下 輸入 的數(shù)據(jù)是怎么通過 encoder 一步一步變化讓后到 輸出 的。

    bert的詞嵌入由三個嵌入token embedding、segment embedding,和position embedding疊加而成。

    這個過程跟以往的RNNs沒什么區(qū)別,比如給定一個句子:

    第一步是先將其標記化:

    然后是數(shù)字化,將每個標記映射到語料詞匯表中的唯一整數(shù)編號:

    接下來就是得到序列中每個詞的詞嵌入,也就是將整數(shù)映射到一個 維的向量,這個向量是模型在訓練時學習的,你可以將其視為一個查表的過程,這些向量的元素作為模型的參數(shù),像其他權(quán)重一樣通過反向傳播進行了優(yōu)化。

    在論文中是使用WordPiece tokenization 來將英文單詞轉(zhuǎn)換成768( )維的向量,轉(zhuǎn)化的過程類似這樣:

    把每個詞的向量放到一起,就得到了一個 句子長度x向量維度 ( ) 尺寸的矩陣 Z :

    說明一點,我們通常使用 填充 的方式來讓輸入序列具有相同的長度,比如通過添加"<pad>" 標記來增加某些序列的長度,還是前面的例子,填充后可能變?yōu)椋?/p>

    如果設(shè)定 設(shè)定為9,那我們就把句子從5填充到了9。

    但是,上面的embedding并沒有包含詞的位置信息。于是,我們的目標是能夠根據(jù)詞在句子中的位置適當調(diào)整這個向量,使它帶上位置信息。

    作者選擇的方法是使用預(yù)定的(非學習的)正余弦函數(shù)將 之間的數(shù)字加到前面的embedding中,即通過正余弦函數(shù)將位置表示為彼此的線性組合,從而實現(xiàn)網(wǎng)絡(luò)學習中標記位置之間的相對關(guān)系。在Token embedding 獲得的矩陣 的基礎(chǔ)上加上位置矩陣 。

    數(shù)學上,用 表示序列中標記的位置,用 表示token embedding特征向量中的位置:

    具體來說,對于給定的句子 ,其位置嵌入矩陣為:

    作者解釋說,使用這種確定性方法的結(jié)果和學習位置表示(就像我們對詞嵌入那樣)的結(jié)果差不多,因此這樣反而會有一些優(yōu)勢:

    因此,添加了位置信息之后的矩陣是:

    它是第一個encoder塊的輸入,尺寸是

    共有N個編碼器塊連接在一起直到生成編碼器的輸出,特定的塊負責查找輸入表示之間的關(guān)系并將編碼在其輸出中。

    直觀地,通過這些塊的迭代過程將幫助神經(jīng)網(wǎng)絡(luò)捕獲輸入序列中的詞之間的更加復(fù)雜的關(guān)系,你可以把它理解成一個整體用來捕捉輸入序列的語義。

    encoder中使用Transformer的多頭注意力機制,這意味著它將計算 份不同權(quán)重矩陣的自注意力,然后將結(jié)果連接在一起。

    這些并行注意力計算的結(jié)果稱之為Head,我們用下標 來表示一個特定的head和相關(guān)的權(quán)重矩陣。

    如上圖所示,一旦計算了所有head,它們將被連接起來,得到一個尺寸為 的矩陣,然后將它乘以一個尺寸為 的權(quán)重矩陣 進行線性變換,就得到了一個尺寸為 的最終結(jié)果,用數(shù)學公式表示就是:

    其中的 通過 乘以相應(yīng)權(quán)重矩陣 獲得,我們通過一個簡單的例子來可視化的看一下這個過程。

    這圖描繪了輸入標記通過 token embedding 和 positional encoding ,再輸入到Encoder:

    接下來,我們再來看下Encoder中的操作過程,先看一下單頭的self-attention:

    上圖描繪了一個Head的 是怎么來的,其中的 的尺寸是 , 因為Q和K需要計算相似性,所以維度應(yīng)當是相同的, 的尺寸是 , 的維度可以相同也可以不同,在論文中 .

    所謂的自注意力,就是 與 的點積進行 的縮放之后通過softmax獲得一個概率權(quán)重,然后用這些權(quán)重分別乘以各自的 即可:

    為了加深理解,我們選擇其中一個頭,通過圖形繼續(xù)可視化的看一下這個變化過程:

    然后計算self-attention,

    多頭的話就是同時有多個上述計算過程在進行:

    假設(shè)我們有8個Head,那么我們就獲得8個 :

    但是,顯然前饋層只需要一個矩陣 ,怎么處理呢?類似多卷積核的處理,把這8個矩陣連起來,乘以一個權(quán)重矩陣 壓縮到一個矩陣。

    為了有一個更加全面直觀的認識,我們把上面整個過程放到一個圖里,

    顯然,第二個encoder塊是不需要embedding過程的,只要把第一個encoder塊的輸出作為輸入即可。

    經(jīng)過上面的介紹,你應(yīng)該對這個過程已經(jīng)有了足夠的了解,但是,為什么可以利用向量點積來計算注意力概率呢?

    于是讓我們進一步深入來了解其中的原理。

    這個結(jié)構(gòu)體系的關(guān)鍵在于:

    也就是每個詞的q向量與每個詞的k向量的點積,套用點積公式:

    這意味著 和 的方向越相似,長度越大,點積就越大。詞與此之間關(guān)聯(lián)越大,對于理解這個詞時得到的關(guān)注越大,跟我們的本意是相同的。

    我們再看一下最開頭的結(jié)構(gòu)示意圖,每個encoder塊在Multi-Head Attention之后經(jīng)過一個 Add & Norm層才進入下一個塊。于是我們來看一下這一層做了些什么。

    Add 實際就是一個殘差連接,將輸出加上輸入,這個在每一塊的self-attenton以及FFN之后都會有,然后跟隨一個Layer Norm 。

    Norm 是一個Layer Normlization,將 正則化,就是把它縮放到一個均值為0方差為1的域里。因為

    不過一般在這一層之前,就會有一個dropout層。

    每個encoder塊都由 mulit-head atteion add & Norm feed forword network add & Norm 這樣一個過程,下面來介紹一下這個Feed-Forward Network。

    這是一個全連接層,包含兩個線性變化和一個非線性函數(shù)(實際一般就是ReLu),

    對于輸入的 (尺寸為 ) ,通過權(quán)重矩陣 (尺寸為 )和偏置 線性變換到隱藏層 (尺寸為 ) ,然后**ReLu **激活 ,記下來再用權(quán)重矩陣 (尺寸為 ) 和偏置 的線性變換到輸出層(尺寸為 ) ,表示成數(shù)學公式就是:

    在最后一個encoder塊輸出之后連接到decoder。

    Decoder和Encoder的結(jié)構(gòu)是類似的,但是因為可視信息的不同,又有所差別。

    Transformer解決的是翻譯的問題,將一個句子翻譯成另一種語言,我們希望模型能夠捕捉到輸入句子中詞之間的關(guān)系,并且將輸入句子中包含的信息與每一步已翻譯的內(nèi)容結(jié)合起來。繼續(xù)上面的例子,我們的目標是把一個句子從英文翻譯為西班牙文,這是我們獲得的序列標記:

    我們同之前一樣來看看輸入到輸出數(shù)據(jù)是如何流動的。

    這是我們的解碼器的輸入標記:

    然后這是解碼器的期望輸出:

    但是,這里存在一個問題,比如輸入這邊我們已經(jīng)看到了'como' 的后面是'estas', 然后再用它來預(yù)測'estas' ,這顯然是不合理的,因為模型在測試的時候是看不到后面的詞的。

    因此,我們需要修改注意力層,防止模型可以看到預(yù)測詞右邊的信息,與此同時,它能利用已經(jīng)預(yù)測的詞,即左邊的信息。

    繼續(xù)上面的例子,我們將輸入標記轉(zhuǎn)換成矩陣的形式,并添加位置信息:

    和encoder一樣,decoder塊的輸出也將是大小為 的矩陣,在逐行線性變換+softmax激活后,將生成一個舉證,其中每行的最大元素表示下一個單詞。也就是說,分配"<SS>" 的行負責預(yù)測“Hola”, 分配"Hola"的行負責預(yù)測"," ...以此類推。比如,為了預(yù)測"estas", 我們將允許該行直接和下圖中綠色區(qū)域互動,而不能和紅色區(qū)域互動:

    但是,在我們使用多頭注意力機制的時候,所有的行都會產(chǎn)生交互,因此需要在輸入的時候添加遮罩,這個遮罩會在注意力計算之后進行:

    這是 self-attention 的計算結(jié)果:

    然后我們在此基礎(chǔ)上添加遮掩,就是把矩陣上三角的位置全部設(shè)置為 :

    于是,在進行softmax激活之后,矩陣就變成了:

    恰好達到了我們的要求,那些需要在訓練時忽略的右側(cè)的詞的注意力全部變成了0。

    當將這個注意力矩陣與 相乘時,預(yù)測的詞就是模型可以訪問元素右邊的元素。注意,這里的多頭注意力輸出將是 維的,因為它的序列長度是 。

    這個就是 Decoder target序列 的輸入,并經(jīng)過 Masked Multi-Head Attention 的一個變化得到了 ,decoder的還有一部分輸入來自于源語句經(jīng)過 Encoder 的最終輸出 (尺寸是 )。

    接下來,就是與encoder一樣的 Multi-Head Attention Add and Layer Norm -> FFN 的過程。

    只不過,現(xiàn)在的 來自于 ,而 來自于 :

    計算每個query相對于key的注意力之后,得到的是一個 的矩陣, 繼續(xù)咱們的例子,比如注意力矩陣為:

    如上圖所見,這個注意力是當前Decoder輸入與Encoder輸出的每個詞之間的注意力,咱們用這個矩陣再乘以 ,就得到了一個 的矩陣,每一行代表了源語句相對于當前輸入詞匯的特征:

    h個Head連接起來,尺寸變?yōu)? ,它通過 的權(quán)重矩陣 線性變換到一個 的輸出。

    這在多個Decoder之后,最后輸出的矩陣通過乘以權(quán)重矩陣 ( ) 進行線性變換,變換之后再對每一行的向量softmax, 其中選擇值最大位置對應(yīng)詞表索引的詞就是預(yù)測的詞。

    損失的話只需要用預(yù)測的每個詞向量與真實的詞的one-hot詞表示計算交叉熵即可。

    以上就是關(guān)于gpt3和transformer的關(guān)系相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。


    推薦閱讀:

    山寨ChatGPT,費用離譜,回答更離譜

    chartGPT寫代碼(chartcoder)

    gpt網(wǎng)絡(luò)用語(網(wǎng)絡(luò)gp是什么意思)

    眾創(chuàng)網(wǎng)絡(luò)科技有限公司(眾創(chuàng)網(wǎng)絡(luò)科技有限公司怎么樣)

    西固綠化景觀設(shè)計(西固綠化景觀設(shè)計招標)