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

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

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

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

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

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

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

    本文目錄:

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

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

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

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

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

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

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

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

    Google 在預(yù)訓(xùn)練 BERT 時(shí)讓它同時(shí)進(jìn)行兩個(gè)任務(wù):

    1. 漏字填空

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

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

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

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

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

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

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

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

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

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

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

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

    為什么要用CLS?

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

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

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

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

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

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

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

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

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

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

    類似的,我們可以用 一個(gè)反向 來計(jì)算概率:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    二、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具體的計(jì)算過程是怎樣的?

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

    一、Attention機(jī)制剖析

    1、為什么要引入Attention機(jī)制?

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

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

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

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

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

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

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

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

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

      3、Attention機(jī)制的計(jì)算流程是怎樣的?

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

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

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

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

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

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

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

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

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

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

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

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

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

      當(dāng)使用神經(jīng)網(wǎng)絡(luò)來處理一個(gè)變長的向量序列時(shí),我們通??梢允褂镁矸e網(wǎng)絡(luò)或循環(huán)網(wǎng)絡(luò)進(jìn)行編碼來得到一個(gè)相同長度的輸出向量序列,如圖所示:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • Transformer Encoder
    • sub-layer-1:multi-head self-attention mechanism,用來進(jìn)行self-attention。

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

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

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

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

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

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

    • sub-layer-3:Encoder-Decoder attention計(jì)算。

    • 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計(jì)算,不過Encoder-Decoder attention采用傳統(tǒng)的attention機(jī)制,其中的Query是self-attention mechanism已經(jīng)計(jì)算出的上一時(shí)間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具體的計(jì)算過程是怎樣的?

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

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

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

    • Self Attention:對每個(gè)head進(jìn)行Self Attention,具體過程和第一部分介紹的一致;

    • Concat heads:對進(jìn)行完Self Attention每個(gè)head進(jìn)行拼接;

    • 上述過程公式為:

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

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

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

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

    三、gpt人工智能縮寫

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

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

    四、理解Bert

    離開深度學(xué)習(xí)瞎折騰了一段時(shí)間后,我終于又回來了。

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

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

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

    Dissecting BERT Part 1: The Encoder

    The Illustrated Transformer

    Dissecting BERT Appendix: The Decoder

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

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

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

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

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

    第一步是先將其標(biāo)記化:

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

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

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

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

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

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

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

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

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

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

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

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

    它是第一個(gè)encoder塊的輸入,尺寸是

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

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

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

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

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

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

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

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

    上圖描繪了一個(gè)Head的 是怎么來的,其中的 的尺寸是 , 因?yàn)镼和K需要計(jì)算相似性,所以維度應(yīng)當(dāng)是相同的, 的尺寸是 , 的維度可以相同也可以不同,在論文中 .

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

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

    然后計(jì)算self-attention,

    多頭的話就是同時(shí)有多個(gè)上述計(jì)算過程在進(jìn)行:

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

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

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

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

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

    于是讓我們進(jìn)一步深入來了解其中的原理。

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

    也就是每個(gè)詞的q向量與每個(gè)詞的k向量的點(diǎn)積,套用點(diǎn)積公式:

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

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

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

    Norm 是一個(gè)Layer Normlization,將 正則化,就是把它縮放到一個(gè)均值為0方差為1的域里。因?yàn)?/p>

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

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

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

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

    在最后一個(gè)encoder塊輸出之后連接到decoder。

    Decoder和Encoder的結(jié)構(gòu)是類似的,但是因?yàn)榭梢曅畔⒌牟煌钟兴顒e。

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

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

    這是我們的解碼器的輸入標(biāo)記:

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

    但是,這里存在一個(gè)問題,比如輸入這邊我們已經(jīng)看到了'como' 的后面是'estas', 然后再用它來預(yù)測'estas' ,這顯然是不合理的,因?yàn)槟P驮跍y試的時(shí)候是看不到后面的詞的。

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

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

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

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

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

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

    于是,在進(jìn)行softmax激活之后,矩陣就變成了:

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

    當(dāng)將這個(gè)注意力矩陣與 相乘時(shí),預(yù)測的詞就是模型可以訪問元素右邊的元素。注意,這里的多頭注意力輸出將是 維的,因?yàn)樗男蛄虚L度是 。

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

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

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

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

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

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

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

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

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


    推薦閱讀:

    山寨ChatGPT,費(fèi)用離譜,回答更離譜

    chartGPT寫代碼(chartcoder)

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

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

    西固綠化景觀設(shè)計(jì)(西固綠化景觀設(shè)計(jì)招標(biāo))