深入理解Transformer技術(shù)原理
谷歌在2007年發(fā)布Transformer架構(gòu)的論文時(shí),論文的標(biāo)題是:Attention Is All You Need。重點(diǎn)說(shuō)明了這個(gè)架構(gòu)是基于注意力機(jī)制的。
一、什么是注意力機(jī)制
在深入了解Transformer的架構(gòu)原理之前,我們首先要了解下,什么是注意力機(jī)制。
人類的大腦對(duì)于信息的獲取也存在注意力機(jī)制,下面我舉幾個(gè)簡(jiǎn)單的例子:
從上面的圖片中,我們可能更容易關(guān)注,顏色更深的字、字號(hào)更大的字,另外像“震驚”這種吸引人眼球的文案也非常容易吸引人的關(guān)注。
我們知道在海量的互聯(lián)網(wǎng)信息中,往往那些起著“標(biāo)題黨”的文章更能吸引人的注意,從而達(dá)到吸引流量的目的,這是一種簡(jiǎn)單粗暴的方式。另外在大量的同質(zhì)化圖片中,如果有一張圖片它的色彩、構(gòu)圖等都別出一格,那你也會(huì)一眼就能注意到它,這也是一種簡(jiǎn)單的注意力機(jī)制。
假設(shè)有以下這兩段文字,需要翻譯成英文:
1、我在得物上買(mǎi)了最新款的蘋(píng)果,體驗(yàn)非常好。
2、我在得物上買(mǎi)了阿克蘇的蘋(píng)果,口感非常好。
我們?nèi)祟惸芎芸熳⒁獾降谝欢挝淖种械奶O(píng)果是指蘋(píng)果手機(jī),那么模型在翻譯時(shí)就需要把他翻譯成iPhone,而第二段文字中的蘋(píng)果就是指的蘋(píng)果這種水果,模型翻譯時(shí)就需要將他翻譯成apple。
人類的大腦為什么能分辨出這兩個(gè)蘋(píng)果是指代的不同的意思呢?原因就是人類的大腦能從上下文中獲取到關(guān)鍵信息,從而幫助我們理解每種蘋(píng)果是什么意思。
其實(shí)說(shuō)到這里,我們就已經(jīng)揭開(kāi)了Transformer架構(gòu)的核心,即注意力機(jī)制的原理:從文本的上下文中找到需要注意的關(guān)鍵信息,幫助模型理解每個(gè)字的正確含義。但是實(shí)際的實(shí)現(xiàn)方式又是非常復(fù)雜的。
接下來(lái)讓我們一起深入理解下Transformer的架構(gòu)原理。
二、Transformer架構(gòu)設(shè)計(jì)
Transformer的架構(gòu)設(shè)計(jì)如下圖所示:
圖片
圖片
Transformer架構(gòu)中有兩個(gè)核心的組件Encoder和Decoder,左邊的這張圖是Transformer架構(gòu)的一個(gè)簡(jiǎn)單表示形式,右邊的這張圖是Transformer架構(gòu)的一個(gè)完整表示形式,其中有一個(gè)重要的Multi-Head Attention組件,稱為注意力層。
Transformer架構(gòu)中的兩個(gè)核心的組件Encoder和Decoder,每個(gè)組件都可以單獨(dú)使用,具體取決于任務(wù)的類型:
Encoder-only models: 適用于需要理解輸入的任務(wù),如句子分類和命名實(shí)體識(shí)別。
Decoder-only models: 適用于生成任務(wù),如文本生成。
Encoder-decoder models 或者 sequence-to-sequence models: 適用于需要根據(jù)輸入進(jìn)行生成的任務(wù),如翻譯或摘要。
三、理解Transformer中的Token
因?yàn)槟P褪菬o(wú)法直接處理文本的,只能處理數(shù)字,就跟ASCII碼表、Unicode碼表一樣,計(jì)算機(jī)在處理文字時(shí)也是先將文字轉(zhuǎn)成對(duì)應(yīng)的字碼,然后為每個(gè)字碼編寫(xiě)一個(gè)對(duì)應(yīng)的數(shù)字記錄在表中,最后再處理。
圖片
將文本拆分成token
所以模型在處理文本時(shí),第一步就是先將文本轉(zhuǎn)換成對(duì)應(yīng)的字碼,也就是大模型中的token,但是怎么將文本轉(zhuǎn)換成對(duì)應(yīng)的token卻是一個(gè)復(fù)雜的問(wèn)題,在Transformers(HuggingFace提供的一個(gè)對(duì)Transformer架構(gòu)的具體實(shí)現(xiàn)的組件庫(kù))中提供了專門(mén)的Tokenizer分詞器來(lái)實(shí)現(xiàn)這個(gè)任務(wù),一般來(lái)說(shuō)有以下幾種方式:
基于單詞的分詞器
第一種標(biāo)記器是基于單詞的(word-based)。它通常很容易設(shè)置和使用,只需幾條規(guī)則,并且通常會(huì)產(chǎn)生不錯(cuò)的結(jié)果。例如,在下圖中,目標(biāo)是將原始文本拆分為單詞,并為每個(gè)單詞找到一個(gè)映射的數(shù)字表達(dá):
將文本拆分成單詞,也有很多不同的方式,比如通過(guò)空格來(lái)拆分、通過(guò)標(biāo)點(diǎn)符號(hào)來(lái)拆分。
圖片
如果我們想使用基于單詞的標(biāo)記器(tokenizer)完全覆蓋一種語(yǔ)言,我們需要為語(yǔ)言中的每個(gè)單詞都創(chuàng)建一個(gè)數(shù)字標(biāo)記,這將生成大量的標(biāo)記。除此之外,還可能存在一些無(wú)法覆蓋的單詞,因?yàn)閱卧~可能存在很多的變種情況,比如:dogs是dog的變種,running是run的變種。如果我們的標(biāo)識(shí)符中沒(méi)有覆蓋所有的單詞,那么當(dāng)出現(xiàn)一個(gè)未覆蓋的單詞時(shí),標(biāo)記器將無(wú)法準(zhǔn)確知道該單詞的數(shù)字標(biāo)記是多少,進(jìn)而只能標(biāo)記為未知:UNK。如果在文本轉(zhuǎn)換的過(guò)程中有大量的文本被標(biāo)記為UNK,那么也將影響后續(xù)模型推理。
基于字符的標(biāo)記器
為了減少未知標(biāo)記數(shù)量的一種方法是使用更深一層的標(biāo)記器(tokenizer),即基于字符的(character-based)標(biāo)記器(tokenizer)。
基于字符的標(biāo)記器(tokenizer)將文本拆分為字符,而不是單詞。這有兩個(gè)主要好處:
- 詞匯量要小得多。
- 未知的標(biāo)記(token)要少得多,因?yàn)槊總€(gè)單詞都可以從字符構(gòu)建。
但是這里也出現(xiàn)了一些關(guān)于空格和標(biāo)點(diǎn)符號(hào)的問(wèn)題:
圖片
這種方法也不是完美的。由于現(xiàn)在表示是基于字符而不是單詞,因此人們可能會(huì)爭(zhēng)辯說(shuō),從直覺(jué)上講,它的意義不大:每個(gè)字符本身并沒(méi)有多大意義,而單詞就是這種情況。然而,這又因語(yǔ)言而異;例如,在中文中,每個(gè)字符比拉丁語(yǔ)言中的字符包含更多的信息。
另一件要考慮的事情是,我們的模型最終會(huì)處理大量的詞符(token):雖然使用基于單詞的標(biāo)記器(tokenizer),單詞只會(huì)是單個(gè)標(biāo)記,但當(dāng)轉(zhuǎn)換為字符時(shí),它很容易變成 10 個(gè)或更多的詞符(token)。
為了兩全其美,我們可以使用結(jié)合這兩種方法的第三種技術(shù):子詞標(biāo)記化(subword tokenization)。
基于子詞的標(biāo)記器
子詞分詞算法依賴于這樣一個(gè)原則,即不應(yīng)將常用詞拆分為更小的子詞,而應(yīng)將稀有詞分解為有意義的子詞。
例如,“annoyingly”可能被認(rèn)為是一個(gè)罕見(jiàn)的詞,可以分解為“annoying”和“l(fā)y”。這兩者都可能作為獨(dú)立的子詞出現(xiàn)得更頻繁,同時(shí)“annoyingly”的含義由“annoying”和“l(fā)y”的復(fù)合含義保持。
下面這張圖,展示了基于子詞標(biāo)記化算法,如何標(biāo)記序列“Let’s do tokenization!”:
圖片
這些子詞最終提供了很多語(yǔ)義含義:例如,在上面的示例中,“tokenization”被拆分為“token”和“ization”,這兩個(gè)具有語(yǔ)義意義同時(shí)節(jié)省空間的詞符(token)(只需要兩個(gè)標(biāo)記(token)代表一個(gè)長(zhǎng)詞)。這使我們能夠?qū)^小的詞匯表進(jìn)行相對(duì)較好的覆蓋,并且?guī)缀鯖](méi)有未知的標(biāo)記。
向量、矩陣、張量
了解完token之后,我們還要了解下向量、矩陣和張量的概念,因?yàn)樗麄兪谴竽P陀?jì)算中基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。
向量(Vector)
向量是一個(gè)有序的數(shù)字列表,通常用來(lái)表示空間中的點(diǎn)或者方向。在數(shù)學(xué)中,向量可以表示為一個(gè)列向量或行向量,具體取決于上下文。例如,一個(gè)三維空間中的點(diǎn)可以用一個(gè)三維列向量表示,如 v=[x,y,z]T,其中 x,y,z 是實(shí)數(shù)。
圖片
矩陣(Matrix)
矩陣是一個(gè)二維數(shù)組,由行和列組成,可以被視為向量的一個(gè)特例。矩陣在數(shù)學(xué)中用于表示線性變換、系統(tǒng)方程的系數(shù)等。矩陣的維度通常表示為 m×n,其中 m 是行數(shù),n 是列數(shù)。例如,一個(gè) 4×3 的矩陣有四行三列。
圖片
張量(Tensor)
張量是一個(gè)多維數(shù)組,可以看作是向量和矩陣的更底層的表示,向量和矩陣是張量的特例。例如向量是一維的張量,矩陣是二維的張量。張量可以有任意數(shù)量的維度,而不僅僅是一維(向量)或二維(矩陣)。張量在物理學(xué)中用來(lái)表示多維空間中的物理量,如應(yīng)力、應(yīng)變等。在深度學(xué)習(xí)中,張量用于表示數(shù)據(jù)和模型參數(shù)的多維結(jié)構(gòu)。
圖片
將token轉(zhuǎn)換成向量
在獲取到token之后,再將每個(gè)token映射為一個(gè)數(shù)字,當(dāng)然了,Transformer能夠處理的數(shù)據(jù),并不是簡(jiǎn)單的1/2/3這樣的數(shù)字,而是一種向量數(shù)據(jù),如下圖所示:
圖片
將向量轉(zhuǎn)換成嵌入
得到向量之后,再將向量轉(zhuǎn)換成詞嵌入,也就是我們所熟知的embeddings。
在Transformer模型中,編碼器接收的詞嵌入(embeddings)可以被視為矩陣。這些詞嵌入是將輸入序列中的每個(gè)token映射到一個(gè)固定維度的向量空間中的結(jié)果。每個(gè)詞嵌入都是一個(gè)向量,而這些向量按順序排列形成一個(gè)矩陣。
具體來(lái)說(shuō),如果你有一個(gè)句子或序列,其中包含了N個(gè)token,每個(gè)token都被映射到一個(gè)d維的向量空間中,那么你將得到一個(gè)N×d的矩陣,其中N是序列的長(zhǎng)度,d是嵌入向量的維度。這個(gè)矩陣就是詞嵌入矩陣,它是一個(gè)二維張量,因?yàn)樗哂袃蓚€(gè)維度:序列長(zhǎng)度(時(shí)間步長(zhǎng))和嵌入維度。
在Transformer模型的編碼器中,這個(gè)嵌入矩陣首先會(huì)通過(guò)一個(gè)線性層(可選)進(jìn)行處理,然后添加位置編碼(positional encoding),最后輸入到自注意力(self-attention)和前饋網(wǎng)絡(luò)(feed-forward network)等組件中進(jìn)行進(jìn)一步的處理,具體細(xì)節(jié)我接下來(lái)會(huì)進(jìn)行詳細(xì)解釋。
總結(jié)來(lái)說(shuō),編碼器接收的詞嵌入是一個(gè)矩陣,這個(gè)矩陣可以被視為一個(gè)二維張量,其中包含了序列中每個(gè)詞的d維向量表示。
圖片
四、理解Transformer的編解碼器
下面讓我們以文本翻譯來(lái)深入理解Transformer中的Encoder和Decoder是怎樣工作的,假設(shè)我們有以下這個(gè)翻譯任務(wù),輸入是一段法文,輸出是英文。
整個(gè)流程是Transformer將輸入的input,經(jīng)過(guò)Encoders處理后,將結(jié)果投遞到Decoders中處理,最后輸出翻譯后的結(jié)果。
圖片
但是實(shí)際在Transformer的內(nèi)部,是由多個(gè)獨(dú)立的Encoder和Decoder組成的,這里我們使用6個(gè)做驗(yàn)證,當(dāng)然我們也可以使用其他數(shù)量的Encoder和Decoder,筆者懷疑6個(gè)是經(jīng)過(guò)驗(yàn)證后相對(duì)折中的一個(gè)值。
圖片
這6個(gè)Encoder和Decoder在結(jié)構(gòu)上都是相同的,但是Encoder和Decoder的內(nèi)部還有更細(xì)分的組件:
每一層的Encoder由2個(gè)子組件組成:自注意力層和前饋網(wǎng)絡(luò)層,其中文本的輸入會(huì)先流入自注意力層,正是由于自注意力層的存在,幫助Encoder在對(duì)特定文本進(jìn)行遍歷時(shí),能夠讓Encoder觀察到文本中的其他單詞。然后自注意力層的結(jié)果被輸出到前饋網(wǎng)絡(luò)層。
圖片
每一層的Decoder由3個(gè)子組件組成:除了自注意力層、前饋網(wǎng)絡(luò)層,在兩者之間還有一個(gè)編解碼注意力層,這個(gè)組件主要是幫助Decoder專注于輸入句子的相關(guān)部分。
圖片
五、理解Token在編碼器中的流轉(zhuǎn)
現(xiàn)在我們已經(jīng)知道了Transformer模型中的核心組件Encoder和Decoder,接下來(lái)我們來(lái)看Token在Transformer中是怎么流轉(zhuǎn)的,換句話說(shuō)Encoder和Decoder是怎么處理Token的。
拿最開(kāi)始的法文翻譯的例子,模型將文本轉(zhuǎn)換token后,緊接著就是將每個(gè)token轉(zhuǎn)換成向量表達(dá),在下圖中,我們用x1、x2、x3這樣的box來(lái)表示每個(gè)token的向量:
圖片
得到每個(gè)token的向量之后,從最底層的Encoder開(kāi)始,每個(gè)token會(huì)沿著自己的路徑從下往上流轉(zhuǎn),經(jīng)過(guò)每一個(gè)Encoder,對(duì)每個(gè)Encoder來(lái)說(shuō),共同點(diǎn)是他們接收的向量的維度都是相同的,為了保證這一點(diǎn),所有的token都需要被embedding成相同大小的向量。
對(duì)Token進(jìn)行位置編碼
在流經(jīng)每個(gè)Encoder時(shí),向量都會(huì)從自注意力層流向前饋層,如下圖所示:
圖片
這里需要注意的是,不同位置的向量在進(jìn)入自注意力層的時(shí)候,相互之間是有依賴關(guān)系的,這就是注意力層需要關(guān)注的上下文的信息。
而當(dāng)自注意力層處理后的向量進(jìn)入前饋層后,前饋層是可以并行計(jì)算以提升性能的,因?yàn)樵谇梆亴又邢蛄恐g不存在依賴關(guān)系。每個(gè)向量在經(jīng)過(guò)Encoder處理后,得到的仍然是一個(gè)相同大小的向量,然后再提交給下一個(gè)Encoder進(jìn)行處理。
為什么說(shuō)不同位置的向量相互之間是有依賴關(guān)系的呢?我們可以想象一下,如果不關(guān)注一整個(gè)句子中token的位置信息,那么翻譯出來(lái)的結(jié)果是不準(zhǔn)確的,比如:
- Sam is always looking for trouble
- Trouble is always looking for Sam
為了讓模型知道每個(gè)token的位置信息,傳統(tǒng)的RNN網(wǎng)絡(luò)的做法是,順序處理每個(gè)token,這樣在處理當(dāng)前token時(shí),可以往前查看已經(jīng)處理過(guò)的token的信息,但是缺點(diǎn)是所有的token節(jié)點(diǎn)都共用一套相同的參數(shù),即下圖中的:
U:輸入?yún)?shù)
W:隱藏參數(shù)
V:輸出參數(shù)
由于RNN的窗口較小,這種方案帶來(lái)的問(wèn)題是,當(dāng)token數(shù)變大時(shí),模型無(wú)法參考更早之前已經(jīng)參考過(guò)的token,這樣就會(huì)造成上下文記憶丟失。
圖片
那么Transformer是怎么對(duì)token進(jìn)行位置編碼的呢?
首先我們知道每個(gè)token會(huì)被轉(zhuǎn)換成512維(或更高的維度)的向量,比如:[0.12142,0.34181,....,-0.21231] 可以將這個(gè)向量分為兩個(gè)部分,奇數(shù)和偶數(shù)部分。
奇數(shù)部分使用cos函數(shù),加上當(dāng)前token的位置信息pos,通過(guò)cos編碼得到一個(gè)奇數(shù)編碼值;
偶數(shù)部分使用sin函數(shù),加上當(dāng)前token的位置信息pos,通過(guò)sin編碼得到一個(gè)偶數(shù)編碼值;
最后拿token的embeddings和pos的embeddings相加,得到位置編碼后的positional input embeddings。
圖片
圖片
自注意力機(jī)制
有了位置編碼的信息后,模型將接收經(jīng)過(guò)位置編碼的embeddings輸入,為了方便描述,我們把token換成更簡(jiǎn)單的文本,如下圖所示,Encoder在接收到兩個(gè)向量之后,通過(guò)自注意力層,將原始向量轉(zhuǎn)換成攜帶了自注意力值的向量,也就是圖中的z1和z2。
圖片
計(jì)算注意力值
那z1和z2這兩個(gè)向量是怎么得到的呢?原論文中給出了計(jì)算公式:
圖片
這個(gè)公式是用來(lái)計(jì)算注意力值的,借助了Q、K、V這三個(gè)矩陣:
首先通過(guò)Q矩陣和轉(zhuǎn)置后的K矩陣轉(zhuǎn)置相乘,得到結(jié)果后再除以dk的開(kāi)平方,再通過(guò)softmax函數(shù)得到一個(gè)歸一化的結(jié)果,最后將歸一化的結(jié)果和矩陣V相乘就得到了表示注意力值的矩陣。
圖片
這里的Q、K、V三個(gè)矩陣(查詢矩陣、鍵矩陣、值矩陣)是通過(guò)原始token的embedding矩陣計(jì)算得到的,具體的方法是,先訓(xùn)練出三個(gè)矩陣:Wq,Wk,Wv, 然后使用embedding處理后的X矩陣和這三個(gè)矩陣相乘得到:
Q=Wq * X
K=Wk * X
V=Wv * X
圖片
需要注意的是我們embedding輸入原本是向量,并不是矩陣,這里是將所有的向量打包之后,形成了一個(gè)矩陣,方便矩陣之間的計(jì)算。
下面我們一步步了解下注意力值是怎么計(jì)算的,使用原始的embedding,而不是打包后的矩陣,首先模型將會(huì)為句子中的每個(gè)token都計(jì)算出一個(gè)score分?jǐn)?shù),這個(gè)分?jǐn)?shù)表示了該token對(duì)句子中其他token的關(guān)注程度,分?jǐn)?shù)越高關(guān)注度越高。
圖片
但是需要注意的是這里計(jì)算得到的中間向量q、k、v的維度是64維,小于Encoder接收的輸入向量的維度,這是一個(gè)經(jīng)過(guò)計(jì)算后得到的相對(duì)穩(wěn)定的數(shù)值。
如下圖所示,當(dāng)我們?cè)谟?jì)算Tinking這個(gè)token的注意力值時(shí),會(huì)依次計(jì)算出Thinking對(duì)其他token(在這里也就是Thinking和Machines)的注意力值,計(jì)算token1對(duì)其他各個(gè)token的score的方式是:q1 與 k1 做點(diǎn)積,q1 與 k2 做點(diǎn)積。
圖片
得到每個(gè)score后,再把score除以K向量維度的平方根也就是√64=8,然后將結(jié)果通過(guò)Softmax進(jìn)行歸一化,得到一個(gè)0~1之間的概率值,所有的歸一化的加和值等于1。
圖片
最后將Softmax的值,與V向量相乘,得到自注意力層的輸出結(jié)果向量:z1和z2,需要注意的是相乘的過(guò)程中會(huì)將不相關(guān)的token的關(guān)注度降低。
圖片
到這里其實(shí)已經(jīng)把Encoder是怎么計(jì)算每個(gè)token對(duì)句子中其他token的注意力值的方法解釋清楚了,下面我們用一張圖從更高的層面來(lái)觀察這個(gè)過(guò)程,假設(shè)我們想要翻譯下面這個(gè)句子:
The animal didn't cross the street because it was too tired.
句子中的it是表示什么呢,是animal還是street?模型就是通過(guò)自注意力值來(lái)確定的,當(dāng)對(duì)it進(jìn)行編碼時(shí),Encoder會(huì)對(duì)句子中的每個(gè)token都計(jì)算一遍注意力值,模型會(huì)將it更關(guān)注的“The animal”編碼到it中。這樣模型在后續(xù)的處理過(guò)程中就能知道it指代的是“The animal”。
圖片
多頭注意力機(jī)制
論文中通過(guò)引入多個(gè)Encoder形成了一種“多頭注意力”的機(jī)制,對(duì)自注意力層進(jìn)行了能力的提升,主要包括:
- 多頭注意力擴(kuò)展了模型關(guān)注不同位置的能力
- 多頭注意力為自注意力層提供了多個(gè)子空間
Transformer模型使用了8個(gè)注意力頭,所以在計(jì)算每個(gè)Encoder的輸出時(shí),我們會(huì)得到8個(gè)z向量。
圖片
圖片
但是前饋層只能接收1個(gè)z向量,所以我們還需要將這8個(gè)z向量做壓縮得到1個(gè)向量,具體的做法是將這8個(gè)z向量鏈接起來(lái),然后乘以一個(gè)附加的權(quán)重矩陣Wo,最后得到z向量,如下圖所示:
圖片
最后我們用一張完整的大圖來(lái)描述下在多個(gè)Encoder下,注意力值的計(jì)算過(guò)程,也就是多頭注意力機(jī)制:
圖片
下面我們可以看下,在多頭注意力機(jī)制下,在編碼it這個(gè)token時(shí),模型在注意哪些其他的token:
圖片
可以看到其中一個(gè)頭(橙色)更關(guān)注“The Animal”,因?yàn)檫@兩個(gè)token對(duì)應(yīng)的橙色更深,另外一個(gè)頭(綠色)則更關(guān)注“tired”,因?yàn)檫@兩個(gè)token對(duì)應(yīng)的綠色更深。
殘差網(wǎng)絡(luò)
首先我們了解下什么是殘差網(wǎng)絡(luò),殘差網(wǎng)絡(luò)(Residual Network,簡(jiǎn)稱ResNet)是一種深度卷積神經(jīng)網(wǎng)絡(luò)(CNN)架構(gòu),由Microsoft Research Asia的Kaiming He等人在2015年提出。ResNet的核心思想是通過(guò)引入“殘差學(xué)習(xí)”(residual learning)來(lái)解決深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的退化問(wèn)題(degradation problem)。
在傳統(tǒng)的深度神經(jīng)網(wǎng)絡(luò)中,隨著網(wǎng)絡(luò)層數(shù)的增加,理論上網(wǎng)絡(luò)的表示能力應(yīng)該更強(qiáng),但實(shí)際上,過(guò)深的網(wǎng)絡(luò)往往難以訓(xùn)練,性能反而不如層數(shù)較少的網(wǎng)絡(luò)。這種現(xiàn)象被稱為“退化問(wèn)題”,即隨著網(wǎng)絡(luò)深度的增加,網(wǎng)絡(luò)的準(zhǔn)確率不再提升,甚至下降。
ResNet通過(guò)引入“跳躍連接”(skip connections)或“捷徑連接”(shortcut connections)來(lái)解決這個(gè)問(wèn)題。在ResNet中,輸入不僅傳遞給當(dāng)前層,還直接傳遞到后面的層,跳過(guò)一些中間層。這樣,后面的層可以直接學(xué)習(xí)到輸入與輸出之間的殘差(即差異),而不是學(xué)習(xí)到未處理的輸入。這種設(shè)計(jì)允許網(wǎng)絡(luò)學(xué)習(xí)到恒等映射(identity mapping),即輸出與輸入相同,從而使得網(wǎng)絡(luò)可以通過(guò)更簡(jiǎn)單的路徑來(lái)學(xué)習(xí)到正確的映射關(guān)系。
在Transformer模型中,殘差網(wǎng)絡(luò)的使用主要是為了解決自注意力機(jī)制(self-attention)帶來(lái)的問(wèn)題。Transformer模型完全基于注意力機(jī)制,沒(méi)有卷積層,但其結(jié)構(gòu)本質(zhì)上也是深度網(wǎng)絡(luò)。在Transformer中,每個(gè)編碼器(encoder)和解碼器(decoder)層都包含自注意力和前饋網(wǎng)絡(luò),這些層的參數(shù)量非常大,網(wǎng)絡(luò)深度也很容易變得很深。
使用殘差連接可以幫助Transformer模型更有效地訓(xùn)練深層網(wǎng)絡(luò)。在Transformer的自注意力層中,輸入通過(guò)自注意力和前饋網(wǎng)絡(luò)后,與原始輸入相加,形成殘差連接。這種設(shè)計(jì)使得網(wǎng)絡(luò)即使在增加更多層數(shù)時(shí),也能保持較好的性能,避免了退化問(wèn)題。
總結(jié)來(lái)說(shuō),殘差網(wǎng)絡(luò)在Transformer模型中的應(yīng)用解決了以下幾個(gè)問(wèn)題:
- 緩解退化問(wèn)題:通過(guò)殘差學(xué)習(xí),使得網(wǎng)絡(luò)即使在增加層數(shù)時(shí)也能保持或提升性能。
- 加速收斂:殘差連接提供了梯度的直接路徑,有助于梯度在深層網(wǎng)絡(luò)中的傳播,加速訓(xùn)練過(guò)程。
- 提高表示能力:允許網(wǎng)絡(luò)學(xué)習(xí)更復(fù)雜的函數(shù),同時(shí)保持對(duì)簡(jiǎn)單函數(shù)的學(xué)習(xí)能力。
Transformer模型的成功部分歸功于殘差連接的設(shè)計(jì),這使得它能夠構(gòu)建更深、更強(qiáng)大的模型,從而在自然語(yǔ)言處理(NLP)和計(jì)算機(jī)視覺(jué)等領(lǐng)域取得了顯著的成果。
可以使用下面這張圖來(lái)解釋殘差網(wǎng)絡(luò),原始向量x在經(jīng)過(guò)自注意力層之后得到z向量,為了防止網(wǎng)絡(luò)過(guò)深帶來(lái)的退化問(wèn)題,Transformer模型使用了殘差網(wǎng)絡(luò),具體做法是使用計(jì)算得到的z矩陣,在和原始輸入的x矩陣做殘差鏈接,即圖中的X+Z,然后使用LayerNorm函數(shù)進(jìn)行層歸一化,計(jì)算得到新的z向量,然后輸入到前饋層。
圖片
將 Add & Normalize 簡(jiǎn)化之后表示為如下:
圖片
前饋網(wǎng)絡(luò)
歸一化后的殘差輸出,被送入點(diǎn)對(duì)點(diǎn)前饋網(wǎng)絡(luò)進(jìn)行進(jìn)一步處理,點(diǎn)對(duì)點(diǎn)前饋網(wǎng)絡(luò)是幾個(gè)線性層,中間有ReLU激活函數(shù),將點(diǎn)對(duì)點(diǎn)輸出的結(jié)果與前饋網(wǎng)絡(luò)的輸入進(jìn)行相加做殘差鏈接,然后再做進(jìn)一步的歸一化。
點(diǎn)對(duì)點(diǎn)前饋網(wǎng)絡(luò)主要用于進(jìn)一步處理注意力的輸出,讓結(jié)果具有更豐富的表達(dá)。
圖片
到這里編碼器就已經(jīng)介紹完了,編碼器輸出的結(jié)果中攜帶了每個(gè)token的相關(guān)注意力信息,將用以幫助解碼器在解碼過(guò)程中關(guān)注輸入中的特定的token信息。
六、理解Token在解碼器中的流轉(zhuǎn)
每個(gè)解碼器擁有與編碼器相似的結(jié)構(gòu)但也有不同的地方,它有兩個(gè)多頭注意力層,一個(gè)點(diǎn)對(duì)點(diǎn)前饋網(wǎng)絡(luò)層,并且在每個(gè)子層之后都有殘差鏈接和層歸一化。
圖片
解碼器是自回歸的,它將前一個(gè)Decoder輸出的結(jié)果和來(lái)自編碼器輸出的注意力信息當(dāng)做解碼器的輸入。
圖片
這里我們需要了解清楚,解碼器的先前的輸出結(jié)果是怎么得到的,即解碼器的第一個(gè)輸出結(jié)果從哪得到的。
在Transformer模型的訓(xùn)練過(guò)程中,解碼器的第一個(gè)輸出序列通常是根據(jù)特定的起始標(biāo)記(start token)或者一個(gè)預(yù)先定義的初始狀態(tài)得到的。這個(gè)起始標(biāo)記是一個(gè)特殊的符號(hào),它標(biāo)志著輸出序列的開(kāi)始。以下是解碼器如何獲得第一個(gè)輸出序列的詳細(xì)過(guò)程:
1. 起始標(biāo)記:
在訓(xùn)練階段,解碼器的輸入序列通常以一個(gè)起始標(biāo)記(例如<START>)開(kāi)始。這個(gè)標(biāo)記是一個(gè)預(yù)定義的詞匯表中的詞,它告訴解碼器輸出序列的生成即將開(kāi)始。
2. 初始化狀態(tài):
解碼器在開(kāi)始生成輸出之前,會(huì)接收到編碼器的輸出,即編碼器的上下文向量。這些上下文向量包含了輸入序列(如源語(yǔ)言文本)的信息。在某些情況下,解碼器的初始狀態(tài)也可以通過(guò)一個(gè)額外的向量(如位置編碼)來(lái)初始化,以提供序列中每個(gè)位置的信息。
3. 自注意力機(jī)制:
在第一個(gè)時(shí)間步,解碼器使用自注意力機(jī)制處理起始標(biāo)記。由于此時(shí)沒(méi)有之前的輸出,自注意力機(jī)制會(huì)關(guān)注起始標(biāo)記本身,以及可能的位置編碼。
4. 編碼器-解碼器注意力:
解碼器接著使用編碼器-解碼器注意力機(jī)制來(lái)關(guān)注編碼器的輸出。這允許解碼器在生成第一個(gè)輸出時(shí)就利用到輸入序列的信息。
5. 輸出層:
解碼器的輸出層將上述步驟得到的向量轉(zhuǎn)換為概率分布,這個(gè)分布表示了詞匯表中每個(gè)詞作為第一個(gè)輸出的概率。
6. 選擇第一個(gè)輸出:
在訓(xùn)練階段,解碼器可能會(huì)使用強(qiáng)制策略,這意味著解碼器的第一個(gè)輸出會(huì)直接使用目標(biāo)序列中的第一個(gè)詞。在推理階段,解碼器會(huì)根據(jù)概率分布選擇概率最高的詞作為第一個(gè)輸出。
7. 迭代生成:
一旦獲得了第一個(gè)輸出,解碼器就會(huì)將其作為下一個(gè)時(shí)間步的輸入,并重復(fù)上述過(guò)程來(lái)生成后續(xù)的輸出序列。
在實(shí)際應(yīng)用中,解碼器的第一個(gè)輸出序列的生成方式可能會(huì)根據(jù)具體的任務(wù)和模型配置有所不同。例如,在某些情況下,解碼器可能會(huì)接收到一個(gè)完整的前綴序列,而不是單一的起始標(biāo)記,這在文本摘要任務(wù)中較為常見(jiàn)。在這種情況下,解碼器會(huì)基于這個(gè)前綴序列來(lái)生成剩余的輸出序列。
Masked多頭注意力機(jī)制
需要注意的是解碼器中的第一層是一個(gè)特殊的多頭注意力層,是一個(gè)執(zhí)行了mask的注意力層,因?yàn)榻獯a器是自回歸的,并且依次生成結(jié)果token,我們需要防止它在處理某個(gè)token時(shí),對(duì)未來(lái)的token進(jìn)行處理,原因是模型在訓(xùn)練的時(shí)候,是不知道未來(lái)輸出的token是什么的,為了保證訓(xùn)練過(guò)程和解碼的過(guò)程的一致性,我們需要讓解碼器在計(jì)算某個(gè)token的注意力值的時(shí)候,只關(guān)注這個(gè)句子中已經(jīng)出現(xiàn)過(guò)的token,而屏蔽掉句子中當(dāng)前token之后的其他token的信息。
可以通過(guò)以下這張圖來(lái)描述Mask的過(guò)程,當(dāng)解碼器在處理it時(shí),應(yīng)該把it之后的所有token屏蔽掉。
圖片
計(jì)算注意力值
在解碼器中計(jì)算注意力值時(shí),是用Encoder最后的輸出,和每一個(gè)Decoder進(jìn)行交互,這就需要Decoder中的第二層Encoder-Decoder Attention。每個(gè)Decoder計(jì)算出結(jié)果之后,再作為輸入傳遞給下一個(gè)Decoder。
圖片
線性分類器&Softmax
當(dāng)最后一個(gè)Decoder計(jì)算完畢后,解碼器得到了一個(gè)輸出結(jié)果的向量數(shù)據(jù)。我們?nèi)绾伟阉兂梢粋€(gè)詞呢?這就是最后一個(gè) Linear 層的工作,后面是 Softmax 層。
線性層是一個(gè)簡(jiǎn)單的全連接神經(jīng)網(wǎng)絡(luò),它將解碼器產(chǎn)生的向量投影到一個(gè)更大的向量中,稱為 logits 向量。
假設(shè)我們的模型知道從訓(xùn)練數(shù)據(jù)集中學(xué)習(xí)的 10,000 個(gè)獨(dú)特的英語(yǔ)單詞。這將使 logits 向量有 10,000 個(gè)單元格寬——每個(gè)單元格對(duì)應(yīng)一個(gè)唯一單詞的分?jǐn)?shù),這就是我們解釋線性層模型輸出的方式。
然后,softmax 層將這些分?jǐn)?shù)轉(zhuǎn)換為概率(全部為正,全部加起來(lái)為 1.0)。選擇概率最高的單元格,并生成與其關(guān)聯(lián)的單詞作為該時(shí)間步的輸出。
圖片
編解碼器的協(xié)同工作
現(xiàn)在讓我們看看編碼器和解碼器之間是如何協(xié)同工作的。
編碼器首先處理輸入的文本token,然后輸出一組注意力向量 K 和 V。這些向量將由每個(gè)解碼器在其“編碼器-解碼器注意力”層中使用,這有助于解碼器關(guān)注輸入序列中的特定token的位置信息,具體計(jì)算注意力值的方法跟編碼器中是一樣的,需要注意的是,這里的K、V矩陣來(lái)自于編碼器的輸出,而Q矩陣來(lái)自于解碼器的輸入。
圖片
重復(fù)回歸以上的步驟,直到出現(xiàn)結(jié)束符號(hào)的標(biāo)識(shí),表示解碼器已完成其輸出。每個(gè)步驟的輸出在下一個(gè)時(shí)間步驟中被反饋到底部解碼器,并且解碼器像編碼器一樣向上反饋其解碼結(jié)果。就像我們對(duì)編碼器輸入所做的那樣,我們將位置編碼嵌入并添加到這些解碼器輸入中以指示每個(gè)單詞的位置。
圖片
至此,已經(jīng)分析完Transformer的編碼器和解碼器的全流程了。
七、Transformer-XL怎樣提升上下文長(zhǎng)度
傳統(tǒng)的Transformer模型中,上下文長(zhǎng)度是固定的,主要有以下幾個(gè)原因:
- 計(jì)算效率:在最初的設(shè)計(jì)中,Transformer模型是為了處理序列到序列的任務(wù),如機(jī)器翻譯。對(duì)于這類任務(wù),輸入序列(如源語(yǔ)言句子)和輸出序列(如目標(biāo)語(yǔ)言句子)通常具有相似的長(zhǎng)度,因此固定上下文長(zhǎng)度可以簡(jiǎn)化模型設(shè)計(jì),提高計(jì)算效率。
- 模型復(fù)雜度:Transformer模型的核心是自注意力機(jī)制,該機(jī)制在計(jì)算時(shí)需要對(duì)序列中的每個(gè)元素進(jìn)行成對(duì)的比較,以計(jì)算注意力權(quán)重。如果上下文長(zhǎng)度不固定,那么每次添加或刪除元素時(shí),都需要重新計(jì)算整個(gè)序列的注意力權(quán)重,這會(huì)導(dǎo)致計(jì)算復(fù)雜度和內(nèi)存需求急劇增加。
- 訓(xùn)練穩(wěn)定性:固定長(zhǎng)度的上下文可以提供穩(wěn)定的訓(xùn)練環(huán)境,有助于模型學(xué)習(xí)到更加一致和可靠的表示。如果上下文長(zhǎng)度不固定,模型可能需要在每次迭代中適應(yīng)新的序列長(zhǎng)度,這可能會(huì)影響訓(xùn)練的穩(wěn)定性和模型的收斂速度。
- 硬件限制:在實(shí)際應(yīng)用中,硬件資源(如GPU內(nèi)存)是有限的。固定長(zhǎng)度的上下文可以確保模型在任何時(shí)候都不會(huì)超出硬件資源的限制,從而避免因資源不足而導(dǎo)致的訓(xùn)練中斷。
- 模型泛化:固定長(zhǎng)度的上下文允許模型在訓(xùn)練時(shí)學(xué)習(xí)到特定長(zhǎng)度范圍內(nèi)的依賴關(guān)系,這有助于模型在實(shí)際應(yīng)用中泛化到類似的序列長(zhǎng)度上。
然而,固定上下文長(zhǎng)度也帶來(lái)了一些限制,特別是在處理長(zhǎng)序列時(shí),模型無(wú)法捕獲超過(guò)固定長(zhǎng)度的依賴關(guān)系,這限制了模型在某些任務(wù)(如長(zhǎng)文本生成和理解)上的性能。為了解決這個(gè)問(wèn)題,Transformer-XL等模型通過(guò)引入新的機(jī)制來(lái)允許處理更長(zhǎng)的上下文,從而在不犧牲計(jì)算效率的情況下捕獲更長(zhǎng)期的依賴關(guān)系。
國(guó)產(chǎn)開(kāi)源公司月之暗面的大模型產(chǎn)品kimi,能夠處理長(zhǎng)達(dá)20萬(wàn)字的超長(zhǎng)上下文,那么他是怎么做到的呢,核心是他的模型在Transformer的基礎(chǔ)上做了擴(kuò)展,實(shí)現(xiàn)了自己的Transformer-XL架構(gòu)。
Transformer-XL通過(guò)引入兩個(gè)關(guān)鍵的技術(shù)改進(jìn)來(lái)提升token上下文長(zhǎng)度的處理能力:片段遞歸機(jī)制(segment-level recurrence)和相對(duì)位置編碼機(jī)制(relative positional encoding)。
- 片段遞歸機(jī)制:在傳統(tǒng)的Transformer模型中,由于上下文長(zhǎng)度是固定的,模型無(wú)法捕獲超過(guò)預(yù)定義上下文長(zhǎng)度的長(zhǎng)期依賴性。Transformer-XL通過(guò)引入循環(huán)機(jī)制來(lái)解決這個(gè)問(wèn)題。具體來(lái)說(shuō),它不再?gòu)念^開(kāi)始計(jì)算每個(gè)新片段的隱藏狀態(tài),而是重復(fù)使用之前片段中獲得的隱藏狀態(tài),并將這些狀態(tài)作為當(dāng)前片段的“記憶”。這樣,信息就可以在不同片段之間傳遞,從而捕獲更長(zhǎng)的依賴關(guān)系。這種機(jī)制允許模型在不引起時(shí)間混亂的前提下,超越固定長(zhǎng)度去學(xué)習(xí)依賴性,同時(shí)解決了上下文碎片化問(wèn)題。
- 相對(duì)位置編碼機(jī)制:在Transformer-XL中,為了能夠在不造成時(shí)間混亂的情況下重復(fù)使用狀態(tài),引入了相對(duì)位置編碼的概念。相對(duì)位置編碼與傳統(tǒng)的絕對(duì)位置編碼不同,它只編碼token之間的相對(duì)位置關(guān)系,而不是token與固定起始點(diǎn)的絕對(duì)位置。這種編碼方式使得模型能夠在處理長(zhǎng)序列時(shí)更有效地利用位置信息,并且可以泛化至比在訓(xùn)練過(guò)程中觀察到的長(zhǎng)度更長(zhǎng)的注意力長(zhǎng)度。
通過(guò)這兩種機(jī)制,Transformer-XL顯著提升了模型在處理長(zhǎng)序列時(shí)的性能。
八、Transformer相關(guān)應(yīng)用分享
使用BERT做掩詞填充
BERT(Bidirectional Encoder Representations from Transformers)是一種預(yù)訓(xùn)練語(yǔ)言表示模型,由Google AI在2018年提出。BERT的核心創(chuàng)新在于利用Transformer架構(gòu)的編碼器部分來(lái)學(xué)習(xí)文本數(shù)據(jù)的深層次雙向表示。這種表示能夠捕捉到文本中詞匯的上下文關(guān)系,從而在多種自然語(yǔ)言處理(NLP)任務(wù)中取得了顯著的性能提升。
以下是BERT模型的一些關(guān)鍵特點(diǎn):
雙向上下文理解:與之前的單向語(yǔ)言模型不同,BERT通過(guò)在預(yù)訓(xùn)練階段使用掩碼語(yǔ)言模型(Masked Language Model, MLM)任務(wù),學(xué)習(xí)了詞匯在句子中的雙向上下文信息。這意味著模型能夠同時(shí)考慮一個(gè)詞前后的詞匯來(lái)理解其含義。
預(yù)訓(xùn)練和微調(diào):BERT采用了兩階段的訓(xùn)練策略。在預(yù)訓(xùn)練階段,BERT在大量文本數(shù)據(jù)上進(jìn)行無(wú)監(jiān)督學(xué)習(xí),學(xué)習(xí)語(yǔ)言的通用模式。在微調(diào)階段,BERT可以通過(guò)少量標(biāo)注數(shù)據(jù)針對(duì)特定任務(wù)進(jìn)行有監(jiān)督學(xué)習(xí),以適應(yīng)各種NLP任務(wù),如情感分析、問(wèn)答系統(tǒng)、命名實(shí)體識(shí)別等。
Transformer架構(gòu):BERT基于Transformer的編碼器部分,這是一種注意力機(jī)制(Attention Mechanism)的架構(gòu),它允許模型在處理序列數(shù)據(jù)時(shí)考慮序列中所有位置的信息。
大規(guī)模預(yù)訓(xùn)練:BERT在非常大的文本語(yǔ)料庫(kù)上進(jìn)行預(yù)訓(xùn)練,這使得模型能夠?qū)W習(xí)到豐富的語(yǔ)言知識(shí)。預(yù)訓(xùn)練的規(guī)模和質(zhì)量對(duì)模型性能有重要影響。
多樣化的任務(wù)適應(yīng)性:通過(guò)微調(diào),BERT可以適應(yīng)多種不同的NLP任務(wù),而不需要對(duì)模型架構(gòu)進(jìn)行大的修改。這使得BERT成為了一個(gè)靈活且強(qiáng)大的工具。
BERT的推出標(biāo)志著NLP領(lǐng)域的一個(gè)重大進(jìn)展,它在多項(xiàng)NLP任務(wù)上刷新了記錄,并催生了一系列基于BERT的改進(jìn)模型,如RoBERTa、ALBERT、DistilBERT等。這些模型在不同的方面對(duì)BERT進(jìn)行了優(yōu)化,以提高性能、減少計(jì)算資源消耗或改善特定任務(wù)的表現(xiàn)。
以下是使用BERT做掩詞填充的示例,輸入一段文本,讓模型預(yù)測(cè)出下一個(gè)被掩蓋的詞:
https://huggingface.co/google-bert/bert-base-uncased
圖片
使用BART做文本摘要
BART(Bidirectional and Auto-Regressive Transformers)是一種先進(jìn)的自然語(yǔ)言處理(NLP)模型,它結(jié)合了BERT(Bidirectional Encoder Representations from Transformers)和GPT(Generative Pre-trained Transformer)的特點(diǎn),用于文本理解和生成任務(wù)。BART模型特別擅長(zhǎng)處理不同類型的文本噪聲和序列變換,使其在多種NLP任務(wù)中表現(xiàn)出色。
設(shè)計(jì)原理和結(jié)構(gòu)
BART是基于Transformer架構(gòu)的自編碼自回歸模型。它通過(guò)兩個(gè)主要步驟進(jìn)行預(yù)訓(xùn)練:
- 使用任意噪聲函數(shù)破壞文本(例如,隨機(jī)打亂句子順序、刪除或遮蔽token)。
- 模型學(xué)習(xí)重建原始文本。
這種預(yù)訓(xùn)練方式使得BART能夠有效地處理文本生成、翻譯和理解等任務(wù)。BART的編碼器是雙向的,能夠捕捉文本的前后文信息,而解碼器是自回歸的,能夠基于前面的輸出生成后續(xù)的內(nèi)容。
應(yīng)用
BART在多種NLP任務(wù)上取得了顯著的成績(jī),包括但不限于:
- 文本摘要
- 機(jī)器翻譯
- 對(duì)話生成
- 問(wèn)答系統(tǒng)
- 文本分類
與其他模型的對(duì)比
與其他預(yù)訓(xùn)練模型相比,BART在處理文本生成任務(wù)時(shí)尤其出色。它在自然語(yǔ)言理解任務(wù)中也有很好的表現(xiàn),與BERT和GPT等模型相比,BART在多個(gè)基準(zhǔn)數(shù)據(jù)集上取得了競(jìng)爭(zhēng)性或更好的結(jié)果。
預(yù)訓(xùn)練和微調(diào)
BART模型通過(guò)大量的文本數(shù)據(jù)進(jìn)行預(yù)訓(xùn)練,然后在特定任務(wù)上進(jìn)行微調(diào)。預(yù)訓(xùn)練階段,模型學(xué)習(xí)如何從噪聲文本中恢復(fù)原始文本,而微調(diào)階段則是針對(duì)特定任務(wù)調(diào)整模型參數(shù),以優(yōu)化任務(wù)性能。
以下是使用BART做文本摘要的應(yīng)用示例:
https://huggingface.co/facebook/bart-large-cnn
圖片
使用DistilBERT做問(wèn)答
DistilBERT是一種輕量級(jí)的BERT模型,它通過(guò)知識(shí)蒸餾(knowledge distillation)技術(shù)從預(yù)訓(xùn)練的BERT模型中學(xué)習(xí)知識(shí)。這種方法的核心思想是使用一個(gè)較小的BERT模型作為“學(xué)生”模型,而原始的、較大的BERT模型則充當(dāng)“教師”模型。在訓(xùn)練過(guò)程中,學(xué)生模型嘗試復(fù)制教師模型的輸出,以此來(lái)學(xué)習(xí)教師模型的知識(shí)。
主要特點(diǎn)和優(yōu)勢(shì)
模型大小和效率:DistilBERT的模型大小和參數(shù)量都比原始的BERT模型小,這使得它在資源受限的環(huán)境中(如移動(dòng)設(shè)備)更加實(shí)用。它的推理速度也比BERT快,因?yàn)樗枰幚淼膮?shù)更少。
知識(shí)蒸餾:DistilBERT使用了一種稱為“軟目標(biāo)”的知識(shí)蒸餾方法。在這種方法中,學(xué)生模型不僅學(xué)習(xí)來(lái)自訓(xùn)練數(shù)據(jù)的標(biāo)簽,還學(xué)習(xí)教師模型的輸出,這些輸出被視為附加的、軟性的標(biāo)簽。
保持性能:盡管DistilBERT的模型大小減小了,但它仍然保持了與原始BERT模型相當(dāng)?shù)男阅?,特別是在自然語(yǔ)言理解任務(wù)上。
靈活性:DistilBERT保留了BERT模型的基本架構(gòu),包括Transformer的串聯(lián)層,這使得它可以很容易地適應(yīng)各種下游任務(wù)。
結(jié)構(gòu)和訓(xùn)練
DistilBERT的結(jié)構(gòu)相對(duì)簡(jiǎn)單,它僅保留了BERT的6層Transformer,刪除了token type embedding和pooler層。在訓(xùn)練過(guò)程中,它使用了一種稱為“模型壓縮”的技術(shù),通過(guò)這種方法,模型的層數(shù)被減半,同時(shí)從教師模型的層初始化學(xué)生模型的層。
應(yīng)用場(chǎng)景
由于其較小的模型大小和較快的推理速度,DistilBERT適用于需要快速處理和低資源消耗的NLP任務(wù),例如文本分類、情感分析、問(wèn)答系統(tǒng)和語(yǔ)言模型等。
總的來(lái)說(shuō),DistilBERT是一個(gè)高效的BERT變體,它通過(guò)知識(shí)蒸餾技術(shù)實(shí)現(xiàn)了模型的壓縮,同時(shí)保持了良好的性能,特別適合在資源受限的環(huán)境中使用。
以下是是使用DistilBERT做問(wèn)答的實(shí)例:
https://huggingface.co/distilbert/distilbert-base-uncased-distilled-squad
圖片
使用T5做文本翻譯
T5模型,全稱為“Text-to-Text Transfer Transformer”,是由Google Research團(tuán)隊(duì)開(kāi)發(fā)的一種自然語(yǔ)言處理(NLP)模型。T5模型的核心思想是將所有NLP任務(wù)統(tǒng)一轉(zhuǎn)換為文本到文本(Text-to-Text)的格式,從而可以使用同一個(gè)模型和訓(xùn)練過(guò)程來(lái)處理多種不同的任務(wù),如翻譯、摘要、問(wèn)答等。
主要特點(diǎn)和優(yōu)勢(shì)
統(tǒng)一的框架:T5模型通過(guò)將任務(wù)轉(zhuǎn)換為文本到文本的格式,簡(jiǎn)化了不同NLP任務(wù)的處理方式。例如,對(duì)于翻譯任務(wù),輸入可以是“translate English to German: [English text]”,輸出則是翻譯后的文本。
基于Transformer架構(gòu):T5模型采用了Transformer的encoder-decoder架構(gòu),這是一種高效的網(wǎng)絡(luò)結(jié)構(gòu),特別適合處理序列數(shù)據(jù)。
預(yù)訓(xùn)練和微調(diào):T5模型首先在大規(guī)模的數(shù)據(jù)集上進(jìn)行預(yù)訓(xùn)練,學(xué)習(xí)語(yǔ)言的通用表示,然后可以針對(duì)特定任務(wù)進(jìn)行微調(diào),以優(yōu)化任務(wù)性能。
廣泛的應(yīng)用場(chǎng)景:T5模型可以應(yīng)用于多種NLP任務(wù),包括但不限于文本分類、命名實(shí)體識(shí)別、情感分析、機(jī)器翻譯和對(duì)話生成等。
高效的計(jì)算能力:T5模型的設(shè)計(jì)允許它高效地處理大規(guī)模數(shù)據(jù)集,并且具有強(qiáng)大的并行處理能力。
訓(xùn)練和應(yīng)用
T5模型在訓(xùn)練時(shí)使用了一種稱為“C4”的大規(guī)模數(shù)據(jù)集,這個(gè)數(shù)據(jù)集由經(jīng)過(guò)清洗的Common Crawl數(shù)據(jù)組成。模型通過(guò)不同的預(yù)訓(xùn)練目標(biāo)和策略進(jìn)行訓(xùn)練,包括自回歸、自編碼和文本重排等。
在應(yīng)用方面,T5模型的強(qiáng)大語(yǔ)言表示能力和廣泛的應(yīng)用場(chǎng)景使其成為NLP領(lǐng)域的一個(gè)重要工具。它可以通過(guò)微調(diào)來(lái)適應(yīng)不同的領(lǐng)域和任務(wù),從而在多個(gè)NLP任務(wù)上取得優(yōu)異的性能。
T5模型通過(guò)其創(chuàng)新的Text-to-Text框架和基于Transformer的架構(gòu),在自然語(yǔ)言處理領(lǐng)域提供了一種新的解決方案,能夠處理多種復(fù)雜的語(yǔ)言任務(wù),并且具有很好的擴(kuò)展性和適應(yīng)性。
以下是使用T5做文本翻譯的示例:
https://huggingface.co/google-t5/t5-base
圖片
使用GPT-2寫(xiě)小說(shuō)
GPT-2(Generative Pre-trained Transformer 2)是由OpenAI開(kāi)發(fā)的自然語(yǔ)言處理(NLP)模型,它是GPT系列模型的第二代。GPT-2在自然語(yǔ)言理解和生成方面表現(xiàn)出色,能夠生成連貫、相關(guān)且多樣化的文本。這個(gè)模型在發(fā)布時(shí)因其生成文本的質(zhì)量和多樣性而受到廣泛關(guān)注。
主要特點(diǎn)和優(yōu)勢(shì)
大規(guī)模預(yù)訓(xùn)練:GPT-2通過(guò)在大規(guī)模的互聯(lián)網(wǎng)文本數(shù)據(jù)集上進(jìn)行預(yù)訓(xùn)練,學(xué)習(xí)到了豐富的語(yǔ)言模式和知識(shí)。這種預(yù)訓(xùn)練使得模型能夠理解和生成自然語(yǔ)言文本。
Transformer架構(gòu):GPT-2基于Transformer模型架構(gòu),這是一種依賴于自注意力(self-attention)機(jī)制的深度學(xué)習(xí)架構(gòu),非常適合處理序列數(shù)據(jù),如文本。
無(wú)監(jiān)督學(xué)習(xí):GPT-2采用無(wú)監(jiān)督學(xué)習(xí)方法,通過(guò)預(yù)測(cè)下一個(gè)詞的任務(wù)來(lái)預(yù)訓(xùn)練模型。這種訓(xùn)練方式不依賴于標(biāo)注數(shù)據(jù),使得模型能夠?qū)W習(xí)到更廣泛的語(yǔ)言知識(shí)。
生成能力:GPT-2特別擅長(zhǎng)文本生成任務(wù),能夠生成連貫、有邏輯的段落和文章,甚至能夠模仿特定的寫(xiě)作風(fēng)格。
多樣性:GPT-2能夠處理多種語(yǔ)言任務(wù),包括文本生成、翻譯、問(wèn)答、摘要等。
版本和規(guī)模
GPT-2有多個(gè)版本,不同版本之間主要區(qū)別在于模型的大小和參數(shù)數(shù)量。例如,最小的版本有1.17億個(gè)參數(shù),而最大的版本(GPT-2 1.5 Billion)有15億個(gè)參數(shù)。隨著模型規(guī)模的增加,性能和生成文本的質(zhì)量也相應(yīng)提高。
應(yīng)用場(chǎng)景
GPT-2可以應(yīng)用于多種場(chǎng)景,如聊天機(jī)器人、文本摘要、內(nèi)容創(chuàng)作輔助、語(yǔ)言翻譯等。它的生成能力使得在創(chuàng)意寫(xiě)作、新聞生成和其他需要自然語(yǔ)言生成的領(lǐng)域中具有潛在的應(yīng)用價(jià)值。
挑戰(zhàn)和限制
盡管GPT-2在生成文本方面表現(xiàn)出色,但它也面臨一些挑戰(zhàn)和限制,包括生成文本的偏見(jiàn)問(wèn)題、事實(shí)準(zhǔn)確性問(wèn)題以及潛在的濫用風(fēng)險(xiǎn)。因此,OpenAI在發(fā)布GPT-2時(shí)采取了謹(jǐn)慎的態(tài)度,逐步放開(kāi)對(duì)模型的訪問(wèn)權(quán)限。
總的來(lái)說(shuō),GPT-2是一個(gè)強(qiáng)大的NLP模型,它在文本生成和理解方面的能力使其成為自然語(yǔ)言處理領(lǐng)域的一個(gè)重要里程碑。
以下是使用GPT-2做文本生成的示例:
https://huggingface.co/openai-community/gpt2
圖片
完整的體驗(yàn)地址:https://transformer.huggingface.co/doc/gpt2-large
我們可以輸入一段小說(shuō)的開(kāi)頭,比如:As aliens entered our planet,然后Transformer就會(huì)依據(jù)我們輸入的文本,自動(dòng)腦補(bǔ)剩下的小說(shuō)情節(jié)。
圖片
那Transformer是怎么做到的呢?如下圖所示,Transformer在生成每一個(gè)token時(shí),會(huì)參考前面所有的token,并生成與之相符的token,這樣循環(huán)往復(fù)就能生成完整的一段內(nèi)容。
圖片
九、參考文檔
https://arxiv.org/pdf/1706.03762.pdf
https://jalammar.github.io/illustrated-transformer/
https://www.bilibili.com/video/BV1ih4y1J7rx