解碼器與編碼器在細(xì)節(jié)上有差異仗哨。
解碼器的Attention
decoder第一級(jí)自注意力的key, query, value均來(lái)自前一層decoder的輸出褐着,但加入了Mask操作,即我們只能attend到前面已經(jīng)翻譯過(guò)的輸出的詞語(yǔ)鹿响,因?yàn)榉g過(guò)程我們當(dāng)前還并不知道下一個(gè)輸出詞語(yǔ),這是我們之后才會(huì)推測(cè)到的。
而decoder第二級(jí)注意力也被稱(chēng)作encoder-decoder attention layer份招,即它的query來(lái)自于之前一級(jí)的decoder層的輸出,但其key和value來(lái)自于encoder的輸出狞甚,這使得decoder的每一個(gè)位置都可以attend到輸入序列的每一個(gè)位置锁摔。
總結(jié)一下,k和v的來(lái)源總是相同的哼审,q在encoder及decoder自注意力層中與k,v來(lái)源相同谐腰,在encoder-decoder attention layer中與k,v來(lái)源不同孕豹。
編碼器與解碼器的連接:
編碼器通過(guò)處理輸入序列開(kāi)啟工作。頂端編碼器的輸出之后會(huì)變轉(zhuǎn)化為一個(gè)包含向量K(鍵向量)和V(值向量)的注意力向量集 十气。這些向量將被每個(gè)解碼器用于自身的“編碼-解碼注意力層”励背,而這些層可以幫助解碼器關(guān)注輸入序列哪些位置合適。
解碼器解碼:
在完成編碼階段后砸西,則開(kāi)始解碼階段叶眉。解碼階段的每個(gè)時(shí)間步都會(huì)輸出一個(gè)輸出序列的元素(在這個(gè)例子里,是英語(yǔ)翻譯的句子)
接下來(lái)的每個(gè)時(shí)間步重復(fù)了這個(gè)過(guò)程芹枷,直到到達(dá)一個(gè)特殊的終止符號(hào)衅疙,它表示transformer的解碼器已經(jīng)完成了它的輸出。每個(gè)時(shí)間步的輸出在下一個(gè)時(shí)間步被提供給底端解碼器鸳慈,并且就像編碼器之前做的那樣饱溢,這些解碼器會(huì)輸出它們的解碼結(jié)果 。另外走芋,就像我們對(duì)編碼器的輸入所做的那樣绩郎,我們會(huì)將上個(gè)時(shí)間步的輸出嵌入并添加位置編碼,來(lái)表示每個(gè)單詞的位置绿聘。
而那些解碼器中的自注意力層表現(xiàn)的模式與編碼器不同:在解碼器中嗽上,自注意力層只被允許處理輸出序列中更靠前的那些位置。在softmax步驟前熄攘,它會(huì)把后面的位置給隱去(Masked)兽愤。
解碼器中的“編碼-解碼注意力層”工作方式基本就像多頭自注意力層一樣,只不過(guò)它是通過(guò)在它下面的解碼層來(lái)創(chuàng)造查詢(xún)矩陣(Q)挪圾,并且從編碼器的輸出中取得鍵(V)/值矩陣(K)浅萧。
最終的線性變換和Softmax層
線性變換:
解碼器最終會(huì)輸出一個(gè)實(shí)數(shù)向量。解碼器輸出后的線性變換層是一個(gè)簡(jiǎn)單的全連接神經(jīng)網(wǎng)絡(luò)哲思,它可以把解碼組件產(chǎn)生的向量投射到一個(gè)比它大得多的(字典維度)洼畅,被稱(chēng)作對(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ù)。
softmax層:
Softmax 層便會(huì)把那些分?jǐn)?shù)變成概率(都為正數(shù)靠益、和為1)丧肴。概率最高的單元格被選中,并且它對(duì)應(yīng)的單詞被作為這個(gè)時(shí)間步的輸出胧后。?