圖解Transformer:Attention Is All You Need

極市導(dǎo)讀
?本文詳細(xì)介紹了Transformers的理論知識(shí),幫助大家了解Transformers的實(shí)際工作原理。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿
2017年谷歌大腦在《注意力是你所需要的一切》一文中解釋了Transformer 。本文是隨著自然語(yǔ)言處理領(lǐng)域的發(fā)展而來(lái)的。許多最先進(jìn)的NLP模型都是以Transformer 為基礎(chǔ)建立的。
Transformers是人們認(rèn)為最復(fù)雜和無(wú)法理解的話(huà)題之一。在這篇文章中,我將給出關(guān)于Transformer理論知識(shí),我希望在這篇文章的結(jié)尾,你將能夠了解關(guān)于Transformer實(shí)際工作原理。
Attention Is All You Need
Transformer基本上是一種機(jī)器學(xué)習(xí)模型,它是一種神經(jīng)網(wǎng)絡(luò)的體系結(jié)構(gòu),Transformer模型體系結(jié)構(gòu)的變體,如BERT, GPT-2, GPT3等,用于建立在Transformer模型之上的幾個(gè)任務(wù)。
在論文Attention Is All You Need中,使用一個(gè)編碼器-解碼器的機(jī)器翻譯結(jié)構(gòu)對(duì)Transformer進(jìn)行了介紹和解釋與。
首先,讓我們從高級(jí)角度看一下我們的機(jī)器翻譯模型,該模型將輸入作為法語(yǔ)句子并將其轉(zhuǎn)換為英語(yǔ)。?然后一步一步,我們會(huì)更深入。

翻譯模型由一個(gè)編碼器-解碼器轉(zhuǎn)換器塊組成,其中編碼器塊接受輸入,并且解碼器塊生成輸出翻譯語(yǔ)句。

在論文中,研究人員在編碼塊中使用了6個(gè)編碼器,并且在解碼器塊中使用了相同數(shù)量的解碼器,其中所有編碼器和解碼器塊都相同。

我們的輸入是一個(gè)文本句子,但是計(jì)算機(jī)只理解數(shù)字。?因此,首先,我們對(duì)輸入句子進(jìn)行標(biāo)記化,然后將其轉(zhuǎn)換為標(biāo)記序列。?然后將序列中的每個(gè)標(biāo)記嵌入到大小為512(根據(jù)原始論文)的向量中,并將預(yù)訓(xùn)練的Word2Vec嵌入用于詞匯表。
嵌入向量的序列將作為第一個(gè)編碼器的輸入。

位置編碼:與RNN的其單詞令牌一次輸入一個(gè)到模型中不同,在注意力模型中,所有單詞都同時(shí)輸入,即所有單詞被并行輸入到編碼器模型中
單詞的位置和順序是任何語(yǔ)言的基本組成部分。?它們根據(jù)定義的語(yǔ)法,從而定義句子的實(shí)際語(yǔ)義。?因此,我們需要做一些事情來(lái)維持序列的順序,因此,為了維持序列中單詞的順序,我們需要在嵌入矩陣中添加位置編碼。

對(duì)于序列中的每個(gè)單詞,一個(gè)包含512個(gè)值的向量——每個(gè)值的值都在1到-1之間——被添加到單詞嵌入向量中,以保持序列的順序
編碼器塊
到目前為止,我們已經(jīng)討論了注意力機(jī)器翻譯模型的基本體系結(jié)構(gòu)。?現(xiàn)在,我們將更深入地研究每個(gè)編碼器和解碼器模塊,并了解這些模塊內(nèi)部發(fā)生了什么,從而使該模型如此精確。

