Transformer structure 模型結(jié)構(gòu)
Transformer概述
首先回顧一下之前的RNN的一個(gè)端到端的模型,以下是一個(gè)典型的兩層的LSTM模型,我們可以發(fā)現(xiàn),這樣一個(gè)RNN模型,一個(gè)非常重要的一個(gè)缺點(diǎn)就在于,它必須順序地執(zhí)行,對(duì)于文本這樣一個(gè)序列,它必須先計(jì)算得到第一個(gè)位置的一個(gè)表示,然后才可以往后計(jì)算文本第二個(gè)的一個(gè)表示,然后接著才能去計(jì)算第三個(gè)。
而這樣的模式,其實(shí)對(duì)于目前并行能力非常強(qiáng)大的GPU等專業(yè)設(shè)備來說,非常不友好,會(huì)造成很多資源浪費(fèi)。
然后其次是盡管RNN有很多變體,比如說GRU、LSTM,但是它依然需要依靠前面提到的注意力機(jī)制,來解決像信息瓶頸這樣的一些問題
考慮到RNN的這些所有的缺點(diǎn),我們是否能夠拋棄RNN的模型結(jié)構(gòu)來來做文本的一些任務(wù)?這個(gè)答案顯然是肯定的,研究人員在2017年發(fā)表的這篇文章,用他們的標(biāo)題就直接回答了這個(gè)問題,這個(gè)標(biāo)題叫attention is all you need,影響很大,后期也出現(xiàn)了很多類似xxx?is all you need的論文,這篇文章中,模型作者就提出了一個(gè)非常強(qiáng)大的模型結(jié)構(gòu),來進(jìn)行機(jī)器翻譯的任務(wù),這個(gè)結(jié)構(gòu)就是接下來要講的Transformer
我們首先來整體看一下這樣一個(gè)Transformer 的整體結(jié)構(gòu),可以看到,它同樣是一個(gè)encoder和decoder的模型,他的encoder端我們用紅色框來框出,decoder端用藍(lán)色的部分來表示
我們從下往上來看這樣一個(gè)過程,首先,它的第一層是一個(gè)輸入層
輸入層:需要將一個(gè)正常的文本序列切成一個(gè)個(gè)小的單元,這里我們把這個(gè)單元叫做token,然后通過embedding可以化為一個(gè)向量表示,這里不同于RNN的地方有兩點(diǎn):
1、Transformer 會(huì)采用一種叫Byte Pair Encoding的方式,來對(duì)文本進(jìn)行切分,也就是我們常說的BPE的方法,同時(shí)在每個(gè)位置也會(huì)加上一個(gè)token的一個(gè)位置向量,也就叫positional encoding,用來表示它在文本序列中的一個(gè)位置。這兩塊我們?cè)诤竺娑紩?huì)有再詳細(xì)的介紹
接下來是Transformer structure的一個(gè)主要圖層部分,它是由多個(gè)encoder或者decoder的Transformer block堆疊而成的,而這種block在encoder和decoder之間會(huì)略有一些不同:
對(duì)于encoder端不同層的block以及或者decoder端不同層的block,他們的結(jié)構(gòu)式完全一致的,就是在參數(shù)上會(huì)有所不同
Transformer也是通過這樣一個(gè)堆疊方式來得到一個(gè)更深,表達(dá)能力更強(qiáng)的一個(gè)模型
最后模型的輸出層其實(shí)就是一個(gè)線性層的變換和一個(gè)softmax來輸出一個(gè)在詞表上的概率分布,其實(shí)這個(gè)和之前的RNN輸出層是基本一致的,在訓(xùn)練的過程中,我們也是通過詞表這樣一個(gè)維度,計(jì)算交叉熵來計(jì)算loss,進(jìn)而更新模型的一個(gè)參數(shù)
以上就是模型的整體情況,下面我們就逐個(gè)部分來一一地進(jìn)行講解:
input encoding輸入層(輸入編碼BPE、PE)
輸入層中首先介紹的是Byte Pair Encoding的方式,
首先想一下,如果我們要處理一個(gè)句子,這個(gè)句子是一個(gè)連續(xù)的文本,我們首先需要把這個(gè)句子給切分成一個(gè)一個(gè)的單詞,我們?cè)谥癛NN上,可能大部分情況就是直接按照空格這樣一種方式來進(jìn)行切分,這個(gè)是一個(gè)最簡(jiǎn)單的切分方式,但顯然這個(gè)方法還是有一些問題的,比如說他會(huì)導(dǎo)致詞表的數(shù)量會(huì)很大,另外,可能像一些單詞的復(fù)數(shù)和它原單詞可能就會(huì)對(duì)應(yīng)兩個(gè)完全不一樣高的embedding,這些都是使用空格切分的這種簡(jiǎn)單方式的問題
我們?cè)谶@里介紹一種全新的分詞方式,相比簡(jiǎn)單方式有很多優(yōu)點(diǎn),這是Transformer模型中使用的切分方式,它為Byte Pair Encoding,簡(jiǎn)稱為BPE,他的過程為:
它首先會(huì)將語(yǔ)料庫(kù)中出現(xiàn)的所有單詞都切分為一個(gè)一個(gè)字母,這個(gè)就是最初的詞表,隨后它通過統(tǒng)計(jì),在語(yǔ)料庫(kù)中每一個(gè)byte gram出現(xiàn)的數(shù)量,我們就可以一步一步把頻度最高的byte gram抽象成一個(gè)詞加入詞表中,然后就不斷的擴(kuò)充詞表,最后直到我們達(dá)到需要的一個(gè)詞表的一個(gè)數(shù)量,以下面的一個(gè)具體例子來看BPE構(gòu)造詞表的一個(gè)過程:
比如,我們?cè)谝粋€(gè)文本中,low這樣的單詞出現(xiàn)了5次,然后lower這樣的一個(gè)單詞出現(xiàn)了2次,newest單詞出現(xiàn)了6次,wildest出現(xiàn)了3次,我們最開始的詞表其實(shí)就是由這四個(gè)單詞,所有的這個(gè)字母組成的,隨后我們左邊還要維護(hù)一個(gè)單詞和頻率的一個(gè)對(duì)應(yīng)關(guān)系,然后我們將里面單詞所有按照字母來切分之后,我們統(tǒng)計(jì)所有的byte gram出現(xiàn)的數(shù)量,byte gram其實(shí)就是指連續(xù)兩個(gè)相鄰位置拼到一起的一個(gè)組合,比如:i和o拼到一起就是一個(gè)byte gram,o和w拼到一起就是一個(gè)byte gram。
我們可以發(fā)現(xiàn),在當(dāng)前的這樣一個(gè)語(yǔ)料庫(kù)中,es這樣的一個(gè)byte gram,其實(shí)是出現(xiàn)頻率最高的,它一共出現(xiàn)了9次,分別在newest次中出現(xiàn)了6次,wildest中出現(xiàn)了3次,這里我們就把es拼接稱為一個(gè)新的單詞加入到詞表當(dāng)中,同時(shí),因?yàn)閟這個(gè)單詞它不再會(huì)單獨(dú)出現(xiàn),所以我們將s從詞表中去除,這樣的話,新的詞表就是下面的這個(gè)情況,把s去掉后,加入es
隨后我們?cè)侔凑者@個(gè)新的詞表,來組合前面提到的這個(gè),左邊這個(gè)對(duì)應(yīng)關(guān)系中的一個(gè)byte gram的情況,可以看到es其實(shí)就是一個(gè)單詞,而est就是一個(gè)新的byte gram???????,在這個(gè)新的詞表和文本中,我們可以發(fā)現(xiàn)est這樣的一個(gè)byte gram出現(xiàn)的頻率最高,為9次,我們就將這樣一個(gè)新的詞拼接,變成一個(gè)新的詞加入到詞表當(dāng)中,同時(shí)由于es也不再單獨(dú)出現(xiàn),我們將它從詞表中去除
我們之后不斷重復(fù)這樣一個(gè)過程,直到我們的詞表數(shù)量達(dá)到預(yù)定的一個(gè)值,這樣所有出現(xiàn)在語(yǔ)料庫(kù)中的句子,其實(shí)都可以通過這樣一個(gè)詞表,切分成一個(gè)個(gè)單獨(dú)的token,就完成了我們BPE的這個(gè)過程。
BPE的提出,但是是為了解決out of vocabulary的問題,其實(shí)就是出現(xiàn)OOV的問題,即指在這個(gè)輸入的文本中,我們會(huì)出現(xiàn)了一些在詞表中沒有出現(xiàn)過的詞,這樣就導(dǎo)致模型無法理解這個(gè)新的單詞的含義,我們也沒有辦法找到對(duì)應(yīng)的這個(gè)向量表示,這時(shí)候往往會(huì)使用一個(gè)特殊的,比如說UNK這樣一個(gè)符號(hào)來代替,這個(gè)問題其實(shí)在NLP中非常常見,比如說像我們之前那樣,使用空格直接對(duì)句子進(jìn)行一個(gè)切分,勢(shì)必會(huì)很難窮舉到所有的單詞。
而BPE通過將文本序列,變成一個(gè)個(gè)sub word的一個(gè)更小的單元,就可以通過將之前沒有見過的單詞分解為一個(gè)個(gè)見過的小的sub word,就可以表示更多的單詞,比如像下面這個(gè)例子中,如果出現(xiàn)了一個(gè)新的單詞lowest,它就可以被切分成low和est兩個(gè)部分,這樣就可以對(duì)一個(gè)新的單詞進(jìn)行表示,同樣通過這樣的一個(gè)方式,也可以讓模型學(xué)會(huì)low和lowest之間的一個(gè)關(guān)系,這樣的關(guān)系也可以被泛化到,比如說像其他的單詞中比如samrt和smartest,因?yàn)樗鋵?shí)表示的是一個(gè)形容詞最高級(jí)的一個(gè)形式,并且在當(dāng)時(shí),使用BPE編碼的機(jī)器翻譯模型,其實(shí)也在很多機(jī)器翻譯的比賽中取得了非常好的效果。
接下來我們看一下輸入層的另一個(gè)重要部分,叫做位置編碼,即positional encoding,
這個(gè)模塊出現(xiàn)的主要原因是,Transformer不同于RNN,他沒有辦法通過處理先后順序來建模每個(gè)單詞的位置對(duì)應(yīng)關(guān)系,所以,如果沒有位置編碼,Transformer block對(duì)于不同位置的相同單詞其實(shí)是沒有辦法區(qū)分的,但我們其實(shí)都知道,對(duì)于文本來說,他的一個(gè)位置關(guān)系,一個(gè)token出現(xiàn)在文本中的位置其實(shí)是非常重要的。
Transformer為了解決這個(gè)問題,就提出了一個(gè)顯示好的建模位置關(guān)系的一個(gè)方法,即:通過在原有的embedding上加上一個(gè)位置向量,然后讓不同位置單詞具有不同的表示,進(jìn)而讓Transformer block可以進(jìn)行一個(gè)區(qū)分
我們首先假設(shè)BPE得到的這個(gè)BPE和經(jīng)過embedding之后的向量的維度為d,那么我們這個(gè)位置編碼,其實(shí)也需要是一個(gè)維度為d的向量,Transformer采用了一個(gè)基于三角函數(shù)的一個(gè)方法,來得到對(duì)應(yīng)的位置向量,具體的公式如下:
其中pos表示這個(gè)當(dāng)前token在句子中的位置,它是一個(gè)從0到這個(gè)序列長(zhǎng)度的一個(gè)數(shù)
i是一個(gè)從0到二分之一d的一個(gè)數(shù),它表示當(dāng)前這個(gè)位置在embedding中的index,我們可以看到在embedding維度中的偶數(shù)位置,它其實(shí)是一個(gè)正弦函數(shù),而在奇數(shù)位,它是一個(gè)余弦函數(shù)
同樣,通過這個(gè)公式,我們也可以看到,位置編碼的一些特點(diǎn):首先是位置,一個(gè)具體的位置就是pos和它得到編碼向量其實(shí)是一一對(duì)應(yīng)的,不會(huì)出現(xiàn)說不同的位置會(huì)有相同的位置編碼向量的情況;第二個(gè)的話就是位置編碼大小其實(shí)是有界的,他不會(huì)特別大或者特別小,因?yàn)槿呛瘮?shù)是有界的;第三個(gè)根據(jù)三角函數(shù)的性質(zhì),我們可以發(fā)現(xiàn)不同位置的位置編碼向量之間的差別取決于他們之間的相對(duì)位置,我們最終輸入到每個(gè)Transformer block中的就是將BPE和PE按照位置相加得到的一個(gè)向量表示。
為了更方便理解位置編碼向量,我們對(duì)一個(gè)簡(jiǎn)單的位置編碼進(jìn)行以下可視化:
這里展示的是一個(gè)長(zhǎng)度為10個(gè)token,維度為64的一個(gè)編碼向量
可以看到相同維度的,就是每個(gè)豎線,它其實(shí)是一個(gè)周期的正弦或者余弦函數(shù)
而相同位置,也就是每個(gè)橫線的話,它其實(shí)對(duì)應(yīng)不同周期的正弦或者余弦函數(shù)
encoder block-核心(Transformer block)
右圖是截取的一個(gè)encoder端Transformer block的一個(gè)情況,encoder的情況會(huì)有一些略微的不同,我們現(xiàn)介紹encoder端的這個(gè)部分。
它的整體是由兩大塊組成的,分別是前面的這一塊叫做multi-head attention的一個(gè)網(wǎng)絡(luò),后面是feed-forward network的一個(gè)前饋神經(jīng)網(wǎng)絡(luò),它其實(shí)本質(zhì)上就是一個(gè)帶激活函數(shù)的MLP全連接。
(MLP是多層感知器(Multilayer Perceptron)的縮寫,是一種常見的人工神經(jīng)網(wǎng)絡(luò)模型)
除此之外還有兩個(gè)小技巧,第一個(gè)是殘差連接,即圖中,從主線指向add&norm的這條線,殘差其實(shí)本質(zhì)上是借鑒于計(jì)算機(jī)視覺的領(lǐng)域中的大名鼎鼎的ResNet,這樣一個(gè)結(jié)構(gòu)可以通過將它的輸入和輸出直接相加,我們就可以緩解模型過深之后帶來一個(gè)梯度消失的問題,而且這樣的一個(gè)結(jié)構(gòu)在很多計(jì)算機(jī)視覺的模型中也起到了重要的作用,這個(gè)特性也會(huì)繼續(xù)在Transformer 中發(fā)揮重要的作用,為后續(xù)我們構(gòu)建成熟很深的預(yù)訓(xùn)練模型提供了一個(gè)可能。
另一個(gè)小的技巧就是Layer normalization,正則化其實(shí)是一個(gè)比較常見的技巧,它夾在add&norm這個(gè)位置,而且有著很多變體,我們這里采用的Layer normalization,其實(shí)就是在隱向量這個(gè)維度來進(jìn)行正則化,它會(huì)將輸入的一個(gè)向量變成一個(gè)均值為0,方差為1的一個(gè)分布,這樣的一個(gè)技術(shù)其實(shí)同樣是為了針對(duì)梯度消失和梯度爆炸的問題。
(注:紅色字體相關(guān)內(nèi)容可以進(jìn)入關(guān)于大模型學(xué)習(xí)中遇到的4查看學(xué)習(xí))
(圖左下角的兩篇文章分別是以上兩個(gè)技巧的來源)
我們?cè)赥ransformer中這里用到的一個(gè)注意力機(jī)制其實(shí)是一種基于點(diǎn)積的注意力機(jī)制,相比于前面學(xué)習(xí)的在RNN中使用的一些注意力機(jī)制可能略有不同,但主要思想是一致的,我們首先簡(jiǎn)單回顧一下前面學(xué)習(xí)的注意力機(jī)制,它就是給定一個(gè)query向量和value向量的集合,我們通過注意力機(jī)制就可以基于query向量對(duì)value向量進(jìn)行一個(gè)加權(quán)平均。
而在Transformer中,我們不同的是,它給定的是一個(gè)query向量和一個(gè)k向量和value向量對(duì)的一個(gè)集合,其中query向量和k向量的維度都是dk,value向量的維度是dv,這樣的這個(gè)輸出,同樣是對(duì)value向量的一個(gè)加權(quán)平均,只不過不同于之前用q和v來計(jì)算注意力分?jǐn)?shù),我們這里采用q和k的點(diǎn)積來計(jì)算注意力分?jǐn)?shù),也就是以下公式提到的這個(gè)q和ki和kj的一個(gè)點(diǎn)積,最后還是會(huì)得到一個(gè)長(zhǎng)度為n的一個(gè)注意力分?jǐn)?shù),然后通過使用softmax,我們就可以將這樣一個(gè)注意力分?jǐn)?shù),變?yōu)橐粋€(gè)注意力分布,一個(gè)概率分布,進(jìn)而就可以對(duì)得到的v向量進(jìn)行一個(gè)加權(quán)平均,也就是這樣一個(gè)attention的一個(gè)輸出。同樣如果我們有很多個(gè)q向量,它就可以組成一個(gè)矩陣Q,我們對(duì)每一個(gè)q向量都進(jìn)行上述的這樣一個(gè)操作,其實(shí)更直接地,我們可以用一個(gè)矩陣的乘法,來表示這個(gè)過程,這樣最后得到的這個(gè)公式非常簡(jiǎn)潔,而且易于實(shí)現(xiàn),最重要的是,通過這個(gè)公式,我們可以發(fā)現(xiàn)公式中的q,其實(shí)它的計(jì)算是互不干擾的,是可以并行進(jìn)行的,更方便我們?cè)贕PU等設(shè)備上進(jìn)行并行的一個(gè)運(yùn)算。
下面我們用一個(gè)圖示來解釋一下這個(gè)attention的過程:
首先這里有3個(gè)矩陣:Q、KT、V。其中Q k都是二乘三的一個(gè)情況,然后我們首先將Q、K矩陣進(jìn)行一個(gè)矩陣乘法,就可以得到一個(gè)二乘二的Attention Score注意力分?jǐn)?shù),這個(gè)注意力分?jǐn)?shù)第一行就是第一個(gè)query向量和兩個(gè)k向量進(jìn)行點(diǎn)積的結(jié)果,第二行就是第二個(gè)query向量和兩個(gè)k向量進(jìn)行點(diǎn)積的結(jié)果,隨后我們對(duì)每一行都結(jié)算一個(gè)softmax,就可以得到一個(gè)注意力的一個(gè)分布,他的每一行就是一個(gè)概率分布,然后求和為1
隨后我們將這樣一個(gè)注意力分布和它對(duì)應(yīng)的value矩陣進(jìn)行一個(gè)矩陣乘法,我們就可以看到,其實(shí)得到的output第一個(gè)向量,就是用前兩個(gè)值對(duì)兩個(gè)v向量進(jìn)行加權(quán)平均,最后得到二乘三的output
以上基本就是attention在做的主要的一個(gè)事情。
在前面attention的一個(gè)基礎(chǔ)上,我們進(jìn)一步需要加入一個(gè)scaled系數(shù),就是一個(gè)完整的scaled dot-product attention模塊,這個(gè)也就是在Transformer中使用的一個(gè)attention的一個(gè)情況,首先我們還是看一下,前面如果沒有這個(gè)scaled技術(shù)他的一些問題:
因?yàn)槲覀冞@里的注意力分?jǐn)?shù)的計(jì)算方式是通過q和k的點(diǎn)積實(shí)現(xiàn)的,如果在正常情況下,q和k的點(diǎn)積它得到的這個(gè)標(biāo)量的這個(gè)方差,它會(huì)隨著dk的增加而變大,這個(gè)其實(shí)如果在之后作用到softmax函數(shù)里面,就會(huì)出現(xiàn)一個(gè)問題是,它得到的概率分布會(huì)變得更加尖銳,然后某些有某個(gè)位置可能會(huì)變?yōu)?,其他大部分文字的這個(gè)概率分布都非常接近0,這樣導(dǎo)致的結(jié)果就是梯度可能會(huì)變得越來越小,不利于進(jìn)行參數(shù)的一個(gè)更新。
這里提供了一個(gè)解決方案,將q和k在點(diǎn)積之后除以一個(gè)根號(hào)k的方式,然后這樣可以表示,得到這個(gè)注意力分?jǐn)?shù)的方差它依然為1,來防止上述這樣問題的一個(gè)出現(xiàn)。
右邊的圖完整的展示了這樣一個(gè)attention的過程
我們?cè)賮碇匦吕硪幌?,首先是q和這個(gè)其中這個(gè)mask這個(gè)位置,我們會(huì)在decoder中體現(xiàn)。其次我們可以看到Q和K進(jìn)行一個(gè)矩陣乘法,得到對(duì)應(yīng)的一個(gè)注意力分?jǐn)?shù)matmul,然后通過scaled系數(shù),即根號(hào)k,來將其這個(gè)規(guī)模進(jìn)行一個(gè)放縮。然后再通過softmax,將這樣一個(gè)注意力分?jǐn)?shù)變成了一個(gè)概率分布,隨后通過預(yù)對(duì)應(yīng)的V矩陣進(jìn)行一個(gè)矩陣乘法,就可以對(duì)v矩陣實(shí)現(xiàn)一個(gè)加權(quán)平均,也就是我們得到的最后一個(gè)輸出。
前面提到的K、Q、V也是用這三個(gè)字母表示,但其實(shí)因?yàn)槲覀冞@個(gè)attention,使用的是一種自注意力機(jī)制,我們希望的是,模型能夠自己每個(gè)token能夠自主地選擇,應(yīng)該關(guān)注這句話中的哪些token,并進(jìn)行信息整合,所以,對(duì)應(yīng)到K、Q、V這三個(gè)矩陣,其實(shí)他們都是從文本的表示向量乘上一個(gè)變換矩陣得到的,而對(duì)于非第一層的Transformer block來說,文本的表示向量其實(shí)就是前面一層的輸出,而對(duì)于第一層的block來說,這樣一個(gè)表示文本的表示向量,其實(shí)就是我們前面提到的這個(gè)詞表向量和對(duì)應(yīng)位置編碼的一個(gè)求和。
在上述單個(gè)attention的一個(gè)基礎(chǔ)上,Transformer 為了進(jìn)一步增強(qiáng)模型的一個(gè)表示能力,它采用了多個(gè)結(jié)構(gòu)相同但參數(shù)不同的一個(gè)注意力模塊,組成了一個(gè)多頭的注意力機(jī)制。
其中每個(gè)注意力頭的一個(gè)計(jì)算方式都和前面介紹的是完全一致的,只不過每一個(gè)頭,它都會(huì)有一個(gè)自己的權(quán)重矩陣WiQ、WiK、WiV,就分別對(duì)應(yīng)這個(gè)linear這個(gè)位置。
每個(gè)注意力頭通過前面提到的這種方式得到自己的這個(gè)輸出之后,我們將這些輸出在維度層面進(jìn)行一個(gè)拼接,然后通過一個(gè)線性層進(jìn)行整合,就得到了我們多頭注意力機(jī)制的一個(gè)輸出??梢钥吹竭@樣一個(gè)多頭注意力機(jī)制,他的輸入就是前一層的輸出或者是輸入的時(shí)候embedding和位置編碼的一個(gè)相加。
然后它輸出的文本,就會(huì)通過這個(gè)殘差連接和正則化之后就會(huì)輸入到后面的前饋神經(jīng)網(wǎng)絡(luò),這樣我們就走完了Transformer block的一個(gè)過程。
(注:紅色字體相關(guān)內(nèi)容可以進(jìn)入關(guān)于大模型學(xué)習(xí)中遇到的4查看學(xué)習(xí))
我們?cè)僦匦驴匆幌逻@個(gè)機(jī)構(gòu),他還是兩個(gè)主要的部分:第一個(gè)部分是一個(gè)多頭的注意力機(jī)制,第二部分還是剛才提到的前饋神經(jīng)網(wǎng)絡(luò)。其實(shí)本質(zhì)上它還是一個(gè)兩層的全連接,通過這樣一個(gè)過程,他們完成了文本和不同位置文本之間的一個(gè)交互,然后中間的殘差連接和正則化,也起到防止梯度消失的問題。
K、Q、V這三個(gè)字母本質(zhì)上它都是從文本的表示中得到的,每個(gè)Transformer block的一個(gè)輸入其實(shí)就是前一層的輸出,或者說是input層的一個(gè)輸出,所以這樣導(dǎo)致的一個(gè)情況就是每個(gè)Transformer block他可以完全堆疊在一起,然后形成組合,成為一個(gè)更深的一個(gè)神經(jīng)網(wǎng)絡(luò),然后也就是這個(gè)用n來表示他的一個(gè)數(shù)量,在原始的論文中,encoder端一共堆疊了6個(gè)block。
Transformer decoder block
前面介紹的是encoder端每個(gè)block的一個(gè)內(nèi)部的一個(gè)結(jié)構(gòu),對(duì)于decoder端其實(shí)大體上是一致的,但有兩個(gè)簡(jiǎn)單的修改。
第一個(gè)修改就在于,最開始它并不是一個(gè)multi-head的特性,而是一個(gè)加了一個(gè)mask的這樣一個(gè)詞,這個(gè)所謂的mask,就是通過限制得到的q和k相乘的得到的注意力分?jǐn)?shù)的上三角那部分,變成一個(gè)負(fù)無窮大,這樣我們經(jīng)過softmax之后,那些位置對(duì)應(yīng)的概率都會(huì)變?yōu)榱?,使得模型無法在當(dāng)前輸出的這個(gè)步驟的時(shí)候,看到后面的單詞,后面我們會(huì)用一個(gè)具體的例子來介紹。
另一個(gè)部分的話,就是中間加入的這個(gè)encode端r和decoder端的attention,這個(gè)結(jié)構(gòu)其實(shí)和前面提到的multi-head attention完全一致,不同的地方在于,它輸入的q向量query向量,它是來自于decoder,而k向量和v向量其實(shí)是來自于encoder最后一層的一個(gè)輸出,通過這個(gè)部分,有些類似于之前所介紹的端到端模型中的注意力機(jī)制,它是為了幫助decoder端每一步生成都可以關(guān)注和整合encoder端每個(gè)位置的信息而設(shè)計(jì)的
同樣的是,這樣的一個(gè)decoder端的Transformer block,它也可以進(jìn)行堆疊,在原論文中也是一共堆疊了6層。
現(xiàn)在我們來說一下剛才提到的mask的multi-head attebtion的一個(gè)具體的一個(gè)計(jì)算方式,
可以看到輸入還是相同的QKV三個(gè)矩陣,和之前一樣的是,通過Q和K矩陣進(jìn)行一個(gè)矩陣乘法,可以得到一個(gè)注意力分?jǐn)?shù),之后就是mask的一個(gè)操作:把左對(duì)角線的上三角部分,也就是最右上角的這個(gè)值變?yōu)橐粋€(gè)無窮大,而一個(gè)負(fù)無窮大導(dǎo)致的結(jié)果就是,我們?cè)谟?jì)算softmax之后,右上角這個(gè)值會(huì)變?yōu)?,這樣的話,通過矩陣乘法,第一個(gè)位置,即,第一行的輸出,它其實(shí)只是第一個(gè)v向量乘上了第一個(gè)值,而0會(huì)導(dǎo)致第二個(gè)v向量,他對(duì)output第一行是沒有幫助的。第二行的話其實(shí)是和原來一樣的,這個(gè)保證了我們decoder端在文本生成的時(shí)候,它是順序生成的,不會(huì)出現(xiàn)我們?cè)谏傻趇個(gè)未知的時(shí)候,參考了第i+1個(gè)位置的信息這樣一個(gè)情況,那之后我們從人類我們自己是從左到右來進(jìn)行書寫或者文本創(chuàng)作也好,這個(gè)邏輯和順序是保持一致的。
下面就是一個(gè)完整的一個(gè)Transformer block過程:
在推理階段,模型首先會(huì)生成第一個(gè)字母i,進(jìn)行拼接,然后再生成下一個(gè)am……逐個(gè)生成這樣的token,然后每個(gè)位置的輸出,都會(huì)拼接到decoder輸入后面,最后完成整個(gè)句子的一個(gè)輸出。
文章來源:http://www.zghlxwxcb.cn/news/detail-819976.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-819976.html
到了這里,關(guān)于Transformer and Pretrain Language Models3-4的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!