編者按:前一段時(shí)間谷歌推出的BERT模型在11項(xiàng)NLP任務(wù)中奪得SOTA結(jié)果,引爆了整個(gè)NLP界。而BERT取得成功的一個(gè)關(guān)鍵因素是Transformer的強(qiáng)大作用。谷歌的Transformer模型最早是用于機(jī)器翻譯任務(wù),當(dāng)時(shí)達(dá)到了SOTA效果。Transformer改進(jìn)了RNN最被人詬病的訓(xùn)練慢的缺點(diǎn),利用self-attention機(jī)制實(shí)現(xiàn)快速并行。并且Transformer可以增加到非常深的深度,充分發(fā)掘DNN模型的特性,提升模型準(zhǔn)確率。在本文中,我們將研究Transformer模型,把它掰開揉碎,理解它的工作原理。
以下是正文,請(qǐng)欣賞:
Transformer由論文《Attention is All You Need》提出,現(xiàn)在是谷歌云TPU推薦的參考模型。論文相關(guān)的Tensorflow的代碼可以從GitHub獲取,其作為Tensor2Tensor包的一部分。哈佛的NLP團(tuán)隊(duì)也實(shí)現(xiàn)了一個(gè)基于PyTorch的版本,并注釋該論文。
在本文中,我們將試圖把模型簡(jiǎn)化一點(diǎn),并逐一介紹里面的核心概念,希望讓普通讀者也能輕易理解。
Attention is All You Need:
https://arxiv.org/abs/1706.03762
從宏觀的視角開始
首先將這個(gè)模型看成是一個(gè)黑箱操作。在機(jī)器翻譯中,就是輸入一種語(yǔ)言,輸出另一種語(yǔ)言。
那么拆開這個(gè)黑箱,我們可以看到它是由編碼組件、解碼組件和它們之間的連接組成。
編碼組件部分由一堆編碼器(encoder)構(gòu)成(論文中是將6個(gè)編碼器疊在一起——數(shù)字6沒(méi)有什么神奇之處,你也可以嘗試其他數(shù)字)。解碼組件部分也是由相同數(shù)量(與編碼器對(duì)應(yīng))的解碼器(decoder)組成的。
所有的編碼器在結(jié)構(gòu)上都是相同的,但它們沒(méi)有共享參數(shù)。每個(gè)解碼器都可以分解成兩個(gè)子層。
從編碼器輸入的句子首先會(huì)經(jīng)過(guò)一個(gè)自注意力(self-attention)層,這層幫助編碼器在對(duì)每個(gè)單詞編碼時(shí)關(guān)注輸入句子的其他單詞。我們將在稍后的文章中更深入地研究自注意力。
自注意力層的輸出會(huì)傳遞到前饋(feed-forward)神經(jīng)網(wǎng)絡(luò)中。每個(gè)位置的單詞對(duì)應(yīng)的前饋神經(jīng)網(wǎng)絡(luò)都完全一樣(譯注:另一種解讀就是一層窗口為一個(gè)單詞的一維卷積神經(jīng)網(wǎng)絡(luò))。
解碼器中也有編碼器的自注意力(self-attention)層和前饋(feed-forward)層。除此之外,這兩個(gè)層之間還有一個(gè)注意力層,用來(lái)關(guān)注輸入句子的相關(guān)部分(和seq2seq模型的注意力作用相似)。
將張量引入圖景
我們已經(jīng)了解了模型的主要部分,接下來(lái)我們看一下各種向量或張量(譯注:張量概念是矢量概念的推廣,可以簡(jiǎn)單理解矢量是一階張量、矩陣是二階張量。)是怎樣在模型的不同部分中,將輸入轉(zhuǎn)化為輸出的。
像大部分NLP應(yīng)用一樣,我們首先將每個(gè)輸入單詞通過(guò)詞嵌入算法轉(zhuǎn)換為詞向量。
每個(gè)單詞都被嵌入為512維的向量,我們用這些簡(jiǎn)單的方框來(lái)表示這些向量。
詞嵌入過(guò)程只發(fā)生在最底層的編碼器中。所有的編碼器都有一個(gè)相同的特點(diǎn),即它們接收一個(gè)向量列表,列表中的每個(gè)向量大小為512維。在底層(最開始)編碼器中它就是詞向量,但是在其他編碼器中,它就是下一層編碼器的輸出(也是一個(gè)向量列表)。向量列表大小是我們可以設(shè)置的超參數(shù)——一般是我們訓(xùn)練集中最長(zhǎng)句子的長(zhǎng)度。
將輸入序列進(jìn)行詞嵌入之后,每個(gè)單詞都會(huì)流經(jīng)編碼器中的兩個(gè)子層。
接下來(lái)我們看看Transformer的一個(gè)核心特性,在這里輸入序列中每個(gè)位置的單詞都有自己獨(dú)特的路徑流入編碼器。在自注意力層中,這些路徑之間存在依賴關(guān)系。而前饋(feed-forward)層沒(méi)有這些依賴關(guān)系。因此在前饋(feed-forward)層時(shí)可以并行執(zhí)行各種路徑。
然后我們將以一個(gè)更短的句子為例,看看編碼器的每個(gè)子層中發(fā)生了什么。
現(xiàn)在我們開始“編碼”
如上述已經(jīng)提到的,一個(gè)編碼器接收向量列表作為輸入,接著將向量列表中的向量傳遞到自注意力層進(jìn)行處理,然后傳遞到前饋神經(jīng)網(wǎng)絡(luò)層中,將輸出結(jié)果傳遞到下一個(gè)編碼器中。
輸入序列的每個(gè)單詞都經(jīng)過(guò)自編碼過(guò)程。然后,他們各自通過(guò)前向傳播神經(jīng)網(wǎng)絡(luò)——完全相同的網(wǎng)絡(luò),而每個(gè)向量都分別通過(guò)它。
從宏觀視角看自注意力機(jī)制
不要被我用自注意力這個(gè)詞弄迷糊了,好像每個(gè)人都應(yīng)該熟悉這個(gè)概念。其實(shí)我之也沒(méi)有見過(guò)這個(gè)概念,直到讀到Attention is All You Need 這篇論文時(shí)才恍然大悟。讓我們精煉一下它的工作原理。
例如,下列句子是我們想要翻譯的輸入句子:
The animal didn't cross the street because it was too tired
這個(gè)“it”在這個(gè)句子是指什么呢?它指的是street還是這個(gè)animal呢?這對(duì)于人類來(lái)說(shuō)是一個(gè)簡(jiǎn)單的問(wèn)題,但是對(duì)于算法則不是。
當(dāng)模型處理這個(gè)單詞“it”的時(shí)候,自注意力機(jī)制會(huì)允許“it”與“animal”建立聯(lián)系。
隨著模型處理輸入序列的每個(gè)單詞,自注意力會(huì)關(guān)注整個(gè)輸入序列的所有單詞,幫助模型對(duì)本單詞更好地進(jìn)行編碼。
如果你熟悉RNN(循環(huán)神經(jīng)網(wǎng)絡(luò)),回憶一下它是如何維持隱藏層的。RNN會(huì)將它已經(jīng)處理過(guò)的前面的所有單詞/向量的表示與它正在處理的當(dāng)前單詞/向量結(jié)合起來(lái)。而自注意力機(jī)制會(huì)將所有相關(guān)單詞的理解融入到我們正在處理的單詞中。
當(dāng)我們?cè)诰幋a器#5(棧中最上層編碼器)中編碼“it”這個(gè)單詞的時(shí),注意力機(jī)制的部分會(huì)去關(guān)注“The Animal”,將它的表示的一部分編入“it”的編碼中。
請(qǐng)務(wù)必檢查Tensor2Tensor notebook,在里面你可以下載一個(gè)Transformer模型,并用交互式可視化的方式來(lái)檢驗(yàn)。
從微觀視角看自注意力機(jī)制
首先我們了解一下如何使用向量來(lái)計(jì)算自注意力,然后來(lái)看它實(shí)怎樣用矩陣來(lái)實(shí)現(xiàn)。
計(jì)算自注意力的第一步就是從每個(gè)編碼器的輸入向量(每個(gè)單詞的詞向量)中生成三個(gè)向量。也就是說(shuō)對(duì)于每個(gè)單詞,我們創(chuàng)造一個(gè)查詢向量、一個(gè)鍵向量和一個(gè)值向量。這三個(gè)向量是通過(guò)詞嵌入與三個(gè)權(quán)重矩陣后相乘創(chuàng)建的。
可以發(fā)現(xiàn)這些新向量在維度上比詞嵌入向量更低。他們的維度是64,而詞嵌入和編碼器的輸入/輸出向量的維度是512. 但實(shí)際上不強(qiáng)求維度更小,這只是一種基于架構(gòu)上的選擇,它可以使多頭注意力(multiheaded attention)的大部分計(jì)算保持不變。
X1與WQ權(quán)重矩陣相乘得到q1, 就是與這個(gè)單詞相關(guān)的查詢向量。最終使得輸入序列的每個(gè)單詞的創(chuàng)建一個(gè)查詢向量、一個(gè)鍵向量和一個(gè)值向量。
什么是查詢向量、鍵向量和值向量向量?
它們都是有助于計(jì)算和理解注意力機(jī)制的抽象概念。請(qǐng)繼續(xù)閱讀下文的內(nèi)容,你就會(huì)知道每個(gè)向量在計(jì)算注意力機(jī)制中到底扮演什么樣的角色。
計(jì)算自注意力的第二步是計(jì)算得分。假設(shè)我們?cè)跒檫@個(gè)例子中的第一個(gè)詞“Thinking”計(jì)算自注意力向量,我們需要拿輸入句子中的每個(gè)單詞對(duì)“Thinking”打分。這些分?jǐn)?shù)決定了在編碼單詞“Thinking”的過(guò)程中有多重視句子的其它部分。
這些分?jǐn)?shù)是通過(guò)打分單詞(所有輸入句子的單詞)的鍵向量與“Thinking”的查詢向量相點(diǎn)積來(lái)計(jì)算的。所以如果我們是處理位置最靠前的詞的自注意力的話,第一個(gè)分?jǐn)?shù)是q1和k1的點(diǎn)積,第二個(gè)分?jǐn)?shù)是q1和k2的點(diǎn)積。
第三步和第四步是將分?jǐn)?shù)除以8(8是論文中使用的鍵向量的維數(shù)64的平方根,這會(huì)讓梯度更穩(wěn)定。這里也可以使用其它值,8只是默認(rèn)值),然后通過(guò)softmax傳遞結(jié)果。softmax的作用是使所有單詞的分?jǐn)?shù)歸一化,得到的分?jǐn)?shù)都是正值且和為1。
這個(gè)softmax分?jǐn)?shù)決定了每個(gè)單詞對(duì)編碼當(dāng)下位置(“Thinking”)的貢獻(xiàn)。顯然,已經(jīng)在這個(gè)位置上的單詞將獲得最高的softmax分?jǐn)?shù),但有時(shí)關(guān)注另一個(gè)與當(dāng)前單詞相關(guān)的單詞也會(huì)有幫助。
第五步是將每個(gè)值向量乘以softmax分?jǐn)?shù)(這是為了準(zhǔn)備之后將它們求和)。這里的直覺(jué)是希望關(guān)注語(yǔ)義上相關(guān)的單詞,并弱化不相關(guān)的單詞(例如,讓它們乘以0.001這樣的小數(shù))。
第六步是對(duì)加權(quán)值向量求和(譯注:自注意力的另一種解釋就是在編碼某個(gè)單詞時(shí),就是將所有單詞的表示(值向量)進(jìn)行加權(quán)求和,而權(quán)重是通過(guò)該詞的表示(鍵向量)與被編碼詞表示(查詢向量)的點(diǎn)積并通過(guò)softmax得到。),然后即得到自注意力層在該位置的輸出(在我們的例子中是對(duì)于第一個(gè)單詞)。
這樣自自注意力的計(jì)算就完成了。得到的向量就可以傳給前饋神經(jīng)網(wǎng)絡(luò)。然而實(shí)際中,這些計(jì)算是以矩陣形式完成的,以便算得更快。那我們接下來(lái)就看看如何用矩陣實(shí)現(xiàn)的。
通過(guò)矩陣運(yùn)算實(shí)現(xiàn)自注意力機(jī)制
第一步是計(jì)算查詢矩陣、鍵矩陣和值矩陣。為此,我們將將輸入句子的詞嵌入裝進(jìn)矩陣X中,將其乘以我們訓(xùn)練的權(quán)重矩陣(WQ,WK,WV)。
x矩陣中的每一行對(duì)應(yīng)于輸入句子中的一個(gè)單詞。我們?cè)俅慰吹皆~嵌入向量 (512,或圖中的4個(gè)格子)和q/k/v向量(64,或圖中的3個(gè)格子)的大小差異。
最后,由于我們處理的是矩陣,我們可以將步驟2到步驟6合并為一個(gè)公式來(lái)計(jì)算自注意力層的輸出。
自注意力的矩陣運(yùn)算形式
“大戰(zhàn)多頭怪”
通過(guò)增加一種叫做“多頭”注意力(“multi-headed” attention)的機(jī)制,論文進(jìn)一步完善了自注意力層,并在兩方面提高了注意力層的性能:
1.它擴(kuò)展了模型專注于不同位置的能力。在上面的例子中,雖然每個(gè)編碼都在z1中有或多或少的體現(xiàn),但是它可能被實(shí)際的單詞本身所支配。如果我們翻譯一個(gè)句子,比如“The animal didn’t cross the street because it was too tired”,我們會(huì)想知道“it”指的是哪個(gè)詞,這時(shí)模型的“多頭”注意機(jī)制會(huì)起到作用。
2.它給出了注意力層的多個(gè)“表示子空間”(representation subspaces)。接下來(lái)我們將看到,對(duì)于“多頭”注意機(jī)制,我們有多個(gè)查詢/鍵/值權(quán)重矩陣集(Transformer使用八個(gè)注意力頭,因此我們對(duì)于每個(gè)編碼器/解碼器有八個(gè)矩陣集合)。這些集合中的每一個(gè)都是隨機(jī)初始化的,在訓(xùn)練之后,每個(gè)集合都被用來(lái)將輸入詞嵌入(或來(lái)自較低編碼器/解碼器的向量)投影到不同的表示子空間中。
在“多頭”注意機(jī)制下,我們?yōu)槊總€(gè)頭保持獨(dú)立的查詢/鍵/值權(quán)重矩陣,從而產(chǎn)生不同的查詢/鍵/值矩陣。和之前一樣,我們拿X乘以WQ/WK/WV矩陣來(lái)產(chǎn)生查詢/鍵/值矩陣。
如果我們做與上述相同的自注意力計(jì)算,只需八次不同的權(quán)重矩陣運(yùn)算,我們就會(huì)得到八個(gè)不同的Z矩陣。
這給我們帶來(lái)了一點(diǎn)挑戰(zhàn)。前饋層不需要8個(gè)矩陣,它只需要一個(gè)矩陣(由每一個(gè)單詞的表示向量組成)。所以我們需要一種方法把這八個(gè)矩陣壓縮成一個(gè)矩陣。那該怎么做?其實(shí)可以直接把這些矩陣拼接在一起,然后用一個(gè)附加的權(quán)重矩陣WO與它們相乘。
這幾乎就是多頭自注意力的全部。這確實(shí)有好多矩陣,我們?cè)囍阉鼈兗性谝粋€(gè)圖片中,這樣可以一眼看清。
既然我們已經(jīng)摸到了注意力機(jī)制的這么多“頭”,那么讓我們重溫之前的例子,看看我們?cè)诶渲芯幋a“it”一詞時(shí),不同的注意力“頭”集中在哪里:
當(dāng)我們編碼“it”一詞時(shí),一個(gè)注意力頭集中在“animal”上,而另一個(gè)則集中在“tired”上,從某種意義上說(shuō),模型對(duì)“it”一詞的表達(dá)在某種程度上是“animal”和“tired”的代表。
然而,如果我們把所有的attention都加到圖示里,事情就更難解釋了:
使用位置編碼表示序列的順序
到目前為止,我們對(duì)模型的描述缺少了一種理解輸入單詞順序的方法。
為了解決這個(gè)問(wèn)題,Transformer為每個(gè)輸入的詞嵌入添加了一個(gè)向量。這些向量遵循模型學(xué)習(xí)到的特定模式,這有助于確定每個(gè)單詞的位置,或序列中不同單詞之間的距離。這里的直覺(jué)是,將位置向量添加到詞嵌入中使得它們?cè)诮酉聛?lái)的運(yùn)算中,能夠更好地表達(dá)的詞與詞之間的距離。
為了讓模型理解單詞的順序,我們添加了位置編碼向量,這些向量的值遵循特定的模式。
如果我們假設(shè)詞嵌入的維數(shù)為4,則實(shí)際的位置編碼如下:
尺寸為4的迷你詞嵌入位置編碼實(shí)例
這個(gè)模式會(huì)是什么樣子?
在下圖中,每一行對(duì)應(yīng)一個(gè)詞向量的位置編碼,所以第一行對(duì)應(yīng)著輸入序列的第一個(gè)詞。每行包含512個(gè)值,每個(gè)值介于1和-1之間。我們已經(jīng)對(duì)它們進(jìn)行了顏色編碼,所以圖案是可見的。
20字(行)的位置編碼實(shí)例,詞嵌入大小為512(列)。你可以看到它從中間分裂成兩半。這是因?yàn)樽蟀氩糠值闹涤梢粋€(gè)函數(shù)(使用正弦)生成,而右半部分由另一個(gè)函數(shù)(使用余弦)生成。然后將它們拼在一起而得到每一個(gè)位置編碼向量。
原始論文里描述了位置編碼的公式(第3.5節(jié))。你可以在get_timing_signal_1d()中看到生成位置編碼的代碼。這不是唯一可能的位置編碼方法。然而,它的優(yōu)點(diǎn)是能夠擴(kuò)展到未知的序列長(zhǎng)度(例如,當(dāng)我們訓(xùn)練出的模型需要翻譯遠(yuǎn)比訓(xùn)練集里的句子更長(zhǎng)的句子時(shí))。
殘差模塊
在繼續(xù)進(jìn)行下去之前,我們需要提到一個(gè)編碼器架構(gòu)中的細(xì)節(jié):在每個(gè)編碼器中的每個(gè)子層(自注意力、前饋網(wǎng)絡(luò))的周圍都有一個(gè)殘差連接,并且都跟隨著一個(gè)“層-歸一化”步驟。
層-歸一化步驟:
https://arxiv.org/abs/1607.06450
如果我們?nèi)タ梢暬@些向量以及這個(gè)和自注意力相關(guān)聯(lián)的層-歸一化操作,那么看起來(lái)就像下面這張圖描述一樣:
解碼器的子層也是這樣樣的。如果我們想象一個(gè)2 層編碼-解碼結(jié)構(gòu)的transformer,它看起來(lái)會(huì)像下面這張圖一樣:
解碼組件
既然我們已經(jīng)談到了大部分編碼器的概念,那么我們基本上也就知道解碼器是如何工作的了。但最好還是看看解碼器的細(xì)節(jié)。
編碼器通過(guò)處理輸入序列開啟工作。頂端編碼器的輸出之后會(huì)變轉(zhuǎn)化為一個(gè)包含向量K(鍵向量)和V(值向量)的注意力向量集 。這些向量將被每個(gè)解碼器用于自身的“編碼-解碼注意力層”,而這些層可以幫助解碼器關(guān)注輸入序列哪些位置合適:
在完成編碼階段后,則開始解碼階段。解碼階段的每個(gè)步驟都會(huì)輸出一個(gè)輸出序列(在這個(gè)例子里,是英語(yǔ)翻譯的句子)的元素
接下來(lái)的步驟重復(fù)了這個(gè)過(guò)程,直到到達(dá)一個(gè)特殊的終止符號(hào),它表示transformer的解碼器已經(jīng)完成了它的輸出。每個(gè)步驟的輸出在下一個(gè)時(shí)間步被提供給底端解碼器,并且就像編碼器之前做的那樣,這些解碼器會(huì)輸出它們的解碼結(jié)果 。另外,就像我們對(duì)編碼器的輸入所做的那樣,我們會(huì)嵌入并添加位置編碼給那些解碼器,來(lái)表示每個(gè)單詞的位置。
而那些解碼器中的自注意力層表現(xiàn)的模式與編碼器不同:在解碼器中,自注意力層只被允許處理輸出序列中更靠前的那些位置。在softmax步驟前,它會(huì)把后面的位置給隱去(把它們?cè)O(shè)為-inf)。
這個(gè)“編碼-解碼注意力層”工作方式基本就像多頭自注意力層一樣,只不過(guò)它是通過(guò)在它下面的層來(lái)創(chuàng)造查詢矩陣,并且從編碼器的輸出中取得鍵/值矩陣。
最終的線性變換和Softmax層
解碼組件最后會(huì)輸出一個(gè)實(shí)數(shù)向量。我們?nèi)绾伟迅↑c(diǎn)數(shù)變成一個(gè)單詞?這便是線性變換層要做的工作,它之后就是Softmax層。
線性變換層是一個(gè)簡(jiǎn)單的全連接神經(jīng)網(wǎng)絡(luò),它可以把解碼組件產(chǎn)生的向量投射到一個(gè)比它大得多的、被稱作對(duì)數(shù)幾率(logits)的向量里。
不妨假設(shè)我們的模型從訓(xùn)練集中學(xué)習(xí)一萬(wàn)個(gè)不同的英語(yǔ)單詞(我們模型的“輸出詞表”)。因此對(duì)數(shù)幾率向量為一萬(wàn)個(gè)單元格長(zhǎng)度的向量——每個(gè)單元格對(duì)應(yīng)某一個(gè)單詞的分?jǐn)?shù)。
接下來(lái)的Softmax 層便會(huì)把那些分?jǐn)?shù)變成概率(都為正數(shù)、上限1.0)。概率最高的單元格被選中,并且它對(duì)應(yīng)的單詞被作為這個(gè)時(shí)間步的輸出。
這張圖片從底部以解碼器組件產(chǎn)生的輸出向量開始。之后它會(huì)轉(zhuǎn)化出一個(gè)輸出單詞。
訓(xùn)練部分總結(jié)
既然我們已經(jīng)過(guò)了一遍完整的transformer的前向傳播過(guò)程,那我們就可以直觀感受一下它的訓(xùn)練過(guò)程。
在訓(xùn)練過(guò)程中,一個(gè)未經(jīng)訓(xùn)練的模型會(huì)通過(guò)一個(gè)完全一樣的前向傳播。但因?yàn)槲覀冇糜袠?biāo)記的訓(xùn)練集來(lái)訓(xùn)練它,所以我們可以用它的輸出去與真實(shí)的輸出做比較。
為了把這個(gè)流程可視化,不妨假設(shè)我們的輸出詞匯僅僅包含六個(gè)單詞:“a”, “am”, “i”, “thanks”, “student”以及 “
我們模型的輸出詞表在我們訓(xùn)練之前的預(yù)處理流程中就被設(shè)定好。
一旦我們定義了我們的輸出詞表,我們可以使用一個(gè)相同寬度的向量來(lái)表示我們?cè)~匯表中的每一個(gè)單詞。這也被認(rèn)為是一個(gè)one-hot 編碼。所以,我們可以用下面這個(gè)向量來(lái)表示單詞“am”:
例子:對(duì)我們輸出詞表的one-hot 編碼
接下來(lái)我們討論模型的損失函數(shù)——這是我們用來(lái)在訓(xùn)練過(guò)程中優(yōu)化的標(biāo)準(zhǔn)。通過(guò)它可以訓(xùn)練得到一個(gè)結(jié)果盡量準(zhǔn)確的模型。
損失函數(shù)
比如說(shuō)我們正在訓(xùn)練模型,現(xiàn)在是第一步,一個(gè)簡(jiǎn)單的例子——把“merci”翻譯為“thanks”。
這意味著我們想要一個(gè)表示單詞“thanks”概率分布的輸出。但是因?yàn)檫@個(gè)模型還沒(méi)被訓(xùn)練好,所以不太可能現(xiàn)在就出現(xiàn)這個(gè)結(jié)果。
因?yàn)槟P偷膮?shù)(權(quán)重)都被隨機(jī)的生成,(未經(jīng)訓(xùn)練的)模型產(chǎn)生的概率分布在每個(gè)單元格/單詞里都賦予了隨機(jī)的數(shù)值。我們可以用真實(shí)的輸出來(lái)比較它,然后用反向傳播算法來(lái)略微調(diào)整所有模型的權(quán)重,生成更接近結(jié)果的輸出。
你會(huì)如何比較兩個(gè)概率分布呢?我們可以簡(jiǎn)單地用其中一個(gè)減去另一個(gè)。更多細(xì)節(jié)請(qǐng)參考交叉熵和KL散度。
交叉熵:
https://colah.github.io/posts/2015-09-Visual-Information/
KL散度:
https://www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained
但注意到這是一個(gè)過(guò)于簡(jiǎn)化的例子。更現(xiàn)實(shí)的情況是處理一個(gè)句子。例如,輸入“je suis étudiant”并期望輸出是“i am a student”。那我們就希望我們的模型能夠成功地在這些情況下輸出概率分布:
每個(gè)概率分布被一個(gè)以詞表大?。ㄎ覀兊睦永锸?,但現(xiàn)實(shí)情況通常是3000或10000)為寬度的向量所代表。
第一個(gè)概率分布在與“i”關(guān)聯(lián)的單元格有最高的概率
第二個(gè)概率分布在與“am”關(guān)聯(lián)的單元格有最高的概率
以此類推,第五個(gè)輸出的分布表示“
依據(jù)例子訓(xùn)練模型得到的目標(biāo)概率分布。
在一個(gè)足夠大的數(shù)據(jù)集上充分訓(xùn)練后,我們希望模型輸出的概率分布看起來(lái)像這個(gè)樣子:
我們期望訓(xùn)練過(guò)后,模型會(huì)輸出正確的翻譯。當(dāng)然如果這段話完全來(lái)自訓(xùn)練集,它并不是一個(gè)很好的評(píng)估指標(biāo)(參考:交叉驗(yàn)證,鏈接https://www.youtube.com/watch?v=TIgfjmp-4BA)。注意到每個(gè)位置(詞)都得到了一點(diǎn)概率,即使它不太可能成為那個(gè)時(shí)間步的輸出——這是softmax的一個(gè)很有用的性質(zhì),它可以幫助模型訓(xùn)練。
因?yàn)檫@個(gè)模型一次只產(chǎn)生一個(gè)輸出,不妨假設(shè)這個(gè)模型只選擇概率最高的單詞,并把剩下的詞拋棄。這是其中一種方法(叫貪心解碼)。另一個(gè)完成這個(gè)任務(wù)的方法是留住概率最靠高的兩個(gè)單詞(例如I和a),那么在下一步里,跑模型兩次:其中一次假設(shè)第一個(gè)位置輸出是單詞“I”,而另一次假設(shè)第一個(gè)位置輸出是單詞“me”,并且無(wú)論哪個(gè)版本產(chǎn)生更少的誤差,都保留概率最高的兩個(gè)翻譯結(jié)果。然后我們?yōu)榈诙偷谌齻€(gè)位置重復(fù)這一步驟。這個(gè)方法被稱作集束搜索(beam search)。在我們的例子中,集束寬度是2(因?yàn)楸A袅?個(gè)集束的結(jié)果,如第一和第二個(gè)位置),并且最終也返回兩個(gè)集束的結(jié)果(top_beams也是2)。這些都是可以提前設(shè)定的參數(shù)。
-
谷歌
+關(guān)注
關(guān)注
27文章
6179瀏覽量
105737 -
機(jī)器翻譯
+關(guān)注
關(guān)注
0文章
139瀏覽量
14919 -
pytorch
+關(guān)注
關(guān)注
2文章
808瀏覽量
13307
原文標(biāo)題:BERT大火卻不懂Transformer?讀這一篇就夠了
文章出處:【微信號(hào):BigDataDigest,微信公眾號(hào):大數(shù)據(jù)文摘】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論