一個(gè)簡(jiǎn)單的編碼器由兩部分組成:
自我注意力:這種自我注意來(lái)自原論文,而這實(shí)際上在Transformer中起著非常重要的作用。 前饋神經(jīng)網(wǎng)絡(luò):就像一個(gè)簡(jiǎn)單的人工神經(jīng)網(wǎng)絡(luò)。?自我注意的輸出作為輸入傳遞到前饋網(wǎng)絡(luò)。
現(xiàn)在,我們將詳細(xì)了解Transformer的最重要組件。
Self-Attention(自注意力)
自注意力用于將句子中的每個(gè)單詞與句子中的每個(gè)其他單詞相關(guān)聯(lián),以便每個(gè)單詞可以與其他每個(gè)單詞相關(guān)聯(lián),并且將為句子中的每個(gè)單詞產(chǎn)生512個(gè)維度的輸出,該輸出將關(guān)聯(lián)一句話(huà)中的每個(gè)單詞 。
要計(jì)算自我注意力,首先,我們需要根據(jù)其嵌入向量為輸入句子中的每個(gè)單詞創(chuàng)建3個(gè)向量,分別稱(chēng)為查詢(xún),鍵和值。?這些向量通常較小。?在變換器模型中,這三個(gè)向量是64維向量。
每個(gè)單詞的查詢(xún)、鍵和值向量計(jì)算如下:

我們初始化3個(gè)權(quán)重矩陣(隨機(jī)),將其命名為大?。?12,64)的Wq,Wk和Wv,其值將在訓(xùn)練時(shí)更新。
通過(guò)在各個(gè)權(quán)重矩陣和嵌入矢量之間進(jìn)行矩陣乘法來(lái)計(jì)算查詢(xún),鍵和值矢量。

請(qǐng)注意,這些新向量的維數(shù)小于嵌入向量的維數(shù)。?它們的維數(shù)為64,而嵌入和編碼器輸入/輸出矢量的維數(shù)為512。
您可能會(huì)想到與查詢(xún),鍵和值有關(guān)的問(wèn)題,以及這些向量實(shí)際上是什么,以及為什么要初始化它們。?到本文章結(jié)尾,您將獲得所有答案。
我們獲得了序列中每個(gè)單詞的查詢(xún),鍵和值,現(xiàn)在我們將使用查詢(xún),鍵和值來(lái)計(jì)算每個(gè)單詞與句子中的每個(gè)其他單詞有多少關(guān)聯(lián)的分?jǐn)?shù)。
我們將通過(guò)在一個(gè)單詞中進(jìn)行所有操作來(lái)進(jìn)一步理解這一點(diǎn),并且對(duì)句子中的所有單詞都將執(zhí)行相同的操作。

計(jì)算自注意力的第一步是計(jì)算句子中所有單詞的分?jǐn)?shù)。?我們通過(guò)單詞查詢(xún)(q1)與句子中每個(gè)單詞的關(guān)鍵字(k)之間的點(diǎn)積來(lái)計(jì)算得分(一個(gè)單詞與每個(gè)單詞在順序上有多少關(guān)系)。
第二步是將分?jǐn)?shù)除以8(關(guān)鍵向量維數(shù)的平方根)。?這導(dǎo)致具有更穩(wěn)定的梯度。
第三步,計(jì)算得分的softmax,并根據(jù)softmax的定義將所有值加起來(lái)為1。

這個(gè)softmax分?jǐn)?shù)決定了每個(gè)單詞在這個(gè)位置的表達(dá)量。
第四步和第五步是將softmax的值與每個(gè)單詞的值向量(v)相乘,相加得到一個(gè)64維的向量。

z1 = 0.86*v1 + 012*v2 + 0.06*v3
對(duì)單個(gè)單詞的這種自我關(guān)注已從句子中所有單詞中獲取了所有相關(guān)信息。
我之前解釋的所有步驟都是為了單個(gè)單詞的自注意,將重復(fù)相同的步驟來(lái)計(jì)算句子中所有單詞的自注意。
為了使計(jì)算更快,計(jì)算效率更高,所有計(jì)算都在矩陣中執(zhí)行。

Z矩陣形狀=(句子長(zhǎng)度,V的維數(shù))
多頭注意力
上面,我們討論了單頭注意,即,僅對(duì)一個(gè)權(quán)重矩陣(Wq,Wk和Wv)進(jìn)行隨機(jī)初始化,以生成用于查詢(xún),鍵和值的單個(gè)矩陣,而在轉(zhuǎn)換器模型中,則使用多頭注意 即,隨機(jī)初始化多個(gè)權(quán)重矩陣以生成多個(gè)查詢(xún),鍵和值矩陣來(lái)代替一個(gè)權(quán)重矩陣(Wq,Wk和Wv)。?現(xiàn)在,對(duì)于多個(gè)查詢(xún),鍵和值矩陣,上面相同的操作將重復(fù)多次以產(chǎn)生多個(gè)最終Z矩陣。
在Transformer模型中,使用8多頭注意。

