多模態大模型&大模型訓練語料持續迭代
已經開始整理多模態-視覺部分:
主要分為一下幾塊
多模態信息壓縮模型(clip、vit、swiT)
生成模型(vae、gan、flow、ddpm、sde…)
其它多模態大模型(語音、視頻、slam、3d)
這部分涉及到很多數學知識,在琢磨改如何表達能做到達意有能讓更多讀者能夠接受,不會直接被各種數學公式勸退,我盡可能把背后數學思想表達出來講人話,但是能力有限如果最后表達不到位地方各位見諒,也希望更多朋給意見優化迭代
大模型演進歷史
預訓練模型
word2vec
word2vec屬于NLP領域無監督學習和比較學習的先祖。精髓在于可以用不帶標簽的文本語料輸入神經網絡模型,就可以學習到每個詞的帶語的詞向量表示。它背后原理其實就是人類講出來的話已經是帶有信息量的,只要通過神經網絡對語料批量處理詞和上下文映射關系,就能學習到人類對某個詞的上下文語意。
用一個向量來表示每個詞匯,語義比較相近的詞匯,它們的向量會比較接近。
詞嵌入技術過去經常用到,但是它有一個很大的缺點。就是一詞多義問題。每個詞只有唯一的向量表示,所以一詞多義的話,詞意思就是訓練語料里這個詞出現最多詞上下文的表示,會把其它次要上下文語意直接忘記
elmo
Word Embedding本質上是個靜態的方式,即訓練好之后每個單詞的表達就固定住了,以后使用的時候,不論新句子上下文單詞是什么,這個單詞的Word Embedding不會跟著上下文場景的變化而改變,所以對于比如Bank這個詞,它事先學好的Word Embedding中混合了幾種語義 ,在應用中來了個新句子,即使從上下文中(比如句子包含money等詞)明顯可以看出它代表的是“銀行”的含義,但是對應的Word Embedding內容也不會變,它還是混合了多種語義。
ELMO的本質思想是:先用語言模型學好一個單詞的Word Embedding,此時多義詞無法區分,不過這沒關系。在實際使用Word Embedding的時候,單詞已經具備了特定的上下文了,這個時候我可以根據上下文單詞的語義去調整單詞的Word Embedding表示,這樣經過調整后的Word Embedding更能表達在這個上下文中的具體含義,自然也就解決了多義詞的問題了。所以ELMO本身是個根據當前上下文對Word Embedding動態調整的思路。
ELMO采用了典型的兩階段過程,第一個階段是利用語言模型進行預訓練;第二個階段是在做下游任務時,從預訓練網絡中提取對應單詞的網絡各層的Word Embedding作為新特征補充到下游任務中。
ELMO的網絡結構采用了雙層雙向LSTM,目前語言模型訓練的任務目標是根據單詞 Wi 的上下文去正確預測單詞 Wi ,Wi 之前的單詞序列Context-before稱為上文,之后的單詞序列Context-after稱為下文。圖中左端的前向雙層LSTM代表正方向編碼器,輸入的是從左到右順序的除了預測單詞外 Wi 的上文Context-before和下文Context-after;右端的逆向雙層LSTM代表反方向編碼器,輸入的是從右到左的逆序的句子上文和下文;每個編碼器的深度都是兩層LSTM疊加,而每一層的正向和逆向單詞編碼會拼接到一起;如下圖所示
預訓練好網絡結構后,如何給下游任務使用呢?
下圖展示了下游任務的使用過程,比如我們的下游任務仍然是QA問題,此時對于問句X,我們可以先將句子X作為預訓練好的ELMO網絡的輸入,這樣句子X中每個單詞在ELMO網絡中都能獲得對應的三個Embedding(單詞的Embedding,句法層面的Embedding,語義層面的Embedding),之后給予這三個Embedding中的每一個Embedding一個權重a,這個權重可以學習得來,根據各自權重累加求和,將三個Embedding整合成一個。然后將整合后的這個Embedding作為X句在自己任務的那個網絡結構中對應單詞的輸入,以此作為補充的新特征給下游任務使用。對于上圖所示下游任務QA中的回答句子Y來說也是如此處理。因為ELMO給下游提供的是每個單詞的特征形式,所以這一類預訓練的方法被稱為“Feature-based Pre-Training”
ELMO也存在一些缺點
(1)特征抽取器選擇方面,ELMO使用了LSTM而不是Transformer;Transformer提取特征的能力是要遠強于LSTM的
(2)ELMO采取雙向拼接這種融合特征的能力可能比Bert一體化的融合特征方式弱,但是,這只是一種從道理推斷產生的懷疑,目前并沒有具體實驗說明這一點。
Contextualized Word Embedding技術是動態的embedding技術,word2vec只會根據訓練語料高頻出現上下文對每一個詞embedding做取舍;而Contextualized Word Embedding則是在pretrain預訓練階段會把每個詞的所有可能語意都記入下來,在finetune具體任務時候,會根據輸入文本的上下文信息激活pretrain時候的不同語意權重來表示更適合當前這個多義詞的語意。比如:pretrain時候apple可以記錄(電子產品apple、吃的apple),fintune具體任務時候上下文{中關村、電子產品發布會}就會激活pretrain時候的embbeding(電子產品apple、吃的apple)更傾向于“電子產品apple”。通過Contextualized Word Embedding解決了一詞多義的問題。
transform
1.傳統encode-decode模型的前步依賴,無法并行化計算,影響運算速度問題
2.如何通過位置向量解決句子有序性
3.為何要多頭——解決自注意力機制單頭過度關心自己問題
4.Decoder部分訓練時候如何加速——Attention MASK+Decode輸入
5.Decode時候如何把Encode作為memory字典來查
主流的序列模型都是基于復雜的循環神經網絡或者是卷積神經網絡構造而來的Encoder-Decoder模型,并且就算是目前性能最好的序列模型也都是基于注意力機制下的Encoder-Decoder架構。為什么作者會不停的提及這些傳統的Encoder-Decoder模型呢?接著,作者在介紹部分談到,由于傳統的Encoder-Decoder架構在建模過程中,下一個時刻的計算過程會依賴于上一個時刻的輸出,而這種固有的屬性就限制了傳統的Encoder-Decoder模型就不能以并行的方式進行計算,如圖1-1所示。
如圖1-2所示。當然,Transformer架構的優點在于它完全擯棄了傳統的循環結構,取而代之的是只通過注意力機制來計算模型輸入與輸出的隱含表示,而這種注意力的名字就是大名鼎鼎的自注意力機制(self-attention),也就是圖1-2中的Multi-Head Attention模塊。
所謂自注意力機制就是通過某種運算來直接計算得到句子在編碼過程中每個位置上的注意力權重;然后再以權重和的形式來計算得到整個句子的隱含向量表示。最終,Transformer架構就是基于這種的自注意力機制而構建的Encoder-Decoder模型。
從圖1-3可以看出,自注意力機制的核心過程就是通過Q和K計算得到注意力權重;然后再作用于V得到整個權重和輸出。具體的,對于輸入Q、K和V來說,其輸出向量的計算公式為:
其中Q、K和V分別為3個矩陣,且其(第2個)維度分別為 (從后面的計算過程其實可以發現(1.1)中除以的過程就是圖1-3中所指的Scale過程。
之所以要進行縮放這一步是因為通過實驗作者發現,對于較大的來說在完成后將會得到很大的值,而這將導致在經過sofrmax操作后產生非常小的梯度,不利于網絡的訓練。
如果僅僅只是看著圖1-3中的結構以及公式中的計算過程顯然是不那么容易理解自注意力機制的含義,例如初學者最困惑的一個問題就是圖1-3中的Q、K和V分別是怎么來的?下面,我們來看一個實際的計算示例。現在,假設輸入序列“我 是 誰”,且已經通過某種方式得到了1個形狀為的矩陣來進行表示,那么通過圖1-3所示的過程便能夠就算得到Q、K以及V[2]。
圖 1-4. Q、K和V計算過程圖
從圖1-4的計算過程可以看出,Q、K和V其實就是輸入X分別乘以3個不同的矩陣計算而來(但這僅僅局限于Encoder和Decoder在各自輸入部分利用自注意力機制進行編碼的過程,Encoder和Decoder交互部分的Q、K和V另有指代)。此處對于計算得到的Q、K、V,你可以理解為這是對于同一個輸入進行3次不同的線性變換來表示其不同的3種狀態。在計算得到Q、K、V之后,就可以進一步計算得到權重向量,計算過程如圖1-5所示。
圖 1-5. 注意力權重計算圖(已經經過scale和softmax操作)
如圖1-5所示,在經過上述過程計算得到了這個注意力權重矩陣之后我們不禁就會問到,這些權重值到底表示的是什么呢?對于權重矩陣的第1行來說,0.7表示的就是“我”與“我”的注意力值;0.2表示的就是“我”與”是”的注意力值;0.1表示的就是“我”與“誰”的注意力值。換句話說,在對序列中的“我“進行編碼時,應該將0.7的注意力放在“我”上,0.2的注意力放在“是”上,將0.1的注意力放在誰上。
同理,對于權重矩陣的第3行來說,其表示的含義就是,在對序列中”誰“進行編碼時,應該將0.2的注意力放在“我”上,將0.1的注意力放在“是”上,將0.7的注意力放在“誰”上。從這一過程可以看出,通過這個權重矩陣模型就能輕松的知道在編碼對應位置上的向量時,應該以何種方式將注意力集中到不同的位置上。
不過從上面的計算結果還可以看到一點就是,模型在對當前位置的信息進行編碼時,會過度的將注意力集中于自身的位置(雖然這符合常識)而可能忽略了其它位置[2]。因此,作者采取的一種解決方案就是采用多頭注意力機制(MultiHeadAttention),這部分內容我們將在稍后看到。
在通過圖1-5示的過程計算得到權重矩陣后,便可以將其作用于V ,進而得到最終的編碼輸出,計算過程如圖1-6所示。
圖 1-6. 權重和編碼輸出圖
根據如圖1-6所示的過程,我們便能夠得到最后編碼后的輸出向量。當然,對于上述過程我們還可以換個角度來進行觀察,如圖1-7所示。
圖 1-7. 編碼輸出計算圖
從圖1-7可以看出,對于最終輸出“是”的編碼向量來說,它其實就是原始“我 是 誰”3個向量的加權和,而這也就體現了在對“是”進行編碼時注意力權重分配的全過程。
當然,對于整個圖1-5到圖1-6的過程,我們還可以通過如圖1-8所示的過程來進行表示。
圖 1-8. 自注意力機制計算過程圖
可以看出通過這種自注意力機制的方式確實解決了作者在論文伊始所提出的“傳統序列模型在編碼過程中都需順序進行的弊端”的問題,有了自注意力機制后,僅僅只需要對原始輸入進行幾次矩陣變換便能夠得到最終包含有不同位置注意力信息的編碼向量。
對于自注意力機制的核心部分到這里就介紹完了,不過里面依舊有很多細節之處沒有進行介紹。例如Encoder和Decoder在進行交互時的Q、K、V是如何得到的?在圖1-3中所標記的Mask操作是什么意思,什么情況下會用到等等?這些內容將會在后續逐一進行介紹。
下面,讓我們繼續進入到MultiHeadAttention機制的探索中。
1.2.2 為什么要MultiHeadAttention
經過上面內容的介紹,我們算是在一定程度上對于自注意力機制有了清晰的認識,不過在上面我們也提到了自注意力機制的缺陷就是:模型在對當前位置的信息進行編碼時,會過度的將注意力集中于自身的位置, 因此作者提出了通過多頭注意力機制來解決這一問題。同時,使用多頭注意力機制還能夠給予注意力層的輸出包含有不同子空間中的編碼表示信息,從而增強模型的表達能力。
在說完為什么需要多頭注意力機制以及使用多頭注意力機制的好處之后,下面我們就來看一看到底什么是多頭注意力機制。
圖 1-9. 多頭注意力機制結構圖
如圖1-9所示,可以看到所謂的多頭注意力機制其實就是將原始的輸入序列進行多組的自注意力處理過程;然后再將每一組自注意力的結果拼接起來進行一次線性變換得到最終的輸出結果。具體的,其計算公式為:
其中
同時,在論文中,作者使用了個并行的自注意力模塊(8個頭)來構建一個注意力層,并且對于每個自注意力模塊都限定了。從這里其實可以發現,論文中所使用的多頭注意力機制其實就是將一個大的高維單頭拆分成了個多頭。因此,整個多頭注意力機制的計算過程我們可以通過如圖1-10所示的過程來進行表示。
圖 1-10. 多頭注意力機制計算過程圖
注意:圖中的d_m 就是指
如圖1-10所示,根據輸入序列X和 我們就計算得到了,進一步根據公式就得到了單個自注意力模塊的輸出;同理,根據X和就得到了另外一個自注意力模塊輸出。最后,根據公式將水平堆疊形成,然后再用乘以便得到了整個多頭注意力層的輸出。同時,根據圖1-9中的計算過程,還可以得到。
到此,對于整個Transformer的核心部分,即多頭注意力機制的原理就介紹完了。
1.2.3 同維度中的單頭與多頭的區別
在多頭注意力中,對于初學者來說一個比較經典的問題就是,在相同維度下使用單頭和多頭的區別是什么?這句話什么意思呢?以圖1-10中示例為例,此時的自注意力中使用了兩個頭,每個頭的維度為,即采用了多頭的方式。另外一種做法就是,只是用一個頭,但是其維度為,即采用單頭的方式。那么在這兩種情況下有什么區別呢?
首先,從論文中內容可知,作者在頭注意力機制與多頭個數之間做了如下的限制
從式可以看出,單個頭注意力機制的維度乘上多頭的個數就等于模型的維度。
注意:后續的d_m,以及都是指代模型的維度。
同時,從圖1-10中可以看出,這里使用的多頭數量,即。此時,對于第1個頭來說有:
圖 1-11. 頭1注意力計算過程
對于第2個頭來說有:
圖 1-12. 頭2注意力計算過程
最后,可以將在橫向堆疊起來進行一個線性變換得到最終的。因此,對于圖1-10所示的計算過程,我們還可以通過圖1-13來進行表示。
圖 1-13. 多頭注意力合并計算過程圖
從圖1-13可知,在一開始初始化這3個權重矩陣時,可以直接同時初始化個頭的權重,然后再進行后續的計算。而且事實上,在真正的代碼實現過程中也是采用的這樣的方式,這部分內容將在3.3.2節中進行介紹。因此,對圖1-13中的多頭計算過程,還可以根據圖1-14來進行表示。
圖 1-14. 多頭注意力計算過程圖
說了這么多,終于把鋪墊做完了。此時,假如有如圖1-15所示的頭注意力計算過程:
圖 1-15. 頭注意力計算過程圖
如圖1-15所示,該計算過程采用了頭注意力機制來進行計算,且頭的計算過程還可通過圖1-16來進行表示。
圖 1-16. 頭注意力機制計算過程題
那現在的問題是圖1-16中的能夠計算得到嗎?答案是不能。為什么?因為我沒有告訴你這里的等于多少。如果我告訴你多頭,那么毫無疑問圖1-16的計算過程就等同于圖1-14的計算過程,即
圖 1-17. 當h=2時注意力計算過程圖
且此時。但是如果我告訴你多頭,那么圖1-16的計算過程會變成
圖 1-18. 當h=3時注意力計算過程圖
那么此時則為。
現在回到一開始的問題上,根據上面的論述我們可以發現,在固定的情況下,不管是使用單頭還是多頭的方式,在實際的處理過程中直到進行注意力權重矩陣計算前,兩者之前沒有任何區別。當進行進行注意力權重矩陣計算時,越大那么就會被切分得越小,進而得到的注意力權重分配方式越多,如圖1-19所示。
圖 1-19. 注意力機制分配圖
從圖1-19可以看出,如果,那么最終可能得到的就是一個各個位置只集中于自身位置的注意力權重矩陣;如果,那么就還可能得到另外一個注意力權重稍微分配合理的權重矩陣;同理如此。因而多頭這一做法也恰好是論文作者提出用于克服模型在對當前位置的信息進行編碼時,會過度的將注意力集中于自身的位置的問題。這里再插入一張真實場景下同一層的不同注意力權重矩陣可視化結果圖:
圖1-20. 注意力機制分配圖
同時,當不一樣時,的取值也不一樣,進而使得對權重矩陣的scale的程度不一樣。例如,如果,那么當時,則;當時,則。
所以,當模型的維度確定時,一定程度上越大整個模型的表達能力越強,越能提高模型對于注意力權重的合理分配。
2. 位置編碼與編碼解碼過程
2.1 Embedding機制
在正式介紹Transformer的網絡結構之前,我們先來一起看看Transformer如何對字符進行Embedding處理。
2.1.1 Token Embedding
熟悉文本處理的讀者可能都知道,在對文本相關的數據進行建模時首先要做的便是對其進行向量化。例如在機器學習中,常見的文本表示方法有one-hot編碼、詞袋模型以及TF-IDF等。不過在深度學習中,更常見的做法便是將各個詞(或者字)通過一個Embedding層映射到低維稠密的向量空間。因此,在Transformer模型中,首先第一步要做的同樣是將文本以這樣的方式進行向量化表示,并且將其稱之為Token Embedding,也就是深度學習中常說的詞嵌入(Word Embedding)如圖2-1所示。
圖 2-1. Token Embedding
如果是換做之前的網絡模型,例如CNN或者RNN,那么對于文本向量化的步驟就到此結束了,因為這些網絡結構本身已經具備了捕捉時序特征的能力,不管是CNN中的n-gram形式還是RNN中的時序形式。但是這對僅僅只有自注意力機制的網絡結構來說卻不行。為什么呢?根據自注意力機制原理的介紹我們知道,自注意力機制在實際運算過程中不過就是幾個矩陣來回相乘進行線性變換而已。因此,這就導致即使是打亂各個詞的順序,那么最終計算得到的結果本質上卻沒有發生任何變換,換句話說僅僅只使用自注意力機制會丟失文本原有的序列信息。
圖 2-2. 自注意力機制弊端圖(一)
如圖2-2所示,在經過詞嵌入表示后,序列“我 在 看 書”經過了一次線性變換。現在,我們將序列變成“書 在 看 我”,然后同樣以中間這個權重矩陣來進行線性變換,過程如圖2-3所示。
圖 2-3. 自注意力機制弊端圖(二)
根據圖2-3中的計算結果來看,序列在交換位置前和交換位置后計算得到的結果在本質上并沒有任何區別,僅僅只是交換了對應的位置。因此,基于這樣的原因,Transformer在原始輸入文本進行Token Embedding后,又額外的加入了一個Positional Embedding來刻畫數據在時序上的特征。
Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence.
2.1.2 Positional Embedding
說了這么多,那到底什么又是Positional Embedding呢?數無形時少直覺,下面我們先來通過一幅圖直觀看看經過Positional Embedding處理后到底產生了什么樣的變化。
圖 2-4. Positional Embedding
如圖2-4所示,橫坐標表示輸入序列中的每一個Token,每一條曲線或者直線表示對應Token在每個維度上對應的位置信息。在左圖中,每個維度所對應的位置信息都是一個不變的常數;而在右圖中,每個維度所對應的位置信息都是基于某種公式變換所得到。換句話說就是,左圖中任意兩個Token上的向量都可以進行位置交換而模型卻不能捕捉到這一差異,但是加入右圖這樣的位置信息模型卻能夠感知到。例如位置20這一處的向量,在左圖中無論你將它換到哪個位置,都和原來一模一樣;但在右圖中,你卻再也找不到與位置20處位置信息相同的位置。
下面,筆者通過兩個實際的示例來進行說明。
圖 2-5. 常數Positional Embedding(一)
如圖2-5所示,原始輸入在經過Token Embedding后,又加入了一個常數位置信息的的Positional Embedding。在經過一次線性變換后便得到了圖2-5左右邊所示的結果。接下來,我們再交換序列的位置,并同時進行Positional Embedding觀察其結果。
圖 2-6. 常數Positional Embedding(二)
如圖2-6所示,在交換序列位置后,采用同樣的Positional Embedding進行處理,并且進行線性變換。可以發現,其計算結果同圖2-5中的計算結果本質上也沒有發生變換。因此,這就再次證明,如果Positional Embedding中位置信息是以常數形式進行變換,那么這樣的Positional Embedding是無效的。
在Transformer中,作者采用了如公式所示的規則來生成各個維度的位置信息,其可視化結果如圖2-4右所示。
其中就是這個Positional Embedding矩陣,表示具體的某一個位置,表示具體的某一維度。
最終,在融入這種非常數的Positional Embedding位置信息后,便可以得到如圖2-7所示的對比結果。
圖 2-7. 非常數Positional Embedding
從圖2-7可以看出,在交換位置前與交換位置后,與同一個權重矩陣進行線性變換后的結果截然不同。因此,這就證明通過Positional Embedding可以彌補自注意力機制不能捕捉序列時序信息的缺陷。
說完Transformer中的Embedding后,接下來我們再來繼續探究Transformer的網絡結構。
2.2 Transformer網絡結構
如圖2-8所示便是一個單層Transformer網絡結構圖。
圖 2-8. 單層Transformer網絡結構圖
如圖2-8所示,整個Transformer網絡包含左右兩個部分,即Encoder和Decoder。下面,我們就分別來對其中的各個部分進行介紹。
2.2.1 Encoder層
首先,對于Encoder來說,其網絡結構如圖2-8左側所示(盡管論文中是以6個這樣相同的模塊堆疊而成,但這里我們先以堆疊一層來進行介紹,多層的Transformer結構將在稍后進行介紹)。
圖 2-9. Encoder網絡結構圖
如圖2-9所示,對于Encoder部分來說其內部主要由兩部分網絡所構成:多頭注意力機制和兩層前饋神經網絡。
同時,對于這兩部分網絡來說,都加入了殘差連接,并且在殘差連接后還進行了層歸一化操作。這樣,對于每個部分來說其輸出均為,并且在都加入了Dropout操作。
進一步,為了便于在這些地方使用殘差連接,這兩部分網絡輸出向量的維度均為。
對于第2部分的兩層全連接網絡來說,其具體計算過程為
其中輸入的維度為,第1層全連接層的輸出維度為,第2層全連接層的輸出為,且同時對于第1層網絡的輸出還運用了Relu激活函數。
到此,對于單層Encoder的網絡結構就算是介紹完了,接下來讓我們繼續探究Decoder部分的網絡結構。
2.2.2 Decoder層
同Encoder部分一樣,論文中也采用了6個完全相同的網絡層堆疊而成,不過這里我們依舊只是先看1層時的情況。對于Decoder部分來說,其整體上與Encoder類似,只是多了一個用于與Encoder輸出進行交互的多頭注意力機制,如圖2-10所示。
圖 2-10. Decoder網絡結構圖
不同于Encoder部分,在Decoder中一共包含有3個部分的網絡結構。最上面的和最下面的部分(暫時忽略Mask)與Encoder相同,只是多了中間這個與Encoder輸出(Memory)進行交互的部分,作者稱之為“Encoder-Decoder attention”。對于這部分的輸入,Q來自于下面多頭注意力機制的輸出,K和V均是Encoder部分的輸出(Memory)經過線性變換后得到。而作者之所以這樣設計也是在模仿傳統Encoder-Decoder網絡模型的解碼過程。
為了能夠更好的理解這里Q、K、V的含義,我們先來看看傳統的基于Encoder-Decoder的Seq2Seq翻譯模型是如何進行解碼的,如圖2-11所示。
圖 2-11. 傳統的Seq2Seq網絡模型圖
如圖2-11所示是一個經典的基于Encoder-Decoder的機器翻譯模型。左下邊部分為編碼器,右下邊部分為解碼器,左上邊部分便是注意力機制部分。在圖2-11中,表示的是在編碼過程中,各個時刻的隱含狀態,稱之為每個時刻的Memory;表示解碼當前時刻時的隱含狀態。此時注意力機制的思想在于,希望模型在解碼的時刻能夠參考編碼階段每個時刻的記憶。
因此,在解碼第一個時刻""時,會首先同每個記憶狀態進行相似度比較得到注意力權重。這個注意力權重所蘊含的意思就是,在解碼第一個時刻時應該將的注意力放在編碼第一個時刻的記憶上(其它的同理),最終通過加權求和得到4個Memory的權重和,即context vector。同理,在解碼第二時刻"我"時,也會遵循上面的這一解碼過程。可以看出,此時注意力機制扮演的就是能夠使得Encoder與Decoder進行交互的角色。
回到Transformer的Encoder-Decoder attention中,K和V均是編碼部分的輸出Memory經過線性變換后的結果(此時的Memory中包含了原始輸入序列每個位置的編碼信息),而Q是解碼部分多頭注意力機制輸出的隱含向量經過線性變換后的結果。在Decoder對每一個時刻進行解碼時,首先需要做的便是通過Q與 K進行交互(query查詢),并計算得到注意力權重矩陣;然后再通過注意力權重與V進行計算得到一個權重向量,該權重向量所表示的含義就是在解碼時如何將注意力分配到Memory的各個位置上。這一過程我們可以通過如圖2-12和圖2-13所示的過程來進行表示。
圖 2-12. 解碼過程Q、K、V計算過程圖
如圖2-12所示,待解碼向量和Memory分別各自乘上一個矩陣后得到Q、K、V。
圖 2-13. 解碼第1個時刻輸出向量計算過程
如圖2-13所示,在解碼第1個時刻時,首先Q通過與K進行交互得到權重向量,此時可以看做是Q(待解碼向量)在K(本質上也就是Memory)中查詢Memory中各個位置與Q有關的信息;然后將權重向量與V進行運算得到解碼向量,此時這個解碼向量可以看作是考慮了Memory中各個位置編碼信息的輸出向量,也就是說它包含了在解碼當前時刻時應該將注意力放在Memory中哪些位置上的信息。
進一步,在得到這個解碼向量并經過圖2-10中最上面的兩層全連接層后,便將其輸入到分類層中進行分類得到當前時刻的解碼輸出值。
2.2.3 Decoder預測解碼過程
當第1個時刻的解碼過程完成之后,解碼器便會將解碼第1個時刻時的輸入,以及解碼第1個時刻后的輸出均作為解碼器的輸入來解碼預測第2個時刻的輸出。整個過程可以通過如圖2-14所示的過程來進行表示。
圖 2-14. Decoder多時刻解碼過程圖(圖片來自[3])
如圖2-14所示,Decoder在對當前時刻進行解碼輸出時,都會將當前時刻之前所有的預測結果作為輸入來對下一個時刻的輸出進行預測。假設現在需要將"我 是 誰"翻譯成英語"who am i",且解碼預測后前兩個時刻的結果為"who am",接下來需要對下一時刻的輸出"i"進行預測,那么整個過程就可以通過圖2-15和圖2-16來進行表示。
圖 2-15. 解碼過程中Q、K、V計算過程圖
如圖2-15所示,左上角的矩陣是解碼器對輸入" who am"這3個詞經過解碼器中自注意力機制編碼后的結果;左下角是編碼器對輸入"我 是 誰"這3個詞編碼后的結果(同圖2-12中的一樣);兩者分別在經過線性變換后便得到了Q、K和V這3個矩陣。此時值得注意的是,左上角矩陣中的每一個向量在經過自注意力機制編碼后,每個向量同樣也包含了其它位置上的編碼信息。
進一步,Q與K作用和便得到了一個權重矩陣;再將其與V進行線性組合便得到了Encoder-Decoder attention部分的輸出,如圖2-16所示。
圖 2-16. 解碼第3個時刻輸出向量計算過程
如圖2-16所示,左下角便是Q與K作用后的權重矩陣,它的每一行就表示在對Memory(這里指圖2-16中的V)中的每一位置進行解碼時,應該如何對注意力進行分配。例如第3行的含義就是在解碼當前時刻時應該將的注意力放在Memory中的"我"上,其它同理。這樣,在經過解碼器中的兩個全連接層后,便得到了解碼器最終的輸出結果。接著,解碼器會循環對下一個時刻的輸出進行解碼預測,直到預測結果為""或者達到指定長度后停止。
同時,這里需要注意的是,在通過模型進行實際的預測時,只會取解碼器輸出的其中一個向量進行分類,然后作為當前時刻的解碼輸出。例如圖2-16中解碼器最終會輸出一個形狀為[3,tgt_vocab_len]的矩陣,那么只會取其最后一個向量喂入到分類器中進行分類得到當前時刻的解碼輸出。具體細節見后續代碼實現。
2.2.4 Decoder訓練解碼過程
在介紹完預測時Decoder的解碼過程后,下面就繼續來看在網絡在訓練過程中是如何進行解碼的。從2.2.3小節的內容可以看出,在真實預測時解碼器需要將上一個時刻的輸出作為下一個時刻解碼的輸入,然后一個時刻一個時刻的進行解碼操作。顯然,如果訓練時也采用同樣的方法那將是十分費時的。因此,在訓練過程中,解碼器也同編碼器一樣,一次接收解碼時所有時刻的輸入進行計算。這樣做的好處,一是通過多樣本并行計算能夠加快網絡的訓練速度;二是在訓練過程中直接喂入解碼器正確的結果而不是上一時刻的預測值(因為訓練時上一時刻的預測值可能是錯誤的)能夠更好的訓練網絡。
例如在用平行預料"我 是 誰"<==>“who am i"對網絡進行訓練時,編碼器的輸入便是"我 是 誰”,而解碼器的輸入則是" who am i",對應的正確標簽則是"who am i "。
假設現在解碼器的輸入" who am i"在分別乘上一個矩陣進行線性變換后得到了Q、K、V,且Q與K作用后得到了注意力權重矩陣(此時還未進行softmax操作),如圖2-17所示。
圖 2-17. 解碼器輸入權重矩陣計算過程圖
從圖2-17可以看出,此時已經計算得到了注意力權重矩陣。由第1行的權重向量可知,在解碼第1個時刻時應該將(嚴格來說應該是經過softmax后的值)的注意力放到""上,的注意力放到"who"上等等。不過此時有一個問題就是,在2.2.3節中筆者介紹到,模型在實際的預測過程中只是將當前時刻之前(包括當前時刻)的所有時刻作為輸入來預測下一個時刻,也就是說模型在預測時是看不到當前時刻之后的信息。因此,Transformer中的Decoder通過加入注意力掩碼機制來解決了這一問題。
如圖2-18所示,左邊依舊是通過Q和K計算得到了注意力權重矩陣(此時還未進行softmax操作),而中間的就是所謂的注意力掩碼矩陣,兩者在相加之后再乘上矩陣V便得到了整個自注意力機制的輸出,也就是圖2-10中的Masked Multi-Head Attention。
圖 2-18. 注意力掩碼計算過程圖
那為什么注意力權重矩陣加上這個注意力掩碼矩陣就能夠達到這樣的效果呢?以圖2-18中第1行權重為例,當解碼器對第1個時刻進行解碼時其對應的輸入只有"",因此這就意味著此時應該將所有的注意力放在第1個位置上(盡管在訓練時解碼器一次喂入了所有的輸入),換句話說也就是第1個位置上的權重應該是1,而其它位置則是0。從圖2-17可以看出,第1行注意力向量在加上第1行注意力掩碼,再經過softmax操作后便得到了一個類似的向量。那么,通過這個向量就能夠保證在解碼第1個時刻時只能將注意力放在第1個位置上的特性。同理,在解碼后續的時刻也是類似的過程。
到此,對于整個單層Transformer的網絡結構以及編碼解碼過程就介紹完了,更多細節內容見后續代碼實現。
2.2.5 位置編碼與Attention Mask
在剛接觸Transformer的時候,有的人會認為在Decoder中,既然已經有了Attention mask那么為什么還需要Positional Embedding呢?如圖2-18所示,持這種觀點的朋友認為,Attention mask已經有了使得輸入序列依次輸入解碼器的能力,因此就不再需要Positional Embedding了。這樣想對嗎?
根據2.2.4節內容的介紹可以知道,Attention mask的作用只有一個,那就是在訓練過程中掩蓋掉當前時刻之后所有位置上的信息,而這也是在模仿模型在預測時只能看到當前時刻及其之前位置上的信息。因此,持有上述觀點的朋友可能是把“能看見”和“能看見且有序”混在一起了。
雖然看似有了Attention mask這個掩碼矩陣能夠使得Decoder在解碼過程中可以有序地看到當前位置之前的所有信息,但是事實上沒有Positional Embedding的Attention mask只能做到看到當前位置之前的所有信息,而做不到有序。前者的“有序”指的是喂入解碼器中序列的順序,而后者的“有序”指的是序列本身固有的語序。
如果不加Postional Embedding的話,那么以下序列對于模型來說就是一回事:
→ 北 → 京 → 歡 → 迎 → 你 →
→ 北 → 京 → 迎 → 歡 → 你 →
→ 北 → 京 → 你 → 迎 → 歡 →
雖然此時Attention mask具有能夠讓上述序列一個時刻一個時刻的按序喂入到解碼器中,但是它卻無法識別出這句話本身固有的語序。
2.2.6 原始Q、K、V來源
在Transformer中各個部分的Q、K、V到底是怎么來的一直以來都是初學者最大的一個疑問,并且這部分內容在原論文中也沒有進行交代,只是交代了如何根據Q、K、V來進行自注意力機制的計算。雖然在第2部分的前面幾個小節已經提及過了這部分內容,但是這里再給大家進行一次總結。
根據圖2-8(Transformer結構圖)可知,在整個Transformer中涉及到自注意力機制的一共有3個部分:Encoder中的Multi-Head Attention;Decoder中的Masked Multi-Head Attention;Encoder和Decoder交互部分的Multi-Head Attention。
① 對于Encoder中的Multi-Head Attention來說,其原始q、k、v均是Encoder的Token輸入經過Embedding后的結果。q、k、v分別經過一次線性變換(各自乘以一個權重矩陣)后得到了Q、K、V(也就是圖1-4中的示例),然后再進行自注意力運算得到Encoder部分的輸出結果Memory。
② 對于Decoder中的Masked Multi-Head Attention來說,其原始q、k、v均是Decoder的Token輸入經過Embedding后的結果。q、k、v分別經過一次線性變換后得到了Q、K、V,然后再進行自注意力運算得到Masked Multi-Head Attention部分的輸出結果,即待解碼向量。
對于Encoder和Decoder交互部分的Multi-Head Attention,其原始q、k、v分別是上面的帶解碼向量、Memory和Memory。q、k、v分別經過一次線性變換后得到了Q、K、V(也就是圖2-12中的示例),然后再進行自注意力運算得到Decoder部分的輸出結果。之所以這樣設計也是在模仿傳統Encoder-Decoder網絡模型的解碼過程。
3. 網絡結構與自注意力實現
在通過前面幾部分內容詳細介紹完Transformer網絡結構的原理后,接下來就讓我們來看一看如何借用Pytorch框架來實現MultiHeadAttention這一結構。同時,需要說明的一點是,下面所有的實現代碼都是筆者直接從Pytorch 1.4版本中torch.nn.Transformer模塊里摘取出來的簡略版,目的就是為了讓大家對于整個實現過程有一個清晰的認識。并且為了使得大家在閱讀完以下內容后也能夠對Pytorch中的相關模塊有一定的了解,所以下面的代碼在變量名方面也與Pytorch保持了一致。
3.1 多層Transformer
在第2部分中,筆者詳細介紹了單層Transformer網絡結構中的各個組成部分。盡管多層Transformer就是在此基礎上堆疊而來,不過筆者認為還是有必要在這里稍微提及一下。
圖 3-1. 單層Transformer網絡結構圖
如圖3-1所示便是一個單層Transformer網絡結構圖,左邊是編碼器右邊是解碼器。而多層的Transformer網絡就是在兩邊分別堆疊了多個編碼器和解碼器的網絡模型,如圖3-2所示。
圖 3-2. 多層Transformer網絡結構圖
如圖3-2所示便是一個多層的Transformer網絡結構圖(原論文中采用了6個編碼器和6個解碼器),其中的每一個Encoder都是圖3-1中左邊所示的網絡結構(Decoder同理)。可以發現,它真的就是圖3-1堆疊后的形式。不過需要注意的是其整個解碼過程。
在多層Transformer中,多層編碼器先對輸入序列進行編碼,然后得到最后一個Encoder的輸出Memory;解碼器先通過Masked Multi-Head Attention對輸入序列進行編碼,然后將輸出結果同Memory通過Encoder-Decoder Attention后得到第1層解碼器的輸出;接著再將第1層Decoder的輸出通過Masked Multi-Head Attention進行編碼,最后再將編碼后的結果同Memory通過Encoder-Decoder Attention后得到第2層解碼器的輸出,以此類推得到最后一個Decoder的輸出。
值得注意的是,在多層Transformer的解碼過程中,每一個Decoder在Encoder-Decoder Attention中所使用的Memory均是同一個。
3.2 Transformer中的掩碼
由于在實現多頭注意力時需要考慮到各種情況下的掩碼,因此在這里需要先對這部分內容進行介紹。在Transformer中,主要有兩個地方會用到掩碼這一機制。第1個地方就是在2.2.4節中介紹到的Attention Mask,用于在訓練過程中解碼的時候掩蓋掉當前時刻之后的信息;第2個地方便是對一個batch中不同長度的序列在Padding到相同長度后,對Padding部分的信息進行掩蓋。下面分別就這兩種情況進行介紹。
3.2.1 Attention Mask
如圖3-3所示,在訓練過程中對于每一個樣本來說都需要這樣一個對稱矩陣來掩蓋掉當前時刻之后所有位置的信息。
圖 3-3. 注意力掩碼計算過程圖
從圖3-3可以看出,這個注意力掩碼矩陣的形狀為[tgt_len,tgt_len],其具體Mask原理在2.2.4節中筆者已經介紹過l,這里就不再贅述。在后續實現過程中,我們將通過generate_square_subsequent_mask方法來生成這樣一個矩陣。同時,在后續多頭注意力機制實現中,將通過attn_mask這一變量名來指代這個矩陣。
3.2.2 Padding Mask
在Transformer中,使用到掩碼的第2個地方便是Padding Mask。由于在網絡的訓練過程中同一個batch會包含有多個文本序列,而不同的序列長度并不一致。因此在數據集的生成過程中,就需要將同一個batch中的序列Padding到相同的長度。但是,這樣就會導致在注意力的計算過程中會考慮到Padding位置上的信息。
圖 3-4. Padding時注意力計算過程圖
如圖3-4所示,P表示Padding的位置,右邊的矩陣表示計算得到的注意力權重矩陣。可以看到,此時的注意力權重對于Padding位置山的信息也會加以考慮。因此在Transformer中,作者通過在生成訓練集的過程中記錄下每個樣本Padding的實際位置;然后再將注意力權重矩陣中對應位置的權重替換成負無窮,經softmax操作后對應Padding位置上的權重就變成了0,從而達到了忽略Padding位置信息的目的。這種做法也是Encoder-Decoder網絡結構中通用的一種辦法。
圖 3-5. Padding掩碼計算過程圖
如圖3-5所示,對于"我 是 誰 P P"這個序列來說,前3個字符是正常的,后2個字符是Padding后的結果。因此,其Mask向量便為[True, True, True, False, False]。通過這個Mask向量可知,需要將權重矩陣的最后兩列替換成負無窮,在后續我們會通過torch.masked_fill這個方法來完成這一步,并且在實現時將使用key_padding_mask來指代這一向量。
到此,對于Transformer中所要用到Mask的地方就介紹完了,下面正式來看如何實現多頭注意力機制。
3.3 實現多頭注意力機制
3.3.1 多頭注意力機制
根據前面的介紹可以知道,多頭注意力機制中最為重要的就是自注意力機制,也就是需要前計算得到Q、K和V,如圖3-6所示。
圖 3-6. Q、K和V計算過程
然后再根據Q、K、V來計算得到最終的注意力編碼,如圖3-7所示:
圖 3-7. 注意力編碼計算圖
同時,為了避免單個自注意力機制計算得到的注意力權重過度集中于當前編碼位置自己所在的位置(同時更應該關注于其它位置),所以作者在論文中提到通過采用多頭注意力機制來解決這一問題,如圖3-8所示。
圖 3-8. 多頭注意力計算圖(2個頭)
transformxl
1.訓練長度固定,導致長文本需要分段訓練,導致上下文割裂碎片化
2.模型訓練好做inference時候,需要序列計算結果(后一個依賴于前一個生成結果)很費時
Transformer結構第一次提出來是用于機器翻譯任務,提出后自然有個想法:「Transformer結構能不能用于訓練語言模型?」 答案是肯定的。RNN、LSTM等網絡結構訓練語言模型的最大缺點在于容易梯度消失,難以學習長期依賴,但是Transformer沒有合格缺點,因為它沒有沿時間線進行橫向傳播的過程,這樣來說,Transformer很適合訓練語言模型。
怎么訓練?很簡單,舉個例子,假如現在我們有一句話包含100個token,在預測第一個token的時候,我們把其它的99個token進行attention mask掉,只輸入一個開始標記,讓模型預測第一個token;在預測第二個token的時候,把剩下的98個token attention mask掉,只讓模型看見開始標記和第一個token;在預測第三個token的時候,把剩下的97個token attention mask掉,只讓模型看見開始標記和前兩個token。。。損失函數為真實token和預測token的交叉熵,這樣模型不斷學習,不斷更新參數,就訓練得到一個語言模型了。
想想這樣有個什么問題?問題就是真實的文本可沒有只包含100個token這么少。舉個例子,假設我現在手頭有個文章是包含4000個token的,那我就要把這4000個token都作為輸入,原理上可以這么做,但實際上,輸入的token很多的情況下,中間層attention的計算資源會爆炸。
Vanilla Transformer的做法是「切片」,如把4000個token切成8段,每段包含500個token,再對每段進行獨立的訓練,也即在第二段訓練的時候,是看不到第一段的信息的,這樣導致的問題就是「上下文碎片問題(context fragmentation problem)」,由于切片長度限制,模型并不能學習到足夠常的依賴信息,這樣會大大損害學習出來的語言模型的性能。
在評估時,為了能利用訓練時的最長上下文信息,是每個時間步向右移動一個token,導致的結構是評估耗費的計算資源很大。
改進點
「改進點一:循環機制」
在計算每個segment的時候,通過緩存上一個segment的信息,把前面segment的信息也考慮進正向傳播過程中(上一個segment的信息雖然參與正向傳播,但上一個segment是不會參與反向傳播的)。具體的看,下面的式子,
這里的 指的是Transformer第n-1層的第 個segmetn的Encoder的輸出,把它與Transformer第n層的第 的encoder的輸出沿著時間軸拼接在一起,SG表示stop-gradient,即前一個segmetn的信息只參與正向傳播,并不會用到反向傳。另外,在計算查詢矩陣q時,只會用當前segmetn來計算得到;只有在計算鍵值向量時,才會用到拼接的segmetn向量。
這樣的做法,能大大緩解上下文碎片的問題,舉個例子,假設Transformer的encoder一共有4層,每個segment為500個token。根據循環機制的原理,第4層的第 T 個segmetn的輸出不僅考慮了第三層encoder的第 T個encoder的輸出,也考慮了第T-1 個encdoer的輸出,而第 T-1 個encdoer的輸出,不僅考慮了第二層encoder的第 T-1個encdoer的輸出,也考慮了第 T-2 個encdoer的輸出,也即,上下文的最大依賴長度是線性增加的,如O(N*L),如這里所說的例子,雖然,一個segmetn是500個token,但其實在最后輸出時,足足考慮了4 * 500 = 2000個token這么多!上下文碎片的問題也就自然得到了大大的緩解了。
另外,在評估時,由于采用了循環機制,我們就不必每次只向右移動一步了,而且可以采用同訓練時候差不多的片段機制,從而大大提高了評估效率。
「改進點二:相對位置編碼」
上面所說的循環機制還有個問題待解決,就是位置編碼,我們知道,原生的Transformer使用的是絕對位置編碼,但絕對位置編碼跟循環機制結合會導致一個問題,舉個例子,我們在計算第 T的輸出時,不僅考慮了第 T個片段的輸入,還考慮了第 T-1個片段的輸入,假設我們采用絕對位置編碼,那第 T個片段和 T-1個片段的第1個token的位置編碼是一樣的,但這是明顯的不合理的。因此,作者提出了一種相對位置編碼的思想。
具體的,原生的絕對位置編碼在計算attention時,如下式所示,
采用相對位置編碼,
通常這樣的變換,上面的每一項都有其相應的意義
-
(a)項為基于內容的尋址;
-
(b)項為基于內容的位置偏置;
-
?項為全局的內容偏置;
-
(d)為全局的位置偏置。
把循環機制和相對位置編碼的信息合并后,Transformer-XL的最終形態
swith-Transform
相比起 Sparse Attention 需要用到稀疏算子而很難發揮 GPU、TPU 硬件性能的問題。Switch Transformer 不需要稀疏算子,可以更好的適應 GPU、TPU 等稠密硬件。主要的想法是簡化稀疏路由。
即在自然語言 MoE (Mixture of experts)層中,只將 token 表征發送給單個專家而不是多個的表現會更好。模型架構如上圖,中間藍色部分是比價關鍵的部分,可以看到每次 router 都只把信息傳給分數 p 最大的單個 FFN。而這個操作可以大大降低計算量。
然后另一方面,其成功的原因是有一個很秀的并行策略,其同時結合了數據并行 + 模型并行 + expert 并行。具體如下圖:
其實對應模型架構來看,experts 并行是算子間的并行,其對應的 FFN 內部有算子級的模型并行,而整個 experts 在計算圖上又是個多并行 FFN 分支,這是算子間模型并行,所以能夠獲得更低的通信開銷,提高并行的效率。
大模型當前主流架構
bert系列
Bert模型是在2018年由Google在《Pre-training of Deep Bidirectional Transformers for Language Understanding(2018)》一文中提出。(關于更詳細的Bert模型介紹,可以查看張張舊文“深度學習基礎算法系列(24)- Bert原理和結構詳解”)
在Bert模型的基礎上,有很多針對Bert的改進模型,這里介紹幾種常見的改進模型。
(1)RoBERTa
RoBERTa是2019年在《 A Robustly Optimized BERT Pretraining Approach(2019)》一文中提出,在該文中細致的對Bert模型的訓練方式進行了對比實驗和分析,并基于此總結出了能夠提升Bert效果的訓練方法,主要包括以下幾個方面:動態mask機制、移除了NSP任務、batch size更大、訓練時間更長、訓練數據更多、訓練序列更長。
(2)ALBERT
ALBERT是在2020年《A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS(2020)》一文中提出,主要提出了一個輕量級的Bert模型,以此降低Bert的運行開銷。為了減少Bert資源開銷,該文主要提出了兩個優化:Factorized embedding parameterization以及Cross-layer parameter sharing。其中Factorized embedding parameterization將嵌入矩陣分解為兩個小的矩陣,Cross-layer parameter sharing是讓跨ALBERT的每一層共享transformer權重,這將顯著著減少參數。除了上述兩個降低Bert運行開銷的優化外,ALBERT提出了inter-senetnce loss這一新的優化目標。
(3)ELECTRA
ELECTRA是在2020年《PRE-TRAINING TEXT ENCODERS AS DISCRIMINATORS RATHER THAN GENERATORS(ICLR 2020)》一文中提出,該方法的核心思路采用了GAN的思路。模型包括一個generator生成器 和一個discriminator判別器。生成器通常是一個小的MLM,可以學習預測被mask token的原始單詞。 判別器被訓練以鑒別輸入token是否被生成器替換。通過對抗學習的方式,讓模型從文本中提取信息的能力增強。
(4)ERNIE(THU)
清華版的ERNIE(THU),把知識圖譜的信息整合進pre-train 的過程中,具體地,對于文本中的實體,在知識庫中找到對應的entity,利用 transE 來進行表示之后,在 BERT 的 text encoder 之上再加一層 knowledge encoder。文章主要的 contribution 就在于想到把 KG 融合到預訓練 language model 的過程中去。
(5)ERNIE(Baidu)
百度版的ERNIE(Baidu),重點在mask 的 level 上對中文文本做了調整,英文 mask 單詞是很直接的想法,而中文的處理一般是以詞為單位,因此會有 phrase mask 以及 entity mask,例如人名、地名的 mask。通過添加兩種 mask 機制,來讓 language model 隱式地學習到 entity 之間的關聯。 比較有趣的一點是,作者還在 Pre-train 中加入了 Dialogue 語料,結果顯示效果也會有一些提高。這指明了一個方向,在預訓練階段,除了修改模型、目標函數以外,選擇高質量、特定 domain 的語料也是可行的方向。
Bert、GPT融合改進模型
基于Bert和GPT模型,后續研究者們又提出了很多改進模型,這里主要介紹UniLM、XLNet、BART這3種。
(1)UniLM
UniLM 是2019年在《Unified Language Model Pre-training for Natural Language Understanding and Generation(NIPS 2019)》一文中提出,融合了EMLo、BERT、GPT3種語言模型優化目標,通過精巧的控制mask方式在一個模型中同時實現了3種語言模型優化任務,在pretrain過程交替使用3種優化目標。下圖比較形象的描述了UniLM是如何利用mask機制來控制3種不同的優化任務,核心思路是利用mask控制生成每個token時考慮哪些上下文的信息。
(2)XLNet
XLNet是2019年在《Generalized Autoregressive Pretraining for Language Understanding(NIPS 2019)》一文中提出,文中將無監督語言模型分成兩類,一類是AR自回歸模型,如GPT、ELMo這種使用單向語言模型建模概率分布的方法;另一類是AE自編碼模型,如BERT這種通過預測句子中token的方法。XLNet融合了AR模型和AE模型各自的優點,既能建模概率密度,適用于文本生成類任務,又能充分使用雙向上下文信息。XLNet實現AR和AE融合的主要思路為,對輸入文本進行排列組合,然后對于每個排列組合使用AR的方式訓練,不同排列組合使每個token都能和其他token進行信息交互,同時每次訓練又都是AR的。
(3)BART
BART是2019年在《 Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension(2019)》一文中提出,其包括兩個階段:首先原文本使用某種noise function進行破壞,然后使用sequence-to-sequence模型還原原始的輸入文本。下圖中左側為Bert的訓練方式,中間為GPT的訓練方式,右側為BART的訓練方式。首先,將原始輸入文本使用某些noise function,得到被破壞的文本。這個文本會輸入到類似Bert的Encoder中。在得到被破壞文本的編碼后,使用一個類似GPT的結構,采用自回歸的方式還原出被破壞之前的文本。
Gpt1到chatgpt技術演進路線
Generative Pre-trained Transformer(GPT)系列是由OpenAI提出的非常強大的預訓練語言模型,這一系列的模型可以在非常復雜的NLP任務中取得非常驚艷的效果,例如文章生成,代碼生成,機器翻譯,Q&A等,而完成這些任務并不需要有監督學習進行模型微調。而對于一個新的任務,GPT僅僅需要非常少的數據便可以理解這個任務的需求并達到接近或者超過state-of-the-art的方法。
當然,如此強大的功能并不是一個簡單的模型能搞定的,GPT模型的訓練需要超大的訓練語料,超多的模型參數以及超強的計算資源。GPT系列的模型結構秉承了不斷堆疊transformer的思想,通過不斷的提升訓練語料的規模和質量,提升網絡的參數數量來完成GPT系列的迭代更新的。GPT也證明了,通過不斷的提升模型容量和語料規模,模型的能力是可以不斷提升的。
這篇文章會依次介紹GPT-1[1],GPT-2[2],GPT-3[3],并介紹它們基于上個版本的改進點,文章主要的介紹的包括四個主要方向:算法的思想和目標,使用的數據集和預處理方式,模型結構以及算法的性能。
1. GPT-1:無監督學習
在GPT-1之前(和ELMo同一年),傳統的NLP模型往往使用大量的數據對有監督的模型進行任務相關的模型訓練,但是這種有監督學習的任務存在兩個缺點:
-
需要大量的標注數據,高質量的標注數據往往很難獲得,因為在很多任務中,圖像的標簽并不是唯一的或者實例標簽并不存在明確的邊界;
-
根據一個任務訓練的模型很難泛化到其它任務中,這個模型只能叫做“領域專家”而不是真正的理解了NLP。
這里介紹的GPT-1的思想是先通過在無標簽的數據上學習一個通用的語言模型,然后再根據特定熱任務進行微調,處理的有監督任務包括
-
自然語言推理(Natural Language Inference 或者 Textual Entailment):判斷兩個句子是包含關系(entailment),矛盾關系(contradiction),或者中立關系(neutral);
-
問答和常識推理(Question answering and commonsense reasoning):類似于多選題,輸入一個文章,一個問題以及若干個候選答案,輸出為每個答案的預測概率;
-
語義相似度(Semantic Similarity):判斷兩個句子是否語義上市是相關的;
-
分類(Classification):判斷輸入文本是指定的哪個類別。
將無監督學習左右有監督模型的預訓練目標,因此叫做通用預訓練(Generative Pre-training,GPT)。
1.1.3 任務相關的輸入變換
在第1節的時候,我們介紹了GPT-1處理的4個不同的任務,這些任務有的只有一個輸入,有的則有多組形式的輸入。對于不同的輸入,GPT-1有不同的處理方式,具體介紹如下:
-
分類任務:將起始和終止token加入到原始序列兩端,輸入transformer中得到特征向量,最后經過一個全連接得到預測的概率分布;
-
自然語言推理:將前提(premise)和假設(hypothesis)通過分隔符(Delimiter)隔開,兩端加上起始和終止token。再依次通過transformer和全連接得到預測結果;
-
語義相似度:輸入的兩個句子,正向和反向各拼接一次,然后分別輸入給transformer,得到的特征向量拼接后再送給全連接得到預測結果;
-
問答和常識推理:將
個選項的問題抽象化為
個二分類問題,即每個選項分別和內容進行拼接,然后各送入transformer和全連接中,最后選擇置信度最高的作為預測結果。
圖2:(左):transformer的基本結構,(右):GPT-1應用到不同任務上輸入數據的變換方式
1.2 GPT-1的數據集
GPT-1使用了BooksCorpus數據集[7],這個數據集包含本沒有發布的書籍。作者選這個數據集的原因有二:1. 數據集擁有更長的上下文依賴關系,使得模型能學得更長期的依賴關系;2. 這些書籍因為沒有發布,所以很難在下游數據集上見到,更能驗證模型的泛化能力。
1.3 網絡結構的細節
GPT-1使用了12層的transformer,使用了掩碼自注意力頭,掩碼的使用使模型看不見未來的信息,得到的模型泛化能力更強。
1.4 GPT-1的性能
在有監督學習的12個任務中,GPT-1在9個任務上的表現超過了state-of-the-art的模型。在沒有見過數據的zero-shot任務中,GPT-1的模型要比基于LSTM的模型穩定,且隨著訓練次數的增加,GPT-1的性能也逐漸提升,表明GPT-1有非常強的泛化能力,能夠用到和有監督任務無關的其它NLP任務中。GPT-1證明了transformer對學習詞向量的強大能力,在GPT-1得到的詞向量基礎上進行下游任務的學習,能夠讓下游任務取得更好的泛化能力。對于下游任務的訓練,GPT-1往往只需要簡單的微調便能取得非常好的效果。
GPT-1在未經微調的任務上雖然也有一定效果,但是其泛化能力遠遠低于經過微調的有監督任務,說明了GPT-1只是一個簡單的領域專家,而非通用的語言學家。
2. GPT-2:多任務學習
GPT-2的目標旨在訓練一個泛化能力更強的詞向量模型,它并沒有對GPT-1的網絡進行過多的結構的創新與設計,只是使用了更多的網絡參數和更大的數據集。下面我們對GPT-2展開詳細的介紹。
2.1 GPT-2的核心思想
GPT-2的學習目標是使用無監督的預訓練模型做有監督的任務。因為文本數據的時序性,一個輸出序列可以表示為一系列條件概率的乘積:
GPT-2訓練了4組不同的層數和詞向量的長度的模型,具體值見表2。通過這4個模型的實驗結果我們可以看出隨著模型的增大,模型的效果是不斷提升的。
3. GPT-3:海量參數
截止編寫此文前,GPT-3是目前最強大的語言模型,僅僅需要zero-shot或者few-shot,GPT-3就可以在下游任務表現的非常好。除了幾個常見的NLP任務,GPT-3還在很多非常困難的任務上也有驚艷的表現,例如撰寫人類難以判別的文章,甚至編寫SQL查詢語句,React或者JavaScript代碼等。而這些強大能力的能力則依賴于GPT-3瘋狂的1750億的參數量,45TB的訓練數據以及高達1200萬美元的訓練費用。
3.1 In-context learning
In-context learning是這篇論文中介紹的一個重要概念,要理解in-context learning,我們需要先理解meta-learning(元學習)[9, 10]。對于一個少樣本的任務來說,模型的初始化值非常重要,從一個好的初始化值作為起點,模型能夠盡快收斂,使得到的結果非常快的逼近全局最優解。元學習的核心思想在于通過少量的數據尋找一個合適的初始化范圍,使得模型能夠在有限的數據集上快速擬合,并獲得不錯的效果。
這里的介紹使用的是MAML(Model-Agnostic Meta-Learning)算法[10],正常的監督學習是將一個批次的數據打包成一個batch進行學習。但是元學習是將一個個任務打包成batch,每個batch分為支持集(support set)和質詢集(query set),類似于學習任務中的訓練集和測試集。
而GPT-3中據介紹的in-context learning(情境學習)則是元學習的內循環,而基于語言模型的SGT則是外循環,如圖5所示。
而另外一個方向則是提供容量足夠大的transformer模型來對語言模型進行建模。而近年來使用大規模的網絡來訓練語言模型也成為了非常行之有效的策略(圖6),這也促使GPT-3一口氣將模型參數提高到1750億個。
3.2 Few-shot,one-shot,zero-shot learning
在few-shot learning中,提供若干個(10-100個)示例和任務描述供模型學習。one-shot laerning是提供1個示例和任務描述。zero-shot則是不提供示例,只是在測試時提供任務相關的具體描述。作者對這3種學習方式分別進行了實驗,實驗結果表明,三個學習方式的效果都會隨著模型容量的上升而上升,且few shot > one shot > zero show。
從理論上講GPT-3也是支持fine-tuning的,但是fine-tuning需要利用海量的標注數據進行訓練才能獲得比較好的效果,但是這樣也會造成對其它未訓練過的任務上表現差,所以GPT-3并沒有嘗試fine-tuning。
3.3 數據集
GPT-3共訓練了5個不同的語料,分別是低質量的Common Crawl,高質量的WebText2,Books1,Books2和Wikipedia,GPT-3根據數據集的不同的質量賦予了不同的權值,權值越高的在訓練的時候越容易抽樣到,如表1所示。
InstrucGPT
-
論文名稱:Training language models to follow instructions with human feedback
-
論文地址:https://arxiv.org/pdf/2203.02155.pdf
-
模型結構:
圖9: Instruct GPT框架。
由于 GPT 3.0 會生成一些不真實、帶攻擊歧視的答案。GPT 團隊主要認為問題源于數據不行。因此,
-
第一步:他們雇傭了一個 40 個人的團隊,針對 prompt,寫一些高質量的答案來 finetune GPT 3.0
-
第二步:采集來自不同模型的答案,同樣由標注團隊來選擇他們的順序。以此來訓練一個 reward model
-
第三步:GPT 3.0 與 reward model 采取強化學習的策略迭代優化。
最終,Instruct GPT 相對于 GPT 3 生成的答案更為真實、準確。
圖 10, GPT 3 與 Instruct GPT 答案對比。
T5系列演進路線
T5全稱是Text-to-Text Transfer Transformer,是一種模型架構或者說是一種解決NLP任務的一種范式。
如下圖,就是把所有任務,如分類、相似度計算、文本生成都用一個Text-to-text(文本到文本)的框架里進行解決。
舉個例子,現在要做一個英文轉德文的機器翻譯任務,輸入"translate English to German: That is good.“,目標輸出是"Das ist gut.”,再舉個例子,現在做一個文本三分類任務,label為【entailment、contradiction、neutral】,輸入"“mnli premise: I hate pigeons. hypothesis: My feelings towards pigeons are filled with animosity.”,目標輸出是"entailment",注意哦,都是用"生成"的方式得到輸出類(可以理解成sequence to sequence)。
這樣的好處是可以把所有的問題都套進去一個統一的范式,從而可以采用同樣的模型架構、同樣的訓練策略、同樣的損失函數、同樣的解碼手段。
T5模型采用Transformer的encoder-decoder結構,之前介紹過GPT采用的是Transformer的decoder結構。
如圖所示,T5(Text-to-Text Transfer Transformer)模型將翻譯、分類、回歸、摘要生成等任務都統一轉成Text-to-Text任務,從而使得這些任務在訓練(pre-train和fine-tune)時能夠使用相同的目標函數,在測試時也能使用相同的解碼過程。 注意這里回歸任務對應的浮點數會被轉成字符串看待,從而可以token by token的預測出來。雖然感覺奇怪,but anyway, it works。
T5模型采用Transformer的encoder-decoder結構,之前介紹過GPT采用的是Transformer的decoder結構。
T5模型和原始的Transformer結構基本一致,除了做了如下幾點改動:
remove the Layer Norm bias
place the Layer Normalization outside the residual path
use a different position embedding
在下游任務上fine-tune,通過對各種對比實驗的結果進行分析,作者最終確定了訓練T5模型的較優方案,其中以下幾點值得注意:
無監督訓練目標:采用span-corruption目標,類似SpanBERT的做法。
預訓練策略:采用multi-task預訓練方式(即無監督任務和有監督任務一起預訓練),在對比遷移方法一小節中我們發現Multi-task pretraining + fine-tuning的效果和Unsupervised pre-training + fine-tuning的效果差不多,但是前者在預訓練過程還能夠監控下游任務的性能,因此作者最后采用Multi-task pre-training。
Transformer architecture variants
如圖所示為Transformer結構的幾種變種,主要區別在于模型中self-attention機制的可見范圍。
fully-visible attention mask:輸出序列的每個元素可以看見輸入序列的每個元素。
causal attention mask:輸出序列的每個元素只能看對應位置及之前的輸入序列的元素,無法看見未來的元素。
causal with prefix attention mask:輸入序列的一部分前綴采用fully-visible attention mask,其余部分采用 causal attention mask。
在最左側的Encoder-Decoder結構中,Encoder部分采用fully-visible attention mask,而Decoder部分采用causal attention mask。
中間的Language model結構中,采用causal attention mask。
最右側的Prefix LM結構中,采用causal with prefix attention mask。比如在翻譯任務中,給定訓練樣本translate English to German: That is good. target: Das ist gut.,我們對translate English to German: That is good. target:采用fully-visible attention mask,對Das ist gut.采用causal attention mask。
transformer和GPT、BERT、T5上層模型之間的關系
前面章節已經詳細介紹了Transformer的結構,包括了ENcode和Decode兩大部分。同時也介紹了為了加快traning速度transformer模型增加了OutputEmbedding輸入頭+attentionMask來實現前向學習能力。所以可以看到transfomer可以作為一個很好的自監督、無監督的知識萃取器。實際上后續的更重大模型也就是如此操作。首先用transfomer架構批量的學習現有語料的得到一個強大的表現力極強的底座模型,你可以把這個階段理解為一個人還沒有出來做事前的博覽群書增能力過程。然后又了一個底座模型后,用這個強大的底座模型在下游任務上做簡單結構改造做finetune,你可以把這個過程看成是就事鍛煉增強自己實際解決問題能力;要能夠成功這是有前提的,就是你得有足夠知識量(也就是pretraning底座模型要夠強。至于后續出現的prompt、自動prompt、以及instruct和cot,其實都是fintune之后的或者平級事情,也就是既然這個底座模型如此博覽群書牛逼無敵,那是否可以直接拿來用(zeroshot)或者我簡單給他幾個例子(fewshot)就可以為我所用,盡量減少finetune階段出了學校還要經過公司實習半年一年的實習時間也是浪費,直接為我所用就好了。為了達到這個目的,就出現了prompt(在學校時候就讓他按公司模式學習,或者出公司前有個懂學習校那套語言的人做工作-學校指令轉換),這個既要懂學校又要懂公司的人太少了所以人工prompt太難了,有沒辦法有個自動翻譯機器所以出現自動prompt階段。最后一個就到了instruct階段,這個底座這么牛逼翻譯過來就是這個學校科研能力這么強,有沒辦法我們產學研結合:你學校負責研發就好負責底座牛逼就行,我們公司層面和你多交互給你時不時下一些指令instruct,經過這么個上下游一體化有反饋的結合就可以讓學校科研為我所用,聽懂人話了。對于一些復雜的任務如果只在一次研發任務很難一次性搞透,有沒辦法對任務拆解逐步推進得到更好效果,這對應的技術的技術就是Cot(思維鏈)其實個人覺得這部分更多是在訓練數據上和工程鏈路上做文章,模型架構本身基本沒變化。
更學術解釋:Fine-tuning是使用大規模預訓練語言模型來進行下游任務的流行范式,但需要更新和存儲語言模型的全部參數。再運用到下游任務時,需要對每一個任務都需要存儲一份修改后的參數。Lightweight fine-tuning是嘗試解決上述問題的方法,Lightweight fine-tuning固定住絕大部分的預訓練參數,修改預訓練模型的小部分模塊。但是該方法最困難的地方是識別模塊中高表現的部分以其需要調節的預訓練參數。另一種比較比較流行的方法是Prompting, Prompting在模型的輸入前加上instructions和一些樣本使模型輸出任務需要的結果。
Gpt,gpt2,gpt3,bert,roberta,t5模型區別分析
只有decoder:
這些模型也稱為雙向或自動編碼,僅在預訓練期間使用編碼器,這通常是通過屏蔽輸入句子中的單詞并訓練模型進行重構來完成的。在預訓練的每個階段,注意力層都可以訪問所有輸入詞。該系列模型最適用于需要理解完整句子的任務,例如句子分類或提取式問答。
GPT:僅使用上文進行編碼
GPT2:仍然僅使用上文進行編碼(因為要處理生成任務)。但是模型更大,數據量更多。
GPT3:超大規模
對于不同的微調任務,我們需要對數據進行如下處理:
細節#
-
由于GPT仍然是一個生成式的語言模型,因此需要采用Mask Multi-Head Attention的方式來避免預測當前詞的時候會看見之后的詞,因此將其稱為單向Transformer,這也是首次將Transformer應用于預訓練模型,預測的方式就是將position-wise的前向反饋網絡的輸出直接送入分類器進行預測
-
此外整個GPT的訓練包括預訓練和微調兩個部分,或者說,對于具體的下游任務,其模型結構也必須采用與預訓練相同的結構,區別僅在于數據需要進行不同的處理
微調#
對于帶有標簽??的監督數據[??1,…,???],我們直接將其輸入到已經完成預訓練的模型中,然后利用最后一個位置的輸出對標簽進行預測,即
其中,???為分類器的參數,???為最后一層最后一個位置的輸出。則最大化優化目標即為:
??2(??)=∑(??,??)??? ??(??|??1,…,???)
只有encoder:
解碼器模型,通常稱為自回歸,在通常設計為強制模型預測下一個單詞的預訓練期間僅使用解碼器。注意層只能訪問句子中給定單詞之前的單詞。它們最適合涉及文本生成的任務。
Bert:同時使用上下文進行編碼,通過mask方式實現
Roberta:相比bert主要是在訓練參數上做了調整:batch size,adam參數,訓練數據、nsp loss、epoch數,詞表大小。
BERT的輸入表征由三種Embedding求和而成:
-
Token Embeddings:即傳統的詞向量層,每個輸入樣本的首字符需要設置為[CLS],可以用于之后的分類任務,若有兩個不同的句子,需要用[SEP]分隔,且最后一個字符需要用[SEP]表示終止
-
Segment Embeddings:為[0,1][0,1]序列,用來在NSP任務中區別兩個句子,便于做句子關系判斷任務
-
Position Embeddings:與Transformer中的位置向量不同,BERT中的位置向量是直接訓練出來的
Fine-tunninng#
對于不同的下游任務,我們僅需要對BERT不同位置的輸出進行處理即可,或者直接將BERT不同位置的輸出直接輸入到下游模型當中。具體的如下所示:
-
對于情感分析等單句分類任務,可以直接輸入單個句子(不需要[SEP]分隔雙句),將[CLS]的輸出直接輸入到分類器進行分類
-
對于句子對任務(句子關系判斷任務),需要用[SEP]分隔兩個句子輸入到模型中,然后同樣僅須將[CLS]的輸出送到分類器進行分類
-
對于問答任務,將問題與答案拼接輸入到BERT模型中,然后將答案位置的輸出向量進行二分類并在句子方向上進行softmax(只需預測開始和結束位置即可)
對于命名實體識別任務,對每個位置的輸出進行分類即可,如果將每個位置的輸出作為特征輸入到CRF將取得更好的效果。
缺點#
-
BERT的預訓練任務MLM使得能夠借助上下文對序列進行編碼,但同時也使得其預訓練過程與中的數據與微調的數據不匹配,難以適應生成式任務
-
另外,BERT沒有考慮預測[MASK]之間的相關性,是對語言模型聯合概率的有偏估計
-
由于最大輸入長度的限制,適合句子和段落級別的任務,不適用于文檔級別的任務(如長文本分類);
-
適合處理自然語義理解類任務(NLU),而不適合自然語言生成類任務(NLG)
同時有encoder-decoder:
編碼器-解碼器模型,也稱為序列到序列,使用了 Transformer 架構的兩個部分。編碼器的注意層可以訪問輸入中的所有單詞,而解碼器的注意力層只能訪問輸入中給定單詞之前的單詞。預訓練可以使用編碼器或解碼器模型的目標來完成,但通常涉及一些更復雜的東西。這些模型最適合圍繞根據給定輸入生成新句子的任務,例如摘要、翻譯或生成式問答。
T5。encoder的hidden層輸出用avgpooling,而不是像bert一樣用的cls-token
在訓練模型時,我們需要為模型定義一個任務來學習。上面已經提到了一些典型的任務,例如預測下一個詞或學習重建掩碼詞。“自然語言處理的預訓練模型:調查”包括一個相當全面的預訓練任務分類,所有這些都可以被認為是自我監督的:
-
Language Modeling (LM): 預測下一個標記(在單向 LM 的情況下)或前一個和下一個標記(在雙向 LM 的情況下)
-
Masked Language Modeling (MLM):從輸入句子中屏蔽掉一些標記,然后訓練模型通過其余標記預測被屏蔽的標記
-
Permuted Language Modeling (PLM): 與 LM 相同,但基于輸入序列的隨機排列。一個排列是從所有可能的排列中隨機抽取的。然后選擇一些標記作為目標,訓練模型來預測這些目標。
-
Denoising Autoencoder (DAE):采用部分損壞的輸入(例如,從輸入中隨機抽取標記并將其替換為 [MASK] 元素。從輸入中隨機刪除標記,或以隨機順序打亂句子)并旨在恢復原始未失真的輸入.
-
Contrastive Learning (CTL):文本對的得分函數是通過假設一些觀察到的文本對在語義上比隨機采樣的文本更相似來學習的。它包括:Deep InfoMax (DIM): 最大化圖像表示和圖像局部區域之間的互信息; Replaced Token Detection (RTD): 根據周圍環境預測令牌是否被替換; Next Sentence Prediction (NSP): 訓練模型區分兩個輸入句子是否是來自訓練語料的連續片段;和 Sentence Order Prediction(SOP): 類似于NSP,但使用兩個連續的片段作為正例,使用相同的片段但順序交換作為負例
對 Huggingface 中可用的63個transformer模型做了統計,按模型名稱、屬于哪類預訓練模型架構(只用transformer的decode、只用transformer的encode、transformer)、預訓練的任務、屬于那個家族系(bert、bart、gpt、t5、transformer…)。
https://docs.google.com/spreadsheets/d/1ltyrAB6BL29cOv2fSpNQnnq2vbX8UrHl47d7FkIf6t4/edit#gid=0
體系樹作圖如下
模型發展時間線
模型大小圖
中文大模型介紹
2021年4月,華為云聯合循環智能發布盤古NLP超大規模預訓練語言模型,參數規模達1000億;聯合北京大學發布盤古α超大規模預訓練模型,參數規模達2000億。
阿里達摩院發布270億參數的中文預訓練語言模型PLUG,聯合清華大學發布參數規模達到1000億的中文多模態預訓練模型M6。
2021年6 月,北京智源人工智能研究院發布了超大規模智能模型“悟道 2.0”,參數達到 1.75 萬億,成為當時全球最大的預訓練模型。
2021年7月,百度推出ERNIE 3.0 知識增強大模型,參數規模達到百億。10月,浪潮發布約2500億的超大規模預訓練模型“源1.0”。
2021年12月,百度推出ERNIE 3.0 Titan模型,參數規模達2600億。而達摩院的M6模型參數達到10萬億,將大模型參數直接提升了一個量級。
到2022年,大模型繼續火熱。最開始,大模型是集中在計算語言領域,但如今也已逐漸拓展到視覺、決策,應用甚至覆蓋蛋白質預測、航天等等重大科學問題,谷歌、Meta、百度等等大廠都有相應的成果。一時間,參數量低于 1 億的 AI 模型已經沒有聲量。
清華GLM
清華CPM-BEE
梳理各模型大小、參數、訓練數據
模型名稱
所屬機構
模型大小
模型架構
訓練數據
中文gpt-3
達摩院
30B
transformer decode
數據來源于wiki和commoncrawl
T5
元語智能
3B
transformer
PromptCLUE-large在1000億token中文語料上預訓練,累計學習1.5萬億中文token
PALM
達摩院
1B
encode(bert),decode(transformer decode)
PLUG
達摩院
27B
先StructBERT的encoder,然后訓練層的PALM encoder-decode
數據來源于wiki和commoncrawl
GPT-MoE中文
阿里云
75B
Switch Transformer decode
130億廣告
bloom中文
瀾舟科技
6.4B
未公布
GLM
清華
130B
混合
including autoencoding models (e.g., BERT), autoregressive models (e.g., GPT), and encoder-decoder models (e.g., T5)
4000 億個文本標識符(中文和英文各 2000 億)進行了訓練
CPM-ANT+
OPENBMB清華
10B
transformer encode(類似bert)
悟道數據集合優化處理
CPM-BEE
OPENBMB清華
10B
transformer encode(類似bert)
悟道數據集合優化處理
ERNIE 3.0 Titan
百度
260B
transformer encode(類似bert)預訓練+transformer decode(類似gpt)任務端
未公布
源1.0
浪潮
13B
盤古α
華為
200B
transformer decode
architectures of PLMs besides GPT and BERT.
從開源開放數據集、common crawl數據集、電子書等收集近80TB原始語料,構建了約1.1TB的高質量中文語料數據集、53種語種高質量單、雙語數據集2TB
悟道2.0
北京智源
1750B
transformer decode
0多種規則從100TB原始網頁數據中清洗得出最終數據集,注重隱私數據信息的去除,源頭上避免GPT-3存在的隱私泄露風險;包含教育、科技等50+個行業數據標簽
多模態大模型演進
信息壓縮
clip
ViT
SVIT
生成模型
生成模型和判別模型的差異
生成模型的目標是在給定了數據集D,并且假設這個數據集的底層分布(underlying distribution)是Pdata,我們希望夠近似出這個數據分布。如果我們能夠學習到一個好的生成模型,我們就能用這個生成模型為下游任務做inference 推理。
下面我們簡單回顧一下生成模型和判別模型,讀者可以自行選擇跳過這小節。
生成模型 VS 判別模型
對于判別模型(discriminative model),像邏輯回歸模型,是對給定的數據點預測一個標簽label,但是對于生成模型,它學習的是整個數據的聯合分布(joint distribution)。當然判別模型也可以理解為是給定了輸入數據后,標簽label的生成模型。但一般生成模型指的是高維數據。
那么如果我們的建模方式不一樣,對應的模型也是不一樣的。假設我們希望求 p(Y|X),對于左邊的模型,我們需要用貝葉斯規則計算 p(Y) 和 p(X|Y)。而對于右邊的模型,它已經可以直接用來計算 p(Y|X), 因為 p(X) 是給定的,所以我們可以不用給它建模。
我們將隨機變量在圖上顯示出來:
對于生成模型的聯合分布: p(Y,X)=p(Y)p(X1|Y)p(X2|Y,X1)…p(Xn|Y,X1,…,Xn1)我們需要考慮的是怎么確定 p(Xi|(X)pa(i),Y)的參數,這里的 pa(i)指的是指向隨機變量 Xi的隨機變量集合。
對于判別式模型的聯合分布: p(Y,X)=p(X1)p(X2|X1)p(X3|X1,X2)…p(Y|X1,…,Xn)
生成模型例子-樸素貝葉斯
樸素貝葉斯(Naive Bayes),它是生成模型的一個特例,它假設在給定了label之后,各個隨機變量之間是獨立的,這就是它 naive 的原因吧,如下圖:
用訓練數據估計參數,用貝葉斯規則做預測:
判別模型例子-邏輯回歸
邏輯回歸并不要求隨機變量之間獨立。
但是生成模型依然很有用,根據鏈式法則:
p(Y,X)=p(X|Y)p(Y)=p(Y|X)p(X)
假設 X的部分隨機變量是可觀測的,我們還是要計算 p(Y|Xevidence),那么我們就可以對這些看不到的隨機變量marginalize(積分求和)。
學習-Learning
生成模型的學習(learning)是指在給定一個數據分布 pdata和一個模型家族 (model family)的情況下,我們要從這個模型家族中找到一個近似分布pθ,使得它和數據分布盡可能的近。
但是要怎么衡量這個近呢?我們用距離來衡量, 寫成數學表達式:
minθ∈d(pdata,pθ)
因此,我們自然而然會對三個問題感興趣:
模型家族M的表達式是神馬?
-
目標函數 d() 是什么樣子的?
-
最小化 d() 的優化過程是什么?
推理-Inference
一個生成模型應該是一個聯合概率分布 p(x),假設這個概率分布是從一堆狗狗的圖片上學習到的,那么這個概率分布應該可以:
-
生成(Generation), 即采樣(sampling) xnew~p(x),并且采樣 xnew圖片應該很像狗狗。
-
密度估計(Density estimation),如果給了一張狗狗的圖片 x,那么這個概率分布 p(x) 的值應該很高。或者給了一張不相關的圖片,p(x)的值很低,這可以用來做異常檢測。
-
無監督表示學習(unsupervised representation learning), 我們可以學習到這些圖片的一些公共信息,像是一些特征,耳朵,尾巴…
但我們也發現量化評估上面的任務1和任務3其實是很難的;其次,并不是所有的模型家族在這些任務上都推理速度都快且精準,也正是因為推理過程的折中和權衡,導致了各種不同的方法。
數學建模為隨機分布,忽略了輸入數據分布逐步轉化到最后生成圖片的隨機過程,只關心輸入數據分布到生成數據分布的轉化分布。
-
自回歸模型
-
變分自編碼器
-
正則化流模型
-
生成對抗網絡
數學建模為隨機過程,輸入數據分布經歷了一個過程逐步轉化成最終生成圖片,對轉化的隨機過程也考慮進去,用T步隨機噪聲過程來模擬(擴散模型家族)。
1.DDIM
2.SDE
3.stable diffusion
VAE
深度隱變量模型(Deep Latent Variable Models)通常長什么樣子呢?
假設隱變量 z服從正態分布 z~N(0,I)
-
p(x|z)=(μθ(z),Σθ(z)) 其中 μθ和 Σθ都是神經網絡
-
我們希望在訓練完之后,z可以有一定的意義,能表示有意義的特征,這些特征可以用在無監督學習里面。
-
特征的計算可以通過 p(z|x)
當且僅當 q=p(z|x;θ) 的時候,等號成立。證明略,讀者可以帶入得到,也可以參考 VI 這節的證明。
因此,我們需要找到一個分布 q(z) 它必須和 p(z|x;θ)盡可能相近的時候,才能讓等式的右邊的證據下界和左邊的likelihood越接近。另外左邊的likelihood,也被稱之為evidence。
熟悉 KL divergence的讀者應該已經發現,當我們把右邊的式子移到左邊,其實就是分布q(z)和 分布p(z|x;θ)的KL散度:
DKL(q(z)||p(z|x;θ))=logp(x;θ)∑zq(z)logp(x,z;θ)H(q)≥0
當然,q=p(z|x;θ)的時候,KL散度為 0。
這個時候我們就將問題轉到了如何找到這樣的分布 q(z)?
在開始學習VAE的參數之前,我們看看這里有兩組參數需要我們優化,一組是對應于分布q 的參數 , 另一組是對應分布 p 的參數 θ,見下面的式子:
我們再來看一張學習 VAE,經常會看到的圖,很好的解釋了 ELBO,KL散度和likelihood之間的關系:
注意上面圖片中的q是conditioned在x 上的,暫時可以理解為給了我們一些 x 的信息后,我們的分布 q 才能更容易接近 p(z|x;θ),或者理解為 q的空間可以限定的小一些,這樣更容易采樣到有意義的樣本。
從上面的推導中,我們可以看到最大化likelihood這個問題被轉換為最大化證據下界ELBO。接下來,我們來看一下要怎么聯合優化參數 和 θ來最大化 ELBO。
學習Learning
根據前面的論述,我們知道我們的目標是要讓證據下界盡可能的大,這里再貼一下 ELBO:
從這個式子中,我們可以看到如果我們想求 θ(x;θ,)和 (x;θ,)。如果這個期望函數有對應的closed-form解自然是很好的,比如我們在 VI-變分推理里舉的那個例子,但是如果沒有,對于前者我們求起來很方便,假設q(z;)是容易采樣的,我們可以用采樣的方法:
但是要怎么求 (x;θ,) 呢?我們的期望是依賴 的,這個求解過程瞬間就變復雜了,當然其實也是可以用蒙特卡洛采樣的方法來求解的,這里先不講了。我們來看看另一個方法先。
再參數化-Reparameterization
我們將上面的式子簡化一下: ??q(z;)[r(z)]=∫q(z;)r(z)dz
把前面ELBO方括號中的東西全部用 r() 來表示。另外需要注意其中 z 是連續隨機變量。接下來假設分布 q(z;)=N(μ,σ2I), 參數為 =(μ,σ)。那么下面兩種方法的采樣是相同的:
-
采樣 z~q(z)
-
采樣 ~(0,I),z=μ+σ=g(😉
我們把第二種方法帶入前面的式子: ??z~q(z;)[r(z)]=??~(0,I)[r(g(😉)]=∫p()r(μ+σ)d
那我們再來對 ?求梯度:
??q(z;)[r(z)]=??[r(g(😉)]=??[r(g(😉)]
這樣我們就成功把求梯度的符號挪到了方括號里面去了,期望也不再依賴 了。只要 r 和 g對于 是可導的,我們就很容易用蒙特卡洛采樣來計算梯度了。
??[r(g(😉)]≈1k∑kr(g(k;))where1,…,k~(0,I)
我們在后面也會看到,這個trick使得我們的神經網絡可以反向傳導。
回到我們最初的ELBO中,我們可以看大我們的 r(z,)和這里的 r(z) 還有些差別,但是類似的,我們還是可以用reparameterization的方法將其轉換為:
??[r(g(😉),]≈1k∑kr(g(k;),)where1,…,k~(0,I)
Amortized Inference
假設我們的數據樣本集合為D,那么我們可以把我們的likelihood和ELBO 表達成:
值得注意的是,我們這里每個xi 都有一個參數 i與之對應,還記得我們的參數 是分布 q(z;)的參數,而這個分布是為了近似地擬合真實分布 p(z|xi;θ),從這個真實分布中,我們都可以看到這個后驗分布對于不同的數據點 ??i 都是不同的,因此對于不同的數據點,這個近似分布對于每個數據點的分布也應該是不同的,于是我們用不同的i來表示。
但是這樣一來,如果數據集很大,參數量就炸了呀。于是我們用一個參數化函數 fλ把每個 x 映射到一組變分參數上: xi→i,。通常我們把 q(z;fλ(xi)) 寫作 q(z|x)。
Amortized inference: 也就是要學習怎么通過 q(z;fλ(xi))),把 xi 映射到一組好的參數上 i。
于是我們的ELBO就變為:
那我們的整個計算流程就是:
- 初始化 θ(0), (0)
隨機在數據集D中抽一個數據點 xi
- 計算
- 根據梯度方向更新θ 和
計算梯度的方法還是用前面提到的reparameterization。
自編碼器的視角
有了上面的式子之后,我們可以進一步的把上面的式子進行轉換:
那這個式子就很有趣了。我們引入了z的先驗, 我們可以把它理解為:
-
首先,從數據集中拿出一個數據點 xi
-
用 q(z|xi)(encoder) 采樣 z
-
用 p(x|z ;θ) (decoder) 采樣得到重建的x
我們的訓練目標 (x;θ,),其中第一項是希望 x ≈xi^,即 xi 要在 p(x|z ;θ)下概率盡可能的大。第二項,是為了讓 z 盡可能的貼合先驗 p(z)換句話說假設我們的先驗是已知的,那么我們可以用它來代替q直接進行采樣z ~p(z),再用解碼器生成分布 p(x|z ;θ),進行采樣得到樣本。
GAN
一個最優的生成模型應該能夠生成最好的樣本質量(sample quality) 和最高的測試集的log-likelihood。但是對于不完美的模型,取得高的 log-likelihood 也許并不意味著好的樣本質量,反之亦然。
Two-sample tests
給定了 S1=x~P,S=x~Q, 一個 two-sample test 指的是下面的兩個假設(hypothesis):
-
Null hypothesis H0:P=Q
-
Alternate hypothesis: H1:P≠Q
我們用統計指標 T 來比較 S1和 S2,比如,T 可以是兩個分布均值的不同或者方差的不同。如果 T 小于一個閾值 α,那么接受 H0 否則就拒絕。我們可以看到測試統計指標 T 是 likelihood-free 的(likelihood-free),因為它并不直接考慮計算概率密度 P或者 Q,它只比較了兩個分布的樣本集合S1和 S2。
先前我們假設可以直接獲取到數據集S1==x~Pdata。另外,我們有模型分布 pθ,假設模型分布允許高效率采樣,S2=x~pθ。 Alternate notion of distance between distributions (改變兩個分布之間的距離定義): 訓練一個生成模型從而最小化 S1 和 S2 之間的two-sample test 目標。
到這里,我們可以發現,我們把從直接在概率密度分布上建模轉換到了用一個考慮兩個分布上的樣本的統計指標來衡量兩個分布是否相同。因此找到一個好的統計指標是至關重要的,它決定了我們是否能生成出高質量的樣本。
用判別器做 Two-Sample Test
在高維空間中找到這樣的統計指標還是很難的,比如說兩個高斯分布的方差相同,均值不同,那么它們的分布也是完全不同的。那在高維空間中更是如此,稍微某個維度有一些差異,那對應的分布可能就差很大。那么我們是不是能學習一個統計指標能找到這些差異,它最大化兩個樣本集S1 和 S2 之間的距離定義呢?
到這里,我們就有了兩個目標,一個目標是想最小化 S1 和 S2 之間的距離,使得 S2 的樣本盡量逼近 S1;另一個目標是最大化 S1和 S2 樣本之間的距離,找到那些會讓兩個分布很不相同的差異。
生成對抗網絡
生成對抗網絡是兩個玩家之間的零和游戲,這兩個玩家是 生成器 和 判別器。
生成器 (generator) 是一個有向的隱變量模型,隱變量 z和生成樣本x之間的映射為 Gθ。它的目標為最小化 two-sample test。
判別器 (discriminator) 是一個函數比如神經網絡,用來區分來自數據集的”真實”數據,和來自模型生成器的”偽造”數據。它的目標為最大化 two-sample test。
訓練目標
判別器的訓練目標為:
上面的式子可以理解為,對于一個固定的生成器,判別器就是做了一個二分類,交叉熵為目標,當x~pdata,即樣本來自真實數據集,那么概率賦值為1,當 x~pG,即樣本來自生成器,那么概率賦值為0.
最優的判別器有:
證明:對于給定的生成器 G,判別器 D 的訓練目標就是要最大化 V(G,D)
對于任意的 (a,b)∈R2,(a,b)≠0,0(,函數 y→alog(y)+blog(1y),在區間 [0,1][0,1] 上的取得最大值的地方在 aa+b。因此,令y=D(x),即可得證。
對于生成器,我們的訓練目標為:
也就是說我們希望能找到一個生成器,使得判別器的目標不能實現(最小),因此也就產生了對抗。
這時,將最優判別器 DG() 帶入,我們有:
DJSD 表示為 2xJensen-Shannon Divergence,也叫做對稱KL散度,寫作:
訓練流程
我們來總結一下 GAN 的訓練步驟:
從真實數據D中采樣 m個訓練樣本 x(1),x(2),…,x(m)
-
從噪聲分布 pz 中采樣 m 個噪聲向量 z(1),z(2),…,z(m)
-
用隨機梯度下降更新生成器參數 θ
因為我們這里是更新生成器,所以不關注 V的第一項(從真實數據采樣)。
-
用隨機梯度上升更新判別器參數
-
以上步驟重復固定個epochs
上面的訓練過程是先訓練生成器然后訓練判別器,這個順序也可以反過來。
訓練 GAN 中帶來的困難
GAN的訓練是比較困難的,許多論文提出了很多的tricks,主要的困難有以下幾個方面:
-
不穩定的優化過程 Unstable optimization
-
Mode collapse
-
評估 Evaluation
Unstable optimization
理論上來說,在每個step,判別器如果達到了最優,生成器在函數空間中更新,那么生成器是能夠收斂到數據分布的。但是實際訓練過程中,生成器和判別的損失函數值總是震蕩著的。也不同于極大似然估計MLE,應該什么時候停止訓練也很難判斷。
Mode Collapse
Mode Collapse 主要指的是GAN的生成器總是只生成固定的一個或幾個樣本,類似于modes(眾數)。事實上,筆者發現其它的一些生成模型也會有這個問題。
課件中給的例子是這樣的:假設我們的真實分布是混合高斯(mixture of Gaussians)
但是在生成過程中,我們的生成器分布總是在各個中心點之間跳來跳去。
對于眾數問題,可以通過改變架構,增加正則項,引入噪音干擾等方法。這里有個repo,給了許多GAN的訓練建議和tricks。
FLOW
自回歸模型雖然似然likelihood很容易計算但是沒有直接的辦法來學習特征。 變分自編碼器雖然可以學習特征的表示(隱變量 z 但是它的邊緣似然函數很難求,所以我們取而代之用了最大化證據下界ELBO來近似求解。
我們有沒有辦法設計一個含有隱變量的模型并且它的似然函數也容易求呢?的確是有的。 我們對這樣的模型還有些其他要求,除了概率密度是可以計算的,還需要容易采樣。許多簡單的分布像是高斯和均勻分布都是滿足這個要求的。但是實際的數據分布是很復雜的。那有什么辦法可以用這些容易采樣又容易計算概率密度的分布映射到復雜分布呢?有的,用換元法(change of variables)
在后面的部分中,讀者可以記住 z 來自于一個容易采樣的分布,x 來自于實際的數據的復雜分布。
在介紹 Flow 模型前,我們先來看一些基本概念。
換元法
相信大家對這個概念都不陌生。如果讀者對這個概念不熟悉,可以參考這個網站。
先來貼一下一維的公式: 如果 X=f(Z),f() 是單調的并且它的逆函數 Z=f1(X)=h(X),那么:
舉個例子,假設 Z=1/4X并且 Z~[0,2], 那么 pX(4)為多少 帶入公式 h(X)=X/4,所以 pX(4)=pZ(1)h′(4)=1/2×1/4=1/8。
更一般的,假設 Z 是一個均勻隨機向量 [0,1]^n,X=AZ,其中 A 是一個可逆的方陣,它的逆矩陣為 W=A1,那么 X 是怎么分布的?
矩陣 A 是把一個單位超立方體 [0,1]n 變成了一個超平行體。超立方體和超平行四邊形是正方形和平行四邊形的更一般式。下圖中,我們看到這里的變換矩陣
把單位正方形變成了一個任意的平行四邊形。
超平行四邊形體的體積(volume) 等于轉換矩陣 A的行列式的值。
因為 X是均勻分布在超四邊形上的,因此:
標準化流模型 Normalizing Flow Models
在一個標準流模型(normalizing flow model), 假設 Z和 X分別為隱變量和觀測變量,并且他們之間的映射為函數 f:nn,并且它是可逆的,那么 X=f(Z),Z=f1(X):
那么利用換元法,可以得到觀測變量的似然值為:
這里的 f 轉換函數我們加上了參數下標 θ,也就是我們的神經網絡學習的參數。從這個公式中,我們可以看到,假設我們的隱變量來自一個簡單分布,我們經過轉換 fθ,可以把它隱射到復雜分布 pX上,并且當我們想要計算觀測變量的概率值的時候只需要把這個過程逆轉過來,用 f1對 x 進行轉換并代入到簡單分布pZ中,乘以相應的行列式的值即可。當然,讀者應該會有疑惑,如何保證這個轉換是可逆的呢?這個我們后面再提。
這里插一張筆者從李宏毅老師的課件里摘來的圖:
這里的generator,也就是我們的 fθ,這里的正太分布π(z) 即為簡單分布 pZ。
流式轉換(flow of transformations)
標準化-Normalizing 換元法使得我們用一個可逆變換得到了標準化的概率密度。那么 流-Flow 的意思指的是一系列的可逆變換互相組合在一起:
-
首先 z0 來自于一個簡單分布,例如,高斯分布
-
用 M 個可逆轉換后得到了 x,即: xzM
-
通過換元,我們可以得到 (乘積的行列式等于行列式的乘積):
Planar flows
Planar flow 指的flow模型是它的可逆轉換為:
具體的代碼,可以參考這個repo,但是這里的代碼中的分布是由close-form解的,loss其實用的是KL divergence,和我們所希望學習的任意的實際數據分布(沒有close-formed)是不一樣的,之所以不能學習任意分布是因為論文中也沒給出計算Likelihoode所需要的 f1,論文參考這里。 后面我們會寫要怎么設計這個轉換。
下圖是 Planar flow 通過多次轉換后把簡單的高斯分布變成了復雜的一個分布:
學習和推理
我們把上面的likelhood,加上log,得到在數據集D上的極大似然為:
當我們訓練完模型,想要采樣的時候,可以通過前向轉換 zx z~pZ(z)x=fθ(z)
學習隱變量的表示可以通過逆轉換得到,比如我們有一張圖片,我們可以得到它的特征:
z=f1θ(x)
因為計算Jacobian的行列式值復雜度很高 O(n3),但是我們知道上三角/下三角矩陣的行列式的值為對角線元素相乘 O(n),所以復雜度一下子就降下來了。所以我們可以按照這個思路來設計我們的可逆轉換函數。
NICE
NICE(Non-linear Independent Components Estimation),源自這里。它包含了兩種類型的層,additive coupling layers 和 rescaling layers。
Additive coupling layers
首先我們把隱變量 z 分成兩個部分z1:d 和 zd+1:n,1≤d<n1。
那么我們的前向映射: zx
-
x1:d=z1:d (直接拷貝過去)
-
xd+1:n=zd+1:n+mθ(z1:d),其中mθ()是一個神經網絡,參數為 θ,輸入為維度為 d,輸出維度為 nd。
逆映射:xz
- z1:d=x1:d (直接拷貝回去)
因此,det(J)=1det(下三角矩陣,且對角線為1),當行列式的值為1的時候,我們稱這種變換為 Volume preserving transformation。
這些 coupling layers 可以任意疊加下去,所以是 additive的。并且每一層的隱變量分隔partition可以是不一樣的(d 的取值每一層都可以不同)。
Rescaling layers
NICE 的最后一層用了一個 rescaling transformation。同樣地,
前向映射: zx: xi=sizi
其中, si 是第i維的scaling factor.
逆映射:xz:
zi=xisi
前向映射的Jacobian矩陣為:
好了,我們的每種類型的曾都有前向映射和逆映射了,就可以開開心心的訓練我們的神經網絡了。
Real-NVP
Real-NVP(Non-volume presreving extention of NICE)是NICE模型的一個拓展,可以參考這篇論文。
如下圖所示:
我們可以發現 z1:d 基本都是直接復制下去了,其實也可以讓 z1:d和 zd+1:n 反一下,如下圖(疊加了3個coupling layers):
將自回歸模型看成流模型
這一節中,我們嘗試理解如何把自回歸模型看成是流模型,接著我們介紹兩種模型Masked Autoregressive Flow (MAF) 和 Inverse Autoregressive Flow (IAF)模型。
假設我們的自回歸模型:
MAF
我們的MAF(Masked Autoregressive Flow)的前向映射:
那么它的前向映射: zx
-
讓 x1=exp(α1)z1+μ1。并且計算 μ2(x1),α2(x1)
-
讓 x2=exp(α2)z2+μ2。并且計算 μ3(x1,x2),α3(x1,x2)
采樣依然是序列化的并且慢(和自回歸一樣),需要 O(n) 的時間。
逆映射如下圖:
逆映射:xz
-
所有的 μi和 αi 都可以并行計算,因為 zi 互相沒有依賴關系。比如我們可以用自回歸文章中介紹的 MADE 模型來做。
-
z1=(x1μ1)/exp(α1)
-
z2=(x2μ2)/exp(α2)
-
…
Jacobian矩陣是下三角,因此行列式的值計算起來也很快。 似然值評估(likelihood estimation)起來也很簡單方便,并且是并行的。(因為zi可以并行計算)
IAF
前面的MAF,我們發現采樣是很慢的但是計算likelihood很快,而在IAF(Inverse Autoregressive Flow)中這種情況反了過來。同樣地,我們分別來看看前向映射,逆映射和Jacobian值。
前向映射: zx (并行):
-
對 i=1,…,n 采樣 zi~(0,1)
-
并行計算好所有的 μi 和 αi
-
x1=exp(α1)z1+μ1
-
x2=exp(α2)z2+μ2
逆映射:xz (序列化計算):
-
讓 z1=(x1μ1)/exp(α1), 根據 z1計算μ2(z1), α2(z1)
-
讓 z2=(x2μ2)/exp(α2), 根據 z1,z2 計算 μ3(z1,z2),α3(z1,z2)
從上面的映射中可以看到采樣很方便, 計算數據點的likelihood很慢(訓練)。
注意,IAF對給定的數據點x計算likelihood慢,但是評估計算它自己生成的點的概率是很快的。
IAF 是 MAF 的逆過程
如下圖,我們發現在 MAF 的逆轉換中,把 x 和 z交換一下,就變成了 IAF 的前向轉換。類似地。 MAF 的前向轉換是 IAF的逆轉換。
MAF的likelihood計算很快,采樣很慢。IAF的采樣很快,likelihood計算很慢。所以MAF更適合基于極大似然估計(MLE)的訓練過程以及概率密度計算,IAF更適合實施的生成過程。那我們可以同時利用兩個模型的優點嗎?
Parallel Wavenet
接下來就看一下我們怎么同時利用 MAF 和 IAF 的特點,訓練一個采樣和訓練都很快的模型。
Parallel Wavenet 分兩個部分,一個老師模型,一個學生模型。 其中老師模型是 MAF, 用來做訓練計算極大似然估計MLE。 一旦老師模型訓練好了之后,我們再來訓練學生模型。學生模型用 IAF,雖然學生模型不能快速計算給定的外部數據點的概率密度,但是它可以很快地采樣,并且它也可以直接計算它的隱變量的概率密度。
概率密度蒸餾(Probability density distillation): 學生模型的訓練目標是最小化學生分布 s和 老師分布 t?之間的 KL 散度。
DKL(s,t)=Ex~s[logs(x)logt(x)]
計算流程為:
-
用學生模型 IAF 抽取樣本 x (詳見IAF前向轉換)
-
獲得學生模型的概率密度 (這里的概率密度直接用上一步中的z和相應的Jacobian矩陣的值exp(∑ni=1αi)得到)
-
用老師模型 MAF 計算,根據學生模型采樣得到的 x樣本的概率密度。
-
計算KL散度
整體的訓練過程就是:
-
用極大似然訓練老師模型 MAF
-
用最小化和老師模型的分布的KL散度訓練學生模型 IAF
測試過程: 用學生模型直接測試,生成樣本
這個流程的效率比原來的 Wavenet-自回歸模型快了近1000倍!
Parallel Wavenet 論文
我們來看一下這個模型的圖:
首先呢,我們的老師模型 MAF 已經是訓練好了,注意在訓練過程中會加上一些語言學信息特征 linguistic features(通常大家用的都是spectrogram頻譜,筆者不是很確定直接加像是文字特征行不行)。接著呢,我們讓學生模型 IAF 進行采樣,采樣得到的樣本(紫色的圈圈)放到老師模型中去評估概率密度。
WaveGlow
我們還是回到Glow模型來看看另一個例子,WaveGlow
這里的 WN 模塊指的是類似于WaveNet中的結構,實際上它可以是任意的神經網絡結構,作者用了膨脹卷積(dilated convolutions)和gated-tanh,invertible 1x1 convolution可以參考這篇論文。稍微注意一下,我們前面都是從 zx,現在這張圖我們是直接看的逆轉換xz(畢竟在訓練的時候,我們就是在用 z 計算likelihood)。
代碼可以參考這里。
diffusion發展史
對于擴散模型技術正在蓬勃發展期,網上的資料也很多很全面,各種綜述文章也不少。我就不在做更多闡述,會把一些我覺得整理不錯的技術帖綜合放進文章,減少大家文章檢索的工作保持閱讀流暢。
其實diffusion模型和上面一些模型的主要差異在于對生成過程的建模。相當于是通過增加了一個隨機生成過程的仿真讓生成內容質量可控。
擴散模型(diffusion models)是深度生成模型中新的SOTA。擴散模型在圖片生成任務中超越了原SOTA:GAN,并且在諸多應用領域都有出色的表現,如計算機視覺,NLP、波形信號處理、多模態建模、分子圖建模、時間序列建模、對抗性凈化等。此外,擴散模型與其他研究領域有著密切的聯系,如穩健學習、表示學習、強化學習。然而,原始的擴散模型也有缺點,它的采樣速度慢,通常需要數千個評估步驟才能抽取一個樣本;它的最大似然估計無法和基于似然的模型相比;它泛化到各種數據類型的能力較差。如今很多研究已經從實際應用的角度解決上述限制做出了許多努力,或從理論角度對模型能力進行了分析。
然而,現在缺乏對擴散模型從算法到應用的最新進展的系統回顧。為了反映這一快速發展領域的進展,我們對擴散模型進行了首個全面綜述。我們設想我們的工作將闡明擴散模型的設計考慮和先進方法,展示其在不同領域的應用,并指出未來的研究方向。此綜述的概要如下圖所示:
盡管diffusion model在各類任務中都有著優秀的表現,它仍還有自己的缺點,并有諸多研究對diffusion model進行了改善。為了系統地闡明diffusion model的研究進展,我們總結了原始擴散模型的三個主要缺點,采樣速度慢,最大化似然差、數據泛化能力弱,并提出將的diffusion models改進研究分為對應的三類:采樣速度提升、最大似然增強和數據泛化增強。我們首先說明改善的動機,再根據方法的特性將每個改進方向的研究進一步細化分類,從而清楚的展現方法之間的聯系與區別。在此我們僅選取部分重要方法為例, 我們的工作中對每類方法都做了詳細的介紹,內容如圖所示:
在分析完三類擴散模型后,我們將介紹其他的五種生成模型GAN,VAE,Autoregressive model, Normalizing flow, Energy-based model。考慮到擴散模型的優良性質,研究者們已經根據其特性將diffusion model與其他生成模型結合,所以為了進一步展現diffusion model 的特點和改進工作,我們詳細地介紹了diffusion model和其他生成模型的結合的工作并闡明了在原始生成模型上的改進之處。Diffusion model在諸多領域都有著優異的表現,并且考慮到不同領域的應用中diffusion model產生了不同的變形,我們系統地介紹了diffusion model的應用研究,其中包含如下領域:計算機視覺,NLP、波形信號處理、多模態建模、分子圖建模、時間序列建模、對抗性凈化。對于每個任務,我們定義了該任務并介紹利用擴散模型處理任務的工作,我們將本項工作的主要貢獻總結如下:
l 新的分類方法:我們對擴散模型和其應用提出了一種新的、系統的分類法。具體的我們將模型分為三類:采樣速度提升、最大似然提升、數據泛化提升。進一步地,我們將擴散模型的應用分為七類:計算機視覺,NLP、波形信號處理、多模態建模、分子圖建模、時間序列建模、對抗性凈化。
l 全面的回顧:我們首次全面地概述了現代擴散模型及其應用。我們展示了每種擴散模型的主要改進,和原始模型進行了必要的比較,并總結了相應的論文。對于擴散模型的每種類型的應用,我們展示了擴散模型要解決的主要問題,并說明它們如何解決這些問題
l 未來研究方向:我們對未來研究提出了開放型問題,并對擴散模型在算法和應用方面的未來發展提供了一些建議。
二. 擴散模型基礎
生成式建模的一個核心問題是模型的靈活性和可計算性之間的權衡。擴散模型的基本思想是正向擴散過程來系統地擾動數據中的分布,然后通過學習反向擴散過程恢復數據的分布,這樣就了產生一個高度靈活且易于計算的生成模型。
A. Denoising Diffusion Probabilistic Models(DDPM)
一個DDPM由兩個參數化馬爾可夫鏈組成,并使用變分推斷以在有限時間后生成與原始數據分布一致的樣本。前向鏈的作用是擾動數據,它根據預先設計的噪聲進度向數據逐漸加入高斯噪聲,直到數據的分布趨于先驗分布,即標準高斯分布。反向鏈從給定的先驗開始并使用參數化的高斯轉換核,學習逐步恢復原數據分布。用 x0 ~q(x0) 表示原始數據及其分布,則前向鏈的分布是可由下式表達:
這說明前向鏈是馬爾可夫過程, xt 是加入t步噪音后的樣本, βt 是事先給定的控制噪聲進度的參數。當 ∏t1βt趨于1時, xT 可以近似認為服從標準高斯分布。當 βt 很小時,逆向過程的轉移核可以近似認為也是高斯的:
我們可以將變分下界作為損失函數進行學習:
B. Score-Based Generative Models(SGM)
上述DDPM可以視作SGM的離散形式。SGM構造一個隨機微分方程(SDE)來平滑的擾亂數據分布,將原始數據分布轉化到已知的先驗分布:
和一個相應的逆向SDE,來將先驗分布變換回原始數據分布:
因此,要逆轉擴散過程并生成數據,我們需要的唯一信息就是在每個時間點的分數函數。利用score-matching的技巧我們可以通過如下損失函數來學習分數函數:
對兩種方法的進一步介紹和兩者關系的介紹請參見我們的文章。
原始擴散模型的三個主要缺點,采樣速度慢,最大化似然差、數據泛化能力弱。最近許多研究都在解決這些缺點,因此我們將改進的擴散模型分為三類:采樣速度提升、最大似然增強和數據泛化增強。在接下來的三、四、五節我們將對這三類模型進行詳細的介紹。
三. 采樣加速方法
在應用時,為了讓新樣本的質量達到最佳,擴散模型往往需要進行成千上萬步計算來獲取一個新樣本。這限制了diffusion model的實際應用價值,因為在實際應用時,我們往往需要產生大量的新樣本,來為下一步處理提供材料。研究者們在提高diffusion model采樣速度上進行了大量的研究。我們對這些研究進行了詳細的闡述。我們將其細化分類為三種方法:Discretization Optimization,Non-Markovian Process,Partial Sampling。
A. Discretization Optimization方法優化求解diffusion SDE的方法。因為現實中求解復雜SDE只能使用離散解來逼近真正的解,所以該類方法試圖優化SDE的離散化方法,在保證樣本質量的同時減少離散步數。SGM 提出了一個通用的方法來求解逆向過程,即對前向和后向過程采取相同的離散方法。如果給定了前向SDE的離散方式:
那么我們就可以以相同的方式離散化逆向SDE:
這種方法比樸素DDPM效果略好一點。進一步,SGM向SDE求解器中加入了一個矯正器,從而讓每一步生成的樣本都有正確的分布。在求解的每一步,求解器給出一個樣本后,矯正器都使用馬爾可夫鏈蒙特卡羅方法來矯正剛生成的樣本的分布。實驗表明向求解器中加入矯正器比直接增加求解器的步數效率更高。
B. Non-Markovian Process方法突破了原有Markovian Process的限制,其逆過程的每一步可以依賴更多以往的樣本來進行預測新樣本,所以在步長較大時也能做出較好的預測,從而加速采樣過程。其中主要的工作DDIM,不再假設前向過程是馬爾可夫過程,而是服從如下分布:
DDIM的采樣過程可以視為離散化的神經常微分方程,其采樣過程更高效,并且支持樣本的內插。進一步的研究發現DDIM可以視作流形上擴散模型PNDM的特例。
C. Partial Sampling方法通過在generation process中忽略一部分的時間節點,而只使用剩下的時間節點來生成樣本,直接減少了采樣時間。例如,Progressive Distillation從訓練好的擴散模型中蒸餾出效率更高的擴散模型。對于訓練好的一個擴散模型,Progressive Distillation會從新訓練一個擴散模型,使新的擴散模型的一步對應于訓練好的擴散模型的兩步,這樣新模型就可以省去老模型一半的采樣過程。具體算法如下:
不斷循環這個蒸餾過程就能讓采樣步驟指數級下降。
四. 最大似然估計加強
擴散模型在最大似然估計的表現差于基于似然函數的生成模型,但最大化似然估計在諸多應用場景都有重要意義,比如圖片壓縮, 半監督學習, 對抗性凈化。由于對數似然難以直接計算,研究主要集中在優化和分析變分下界(VLB)。我們對提高擴散模型最大似然估計的模型進行了詳細的闡述。我們將其細化分類為三類方法:Objectives Designing,Noise Schedule Optimization,Learnable Reverse Variance。
A. Objectives Designing方法利用擴散 SDE推倒出生成數據的對數似然與分數函數匹配的損失函數的關系。這樣通過適當設計損失函數,就可以最大化 VLB 和對數似然。 Song et al. 證明了可以設計損失函數的權重函數,使得plug-in reverse SDE 生成樣本的似然函數值小于等于損失函數值,即損失函數是似然函數的上界。分數函數擬合的損失函數如下:
我們只需將權重函數 λ(t) 設為擴散系數g(t)即可讓損失函數成為似然函數的VLB,即:
B. Noise Schedule Optimization通過設計或學習前向過程的噪聲進度來增大VLB。VDM證明了當離散步數接近無窮時,損失函數完全由信噪比函數SNR(t)的端點決定:
那么在離散步數接近無窮時,可以通過學習信噪比函數SNR(t)的端點最優化VLB,而通過學習信噪比函數中間部分的函數值來實現模型其他方面的改進。
C. Learnable Reverse Variance方法學習反向過程的方差,從而較少擬合誤差,可以有效地最大化VLB。Analytic-DPM證明,在DDPM和DDIM中存在反向過程中的最優期望和方差:
使用上述公式和訓練好的分數函數,在給定前向過程的條件下,最優的VLB可以近似達到。
五. 數據泛化增強
擴散模型假設數據存在于歐幾里得空間,即具有平面幾何形狀的流形,并添加高斯噪聲將不可避免地將數據轉換為連續狀態空間,所以擴散模型最初只能處理圖片等連續性數據,直接應用離散數據或其他數據類型的效果較差。這限制了擴散模型的應用場景。數個研究工作將擴散模型推廣到適用于其他數據類型的模型,我們對這些方法進行了詳細地闡釋。我們將其細化分類為兩類方法:Feature Space Unification,Data-Dependent Transition Kernels。
A. Feature Space Unification方法將數據轉化到統一形式的latent space,然后再latent space上進行擴散。LSGM提出將數據通過VAE框架先轉換到連續的latent space 上后再在其上進行擴散。這個方法的難點在于如何同時訓練VAE和擴散模型。LSGM表明由于潛在先驗是intractable的,分數匹配損失不再適用。LSGM直接使用VAE中傳統的損失函數ELBO作為損失函數,并導出了ELBO和分數匹配的關系:
該式在忽略常數的意義下成立。通過參數化擴散過程中樣本的分數函數,LSGM可以高效的學習和優化ELBO。
B. Data-Dependent Transition Kernels方法根據數據類型的特點設計diffusion process 中的transition kernels,使擴散模型可以直接應用于特定的數據類型。D3PM為離散型數據設計了transition kernel,可以設為lazy random-walk,absorbing state等。GEODIFF為3D分子圖數據設計了平移-旋轉不變的圖神經網絡,并且證明了具有不變性的初分布和transition kernel可以導出具有不變性的邊緣分布。假設T是一個平移-旋轉變換,如:
那么生成的樣本分布也有平移-旋轉不變性:
六. 和其他生成模型的聯系
在下面的每個小節中,我們首先介紹其他五類重要的生成模型,并分析它們的優勢和
局限性。然后我們介紹了擴散模型是如何與它們聯系起來的,并說明通過結合擴散模型來改進這些生成模型。VAE,GAN,Autoregressive model, Normalizing flow, Energy-based model和擴散模型的聯系如下圖所示:
A. DDPM可以視作層次馬爾可夫VAE(hierarchical Markovian VAE)。但DDPM和一般的VAE也有區別。DDPM作為VAE,它的encoder和decoder都服從高斯分布、有馬爾科夫行;其隱變量的維數和數據維數相同;decoder的所有層都共用一個神經網絡。
B. DDPM可以幫助GAN解決訓練不穩定的問題。因為數據是在高維空間中的低維流形中,所以GAN生成數據的分布和真實數據的分布重合度低,導致訓練不穩定。擴散模型提供了一個系統地增加噪音的過程,通過擴散模型向生成的數據和真實數據添加噪音,然后將加入噪音的數據送入判別器,這樣可以高效地解決GAN無法訓練、訓練不穩定的問題。
C. Normalizing flow通過雙射函數將數據轉換到先驗分布,這樣的作法限制了Normalizing flow的表達能力,導致應用效果較差。類比擴散模型向encoder中加入噪聲,可以增加Normalizing flow的表達能力,而從另一個視角看,這樣的做法是將擴散模型推廣到前向過程也可學習的模型。
D. Autoregressive model在需要保證數據有一定的結構,這導致設計和參數化自回歸模型非常困難。擴散模型的訓練啟發了自回歸模型的訓練,通過特定的訓練方式避免了設計的困難。
E. Energy-based model直接對原始數據的分布建模,但直接建模導致學習和采樣都比較困難。通過使用擴散恢復似然,模型可以先對樣本加入微小的噪聲,再從有略微噪聲的樣本分布來推斷原始樣本的分布,使的學習和采樣過程更簡單和穩定。
七. 擴散模型的應用
在下面的每個小節中,我們分別介紹了擴散模型在計算機視覺、自然語言處理、波形信號處理、多模態學習、分子圖生成、時間序列以及對抗學習等七大應用方向中的應用,并對每類應用中的方法進行了細分并解析。例如在計算機視覺中可以用diffusion model進行圖像補全修復(RePaint):
在多模態任務中可以用diffusion model進行文本到圖像的生成(GLIDE):
還可以在分子圖生成中用diffusion model進行藥物分子和蛋白質分子的生成(GeoDiff):
應用分類匯總見表:
VAEGANFLOWDDPMSDE技術區別
總結:
1.數學建模為隨機分布,忽略了輸入數據分布逐步轉化到最后生成圖片的隨機過程,只關心輸入數據分布到生成數據分布的轉化分布。
a.自回歸模型 b.變分自編碼器. c.正則化流模型 d.生成對抗網絡
2.數學建模為隨機過程,輸入數據分布經歷了一個過程逐步轉化成最終生成圖片,對轉化的隨機過程也考慮進去,用T步隨機噪聲過程來模擬(擴散模型家族)。
a.DDIM b.SDE c.stable diffusion
3.從Auto encode到VAE,是對數據樣本做了分布假設,不是單個數據點,輸入數據是一個分布。增加輸入多樣性,讓學習更難增加模型輸出的魯棒性。
4.GAN的不穩定性來源于,對數據樣本分布沒做任何約束、同時對隨機分布也沒做任何約束,可以認為是隨機分布建模生成的最樸素方法。所以模型的表達力很強,但是可控性不太好
5.Flow其實已經有對生成過程約束的意思了,只是沒有引入隨機工程數學建模,所以flow可控性比較好
通俗理解
現在我們通過一個比喻來說明它們之間的區別。我們把數據的生成過程,也就是從Z映射到X的過程,比喻為過河。河的左岸是Z,右岸是X,過河就是乘船從左岸碼頭到達右岸碼頭。船可以理解為生成模型,碼頭的位置可以理解為樣本點Z或者X在分布空間的位置。不同的生成模型有不同的過河的方法,如下圖所示(圖中小圓點代表樣本點,大圓圈代表樣本分布,綠色箭頭表示loss),我們分別來分析。
不同生成模型的過河方式
1. GAN的過河方式
從先驗分布隨機采樣一個Z,也就是在左岸隨便找一個碼頭,直接通過對抗損失的方式強制引導船開到右岸,要求右岸下船的碼頭和真實數據點在分布層面上比較接近。
2. VAE的過河方式
1)VAE在過河的時候,不是強制把河左岸的一個隨機點拉到河右岸,而是考慮右岸的數據到達河左岸會落在什么樣的碼頭。如果知道右岸數據到達左岸大概落在哪些碼頭,我們直接從這些碼頭出發就可以順利回到右岸了。
2)由于VAE編碼器的輸出是一個高斯分布的均值和方差,一個右岸的樣本數據X到達河左岸的碼頭位置不是一個固定點,而是一個高斯分布,這個高斯分布在訓練時會和一個先驗分布(一般是標準高斯分布)接近。
3)在數據生成時,從先驗分布采樣出來的Z也大概符合右岸過來的這幾個碼頭位置,通過VAE解碼器回到河右岸時,大概能到達真實數據分布所在的碼頭。
3. Flow的過河方式
1)Flow的過河方式和VAE有點類似,也是先看看河右岸數據到河左岸能落在哪些碼頭,在生成數據的時候從這些碼頭出發,就比較容易能到達河右岸。
2)和VAE不同的是,對于一個從河右岸碼頭出發的數據,通過Flow到達河左岸的碼頭是一個固定的位置,并不是一個分布。而且往返的船開著雙程航線,來的時候從什么右岸碼頭到達左岸碼頭經過什么路線,回去的時候就從這個左岸碼頭經過這個路線到達這個右岸碼頭,是完全可逆的。
3)Flow需要約束數據到達河左岸碼頭的位置服從一個先驗分布(一般是標準高斯分布),這樣在數據生成的時候方便從先驗分布里采樣碼頭的位置,能比較好的到達河右岸。
4. Diffusion的過河方式
1)Diffusion也借鑒了類似VAE和Flow的過河思想,要想到達河右岸,先看看數據從河右岸去到左岸會在哪個碼頭下船,然后就從這個碼頭上船,準能到達河右岸的碼頭。
2)但是和Flow以及VAE不同的是,Diffusion不只看從右岸過來的時候在哪個碼頭下船,還看在河中央經過了哪些橋墩或者浮標點。這樣從河左岸到河右岸的時候,也要一步一步打卡之前來時經過的這些浮標點,能更好約束往返的航線,確保到達河右岸的碼頭位置符合真實數據分布。
3)Diffusion從河右岸過來的航線不是可學習的,而是人工設計的,能保證到達河左岸的碼頭位置,雖然有些隨機性,但是符合一個先驗分布(一般是高斯分布),這樣方便我們在生成數據的時候選擇左岸出發的碼頭位置。
4)因為訓練模型的時候要求我們一步步打卡來時經過的浮標,在生成數據的時候,基本上也能遵守這些潛在的浮標位置,一步步打卡到達右岸碼頭。
5)如果覺得開到河右岸一步步這樣打卡浮標有點繁瑣,影響船的行進速度,可以選擇一次打卡跨好幾個浮標,就能加速船行速度,這就對應diffusion的加速采樣過程。
5. AR的過河方式
1)可以類比Diffusion模型,將AR生成過程 X0,X0:1,…,X0:t,X0:t+1,…,X0:T 看成中間的一個個浮標。從河右岸到達河左岸的過程就好比自回歸分解,將 X0:T 一步步拆解成中間的浮標,這個過程也是不用學習的。
2)河左岸的碼頭 X0 可以看成自回歸生成的第一個START token。AR模型河左岸碼頭的位置是確定的,就是START token對應的embedding。
3)在訓練過程中,自回歸模型也一個個對齊了浮標,所以在生成的時候也能一步步打卡浮標去到河右岸。
4)和Diffusion不同的是,自回歸模型要想加速,跳過某些浮標,就沒有那么容易了,除非重新訓練一個semi-autoregressive的模型,一次生成多個token跨過多個浮標。
5)和Diffusion類似的是,在訓練過程中都使用了teacher-forcing的方式,以當前步的ground-truth浮標位置為出發點,預測下一個浮標位置,這也降低了學習的難度,所以通常來講,自回歸模型和Diffusion模型訓練起來都比較容易。
VAEGANFLOWDDPMSDE技術區別
其它多模態
語音視頻
3d模型
點云圖(slam)
大模型訓練開源語料
Reference
[1] Radford, A., Narasimhan, K., Salimans, T. and Sutskever, I., 2018. Improving language understanding by generative pre-training.
[2] Radford, A., Wu, J., Child, R., Luan, D., Amodei, D. and Sutskever, I., 2019. Language models are unsupervised multitask learners. OpenAI blog, 1(8), p.9.
[3] Brown, Tom B., Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan et al. “Language models are few-shot learners.” arXiv preprint arXiv:2005.14165 (2020).
[4] Rei, M., 2017. Semi-supervised multitask learning for sequence labeling. arXiv preprint arXiv:1704.07156.
[5] Waswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A.N., Kaiser, L. and Polosukhin, I., 2017. Attention is all you need. In NIPS.
[6] medium.com/walmartgloba
[7] Zhu, Yukun, et al. “Aligning books and movies: Towards story-like visual explanations by watching movies and reading books.” Proceedings of the IEEE international conference on computer vision. 2015.
[8] McCann, Bryan, et al. “The natural language decathlon: Multitask learning as question answering.” arXiv preprint arXiv:1806.08730 (2018).
[9] Rajeswaran, Aravind, et al. “Meta-learning with implicit gradients.” arXiv preprint arXiv:1909.04630 (2019).
[10] Finn, Chelsea, Pieter Abbeel, and Sergey Levine. “Model-agnostic meta-learning for fast adaptation of deep networks.” International Conference on Machine Learning. PMLR, 2017.
[11] Child, Rewon, et al. “Generating long sequences with sparse transformers.” arXiv preprint arXiv:1904.10509 (2019).
[12]https://amatriain.net/blog/transformer-models-an-introduction-and-catalog-2d1e9039f376/
[13]https://www.zhihu.com/question/498275802
forcing的方式,以當前步的ground-truth浮標位置為出發點,預測下一個浮標位置,這也降低了學習的難度,所以通常來講,自回歸模型和Diffusion模型訓練起來都比較容易。
VAEGANFLOWDDPMSDE技術區別
其它多模態
語音視頻
3d模型
點云圖(slam)
大模型訓練開源語料
Reference
[1] Radford, A., Narasimhan, K., Salimans, T. and Sutskever, I., 2018. Improving language understanding by generative pre-training.
[2] Radford, A., Wu, J., Child, R., Luan, D., Amodei, D. and Sutskever, I., 2019. Language models are unsupervised multitask learners. OpenAI blog, 1(8), p.9.
[3] Brown, Tom B., Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan et al. “Language models are few-shot learners.” arXiv preprint arXiv:2005.14165 (2020).
[4] Rei, M., 2017. Semi-supervised multitask learning for sequence labeling. arXiv preprint arXiv:1704.07156.
[5] Waswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A.N., Kaiser, L. and Polosukhin, I., 2017. Attention is all you need. In NIPS.
[6] medium.com/walmartgloba
[7] Zhu, Yukun, et al. “Aligning books and movies: Towards story-like visual explanations by watching movies and reading books.” Proceedings of the IEEE international conference on computer vision. 2015.
[8] McCann, Bryan, et al. “The natural language decathlon: Multitask learning as question answering.” arXiv preprint arXiv:1806.08730 (2018).
[9] Rajeswaran, Aravind, et al. “Meta-learning with implicit gradients.” arXiv preprint arXiv:1909.04630 (2019).
[10] Finn, Chelsea, Pieter Abbeel, and Sergey Levine. “Model-agnostic meta-learning for fast adaptation of deep networks.” International Conference on Machine Learning. PMLR, 2017.
[11] Child, Rewon, et al. “Generating long sequences with sparse transformers.” arXiv preprint arXiv:1904.10509 (2019).
[12]https://amatriain.net/blog/transformer-models-an-introduction-and-catalog-2d1e9039f376/