對(duì)于每個(gè)查詢(xún),鍵和值矩陣,將獲得一個(gè)Z矩陣(注意力頭),最后總共將獲得8個(gè)注意頭。

然后將所有的注意力矩陣連接起來(lái),并與另一個(gè)權(quán)重矩陣相乘,得到最終的Z矩陣。

現(xiàn)在將自我注意的輸出即Z矩陣反饋給前饋神經(jīng)網(wǎng)絡(luò)。

前饋神經(jīng)網(wǎng)絡(luò)輸出形狀=(句子長(zhǎng)度,512)
前饋神經(jīng)網(wǎng)絡(luò)的輸出作為輸入傳遞給另一個(gè)編碼器。
因此,所有的編碼器和解碼器都是相同的,它們的工作原理也是相同的。
殘差連接
我們需要提到的編碼器架構(gòu)中的一個(gè)細(xì)節(jié)是,每個(gè)編碼器中的每個(gè)子層(自我注意、前饋神經(jīng)網(wǎng)絡(luò))周?chē)加幸粋€(gè)殘差連接(這個(gè)殘差連接與Resnet殘差連接相同),然后是標(biāo)準(zhǔn)化步驟。

到目前為止,我們已經(jīng)了解了Transformer的注意機(jī)制是如何工作的。我希望你們能理解這些關(guān)注背后的含義。
許多SOTA模型如BERT和BERT的變體都是建立在編碼器Transformer的基礎(chǔ)上,用于預(yù)測(cè)各種各樣的任務(wù)。
解碼器
最后,在將句子傳遞到編碼器轉(zhuǎn)換器時(shí),我們將得到每個(gè)單詞的向量(形狀矩陣(句子長(zhǎng)度512)),現(xiàn)在這個(gè)矩陣將作為解碼器端編碼器-解碼器塊的輸入。

解碼器的輸入將向右移一個(gè)位置,并將單詞令牌的開(kāi)頭用作第一個(gè)字符令牌,并將以嵌入方式編碼的單詞的目標(biāo)序列與位置編碼一起傳遞。
解碼器的自注意力模塊會(huì)生成目標(biāo)序列的關(guān)注向量,以找出目標(biāo)序列中每個(gè)單詞與序列中其他單詞的相關(guān)程度。在解碼器中,自注意層只允許關(guān)注輸出序列中較早的位置。這是通過(guò)在自注意力計(jì)算中的softmax步驟之前屏蔽將來(lái)的位置(將它們?cè)O(shè)置為-inf)來(lái)完成的。這確保了在生成目標(biāo)序列的注意力向量時(shí),我們可以使用輸入序列中的所有單詞,但只能使用目標(biāo)序列中的前一個(gè)單詞。
解碼器具有一個(gè)如下所示的附加多頭注意塊,該塊從輸入序列和目標(biāo)序列中獲取嵌入信息,以確定輸入序列中的每個(gè)單詞與目標(biāo)序列中的每個(gè)單詞如何相關(guān)。

第二個(gè)注意層的輸出被發(fā)送到FFN層,F(xiàn)FN層與編碼器塊的FFN層類(lèi)似,功能類(lèi)似。
最后,我們有一個(gè)線(xiàn)性層,也就是另一個(gè)FFN和一個(gè)softmax函數(shù),來(lái)得到所有下一個(gè)單詞的概率分布,也就是下一個(gè)預(yù)測(cè)的單詞概率得分最高。

此過(guò)程將執(zhí)行多次,直到為序列生成句子標(biāo)記的結(jié)尾。
我希望你能對(duì)Transformer的工作原理有個(gè)直觀的了解。如果你有不明白的地方,那就再讀一遍以下的文章,我建議你試著把矩陣的形狀形象化。
http://jalammar.github.io/illustrated-transformer/
推薦閱讀

