0
本文作者: AI研習(xí)社-譯站 | 2019-03-19 10:11 |
本文為 AI 研習(xí)社編譯的技術(shù)博客,原標(biāo)題 :
How Transformers Work
作者 | Giuliano Giacaglia
翻譯 | 胡瑛皓
校對(duì) | 醬番梨 審核 | 約翰遜·李加薪 整理 | 立魚(yú)王
原文鏈接:
https://towardsdatascience.com/transformers-141e32e69591
Transformer是一類(lèi)神經(jīng)網(wǎng)絡(luò)架構(gòu),現(xiàn)在越來(lái)越受歡迎了。Transformer最近被OpenAI用于訓(xùn)練他們的語(yǔ)言模型,同時(shí)也被DeepMind的AlphaStar?采用,用于他們的程序擊敗那些頂級(jí)星際玩家。
Transformer是為了解決序列傳導(dǎo)問(wèn)題或神經(jīng)網(wǎng)絡(luò)機(jī)器翻譯而設(shè)計(jì)的,意味著任何需要將輸入序列轉(zhuǎn)換為輸出序列的任務(wù)都可以用,包括語(yǔ)音識(shí)別和文本到語(yǔ)音轉(zhuǎn)換等。
序列傳導(dǎo)。綠色表示輸入,藍(lán)色表示模型,紫色表示輸出。動(dòng)圖摘自:jalammar.github.io
對(duì)于需要進(jìn)行序列傳導(dǎo)的模型,有必要有某種記憶。例如,我們將以下句子翻譯到另一種語(yǔ)言(法語(yǔ)):
“The Transformers” are a Japanese [[hardcore punk]] band. The band was formed in 1968, during the height of Japanese music history”
本例中,第二句話(huà)中的“the band”一詞指代第一句中引入的“The Transformers”。當(dāng)你讀到第二句中的"the band",你知道它指的是“The Transformers” band。這可能對(duì)翻譯很重要。事實(shí)上,后一句話(huà)中的某個(gè)詞指代前幾句話(huà)中出現(xiàn)的某個(gè)詞,像這樣的例子很多。
翻譯這樣的句子,模型需要找出之間的依賴(lài)和關(guān)聯(lián)。循環(huán)神經(jīng)網(wǎng)絡(luò) (RNNs)和卷積神經(jīng)網(wǎng)絡(luò)(CNNs)由于其特性已被使用來(lái)解決這個(gè)問(wèn)題。 讓我們回顧一下這兩種架構(gòu)及其缺點(diǎn)。
循環(huán)神經(jīng)網(wǎng)絡(luò)內(nèi)部有循環(huán),允許信息保存其中。
輸入表示為 x_t
如上圖所示,我們看到神經(jīng)網(wǎng)絡(luò)的一部分A,處理輸入x_t,然后輸出h_t。A處循環(huán)使得信息可從前一步傳遞至后一步。
可以換一種方式思考這些循環(huán)。循環(huán)神經(jīng)網(wǎng)絡(luò)可認(rèn)為是同一網(wǎng)絡(luò)A的多重備份,每個(gè)網(wǎng)絡(luò)將信息傳遞給其后續(xù)網(wǎng)絡(luò)??匆幌氯绻覀儗⒀h(huán)展開(kāi)會(huì)如何:
展開(kāi)的循環(huán)神經(jīng)網(wǎng)絡(luò)
圖中鏈?zhǔn)奖举|(zhì)清楚地表明循環(huán)神經(jīng)網(wǎng)絡(luò)與序列和列表相關(guān)。 如果以這種方式翻譯一段文本,需要將文本中的每個(gè)單詞設(shè)置為其輸入。循環(huán)神經(jīng)網(wǎng)絡(luò)將序列中前面的詞語(yǔ)的信息傳入后一個(gè)神經(jīng)網(wǎng)絡(luò),這樣便可以利用和處理這些信息。
下圖展示了sequence to sequence模型通常是如何用循環(huán)神經(jīng)網(wǎng)絡(luò)工作的。每個(gè)單詞被單獨(dú)處理,然后將編碼階段的隱狀態(tài)傳入解碼階段以生成結(jié)果句子,然后這樣就產(chǎn)生了輸出。
動(dòng)圖摘自此文:jalammar.github.io
長(zhǎng)期依賴(lài)的問(wèn)題
考慮一下這類(lèi)模型,即使用之前看到的單詞預(yù)測(cè)下一個(gè)單詞。如果我們需要預(yù)測(cè)這句話(huà)“the clouds in the ___”的下一個(gè)單詞,不需要額外的語(yǔ)境信息,很顯然下個(gè)單詞是“sky”。
這個(gè)例子里,相關(guān)信息和需預(yù)測(cè)單詞的距離很近。循環(huán)神經(jīng)網(wǎng)絡(luò)可以學(xué)習(xí)前面的信息,并找出句中下一個(gè)單詞。
圖片摘自此文:colah.github.io
但有些情況我們需要更多語(yǔ)境信息。例如試圖預(yù)測(cè)這句話(huà)的最后一個(gè)單詞: “I grew up in France… I speak fluent ___”。 最靠近這個(gè)單詞的信息建議這很有可能是一種語(yǔ)言,但當(dāng)你想確定具體是哪種語(yǔ)言時(shí),我們需要語(yǔ)境信息France,而這出現(xiàn)在較前面的文本中。
圖片摘自此文:colah.github.io
當(dāng)相關(guān)信息和詞語(yǔ)之間距離變得很大時(shí),RNN變得非常低效。那是因?yàn)?,需要翻譯的信息經(jīng)過(guò)運(yùn)算中的每一步,傳遞鏈越長(zhǎng),信息就越可能在鏈中丟失。
理論上RNN可以學(xué)習(xí)這些長(zhǎng)期依賴(lài)關(guān)系,不過(guò)實(shí)踐表現(xiàn)不佳,學(xué)不到這些信息。因而出現(xiàn)了LSTM,一種特殊的RNN,試圖解決這類(lèi)問(wèn)題。
我們平時(shí)安排日程時(shí),通常會(huì)為不同的約會(huì)確定不同的優(yōu)先級(jí)。如果有什么重要行程安排,我們通常會(huì)取消一些不那么重要的會(huì)議,去參加那些重要的。
RNN不會(huì)那么做。無(wú)論什么時(shí)候都會(huì)不斷往后面加信息,它通過(guò)應(yīng)用函數(shù)轉(zhuǎn)換全部現(xiàn)有信息。在過(guò)程中所有信息都被修改了,它不去考慮哪些重要,哪些不重要。
LSTMs在此基礎(chǔ)上利用乘法和加法做了一些小改進(jìn)。在LSTMs里,信息流經(jīng)一種機(jī)制稱(chēng)為細(xì)胞狀態(tài)。LSTM便可以選擇性的記憶或遺忘那些重要或不重要的事情了。
LSTM內(nèi)部看起來(lái)像是這樣:
圖片摘自此文:colah.github.io
每個(gè)細(xì)胞的輸入為x_t (在句子到句子翻譯這類(lèi)應(yīng)用中x_t是一個(gè)單詞), 上一輪細(xì)胞狀態(tài)以及上一輪的輸出。模型基于這些輸入計(jì)算改變其中信息,然后產(chǎn)生新的細(xì)胞狀態(tài)和輸出。本文不會(huì)詳細(xì)講每個(gè)細(xì)胞的實(shí)現(xiàn)機(jī)制。如果你想了解這些細(xì)胞的運(yùn)作機(jī)制,推薦你看一下Christopher的博客:
Understanding LSTM Networks -- colah's blog
這些循環(huán)使得循環(huán)神經(jīng)網(wǎng)絡(luò)看起來(lái)有點(diǎn)神秘。 但如果再細(xì)想一下,事實(shí)上https://colah.github.io/posts/2015-08-Understanding-LSTMs/
采用細(xì)胞狀態(tài)后,在翻譯過(guò)程中,句子中對(duì)翻譯單詞重要的信息會(huì)被一輪一輪傳遞下去。
LSTM的問(wèn)題
總體來(lái)說(shuō)問(wèn)題LSTM的問(wèn)題與RNN一樣,例如當(dāng)句子過(guò)長(zhǎng)LSTM也不能很好的工作。原因在于保持離當(dāng)前單詞較遠(yuǎn)的上下文的概率以距離的指數(shù)衰減。
那意味著當(dāng)出現(xiàn)長(zhǎng)句,模型通常會(huì)忘記序列中較遠(yuǎn)的內(nèi)容。RNN與LSTM模型的另一個(gè)問(wèn)題,由于不得不逐個(gè)單詞處理,因此難以并行化處理句子。不僅如此,也沒(méi)有長(zhǎng)短范圍依賴(lài)的模型??傊琇STM和RNN模型有三個(gè)問(wèn)題:
順序計(jì)算,不能有效并行化
沒(méi)有顯示的建模長(zhǎng)短范圍依賴(lài)
單詞之間的距離是線性的
為了解決其中部分問(wèn)題,研究者建立了一項(xiàng)能對(duì)特定單詞產(chǎn)生注意力的技能。
當(dāng)翻譯一個(gè)句子,我會(huì)特別注意我當(dāng)前正在翻譯的單詞。當(dāng)我錄制錄音時(shí),我會(huì)仔細(xì)聆聽(tīng)我正在寫(xiě)下的部分。如果你讓我描述我所在的房間,當(dāng)我這樣做的時(shí)候,我會(huì)瞥一眼描述的物體。
神經(jīng)網(wǎng)絡(luò)用attention可以做到同樣的效果,專(zhuān)注于給出信息的那部分。例如,RNN可注意另一RNN的輸出。在每個(gè)時(shí)點(diǎn)它聚焦于其他RNN不同的位置。
為了解決這些問(wèn)題,注意力(attention)是一種用于神經(jīng)網(wǎng)絡(luò)的技術(shù)。 對(duì)于RNN模型,與其只編碼整個(gè)句子的隱狀態(tài),我們可以把每個(gè)單詞的隱狀態(tài)一起傳給解碼器階段。在RNN的每個(gè)步驟使用隱藏狀態(tài)進(jìn)行解碼。詳見(jiàn)下面動(dòng)圖
綠色步驟是編碼階段,紫色步驟是解碼階段,動(dòng)圖摘自此文:jalammar.github.io
其背后的想法是句子每個(gè)單詞都有相關(guān)信息。為了精確解碼,需要用注意力機(jī)制考慮輸入的每個(gè)單詞。
對(duì)于要放入序列傳導(dǎo)RNN模型的注意力,我們分成編碼和解碼兩步。一步以綠色表示另一步以紫色表示。綠色步驟稱(chēng)為編碼階段紫色步驟稱(chēng)為解碼階段。
動(dòng)圖摘自此文:jalammar.github.io
綠色步驟負(fù)責(zé)由輸入建立隱狀態(tài)。我們把句子中每個(gè)單詞產(chǎn)生的所有隱狀態(tài)傳入解碼階段,而不是和過(guò)去的attention一樣,僅傳遞一個(gè)隱狀態(tài)給解碼器。每個(gè)隱狀態(tài)都會(huì)在解碼階段被使用,去找出網(wǎng)絡(luò)應(yīng)該注意的地方。
比如,當(dāng)我們翻譯這句 “Je suis étudiant”法語(yǔ)句子到英語(yǔ)時(shí),需要在翻譯時(shí)解碼步驟去查不同的單詞。
此動(dòng)圖展示當(dāng)翻譯“Je suis étudiant”至英語(yǔ)時(shí),如何給每個(gè)隱狀態(tài)賦予權(quán)重。顏色越深對(duì)于每個(gè)單詞的權(quán)重越大。動(dòng)圖摘自此文:jalammar.github.io
或再比如,當(dāng)你將“L’accord sur la zone économique européenne a été signé en ao?t 1992.” 法語(yǔ)翻譯成英語(yǔ),下圖展示了需要對(duì)每個(gè)輸入賦予多少注意力。
翻譯 “L’accord sur la zone économique européenne a été signé en ao?t 1992.”法語(yǔ)句子到英文。圖片摘自此文:jalammar.github.io
不過(guò)我們前面討論的一些問(wèn)題,用帶attention的RNN仍然無(wú)法解決。比如,不可能并行處理輸入的單詞。對(duì)較大的文本語(yǔ)料,增加了翻譯文本的用時(shí)。
卷積神經(jīng)網(wǎng)絡(luò)可以幫助解決這些問(wèn)題,可以做到:
并行化 (按層)
利用局部依賴(lài)
位置間的距離是對(duì)數(shù)級(jí)的
一些最流行的序列傳導(dǎo)網(wǎng)絡(luò), 例如 Wavenet和Bytenet就采用卷積神經(jīng)網(wǎng)絡(luò)。
Wavenet, 模型采用卷積神經(jīng)網(wǎng)絡(luò) (CNN). 動(dòng)圖摘自此文
卷積神經(jīng)網(wǎng)絡(luò)可并行處理是因?yàn)?,輸入的每個(gè)單詞可被同時(shí)處理并不必依賴(lài)于前一個(gè)單詞翻譯的結(jié)果。不僅如此,輸出單詞與任何CNN輸入的單詞的“距離”是log(N)?數(shù)量級(jí)—?—?即輸入單詞到輸出單詞連線形成的樹(shù)的高度 (如上面動(dòng)圖所示)。 這比RNN輸出到其輸入的距離要好很多,因?yàn)槠渚嚯x是N數(shù)量級(jí)。
問(wèn)題在于卷積神經(jīng)網(wǎng)絡(luò)在翻譯句子過(guò)程中不一定有助于解決依賴(lài)問(wèn)題。這就是transformers被創(chuàng)造出來(lái)的原因,它結(jié)合了CNN和attention機(jī)制.
Transformers模型試圖結(jié)合卷積神經(jīng)網(wǎng)絡(luò)和attention機(jī)制解決并行化問(wèn)題。attention機(jī)制提升模型從一個(gè)序列轉(zhuǎn)換為另一個(gè)序列的速度。
我們來(lái)看一下Transformer是如何工作的。Transformer是一類(lèi)用attention來(lái)提速的模型,具體來(lái)說(shuō)使用的是self-attention。
Transformer, 圖片摘自此文:jalammar.github.io
從內(nèi)部來(lái)看Transformer與之前模型架構(gòu)相似,只是Transformer由6個(gè)編碼器和6個(gè)解碼器組成。
圖片摘自此文:jalammar.github.io
編碼器非常相似,所有編碼器都具有相同的架構(gòu)。解碼器也有相同的屬性諸如互相之間非常相似。編碼器有兩層: self-attention層和前饋神經(jīng)網(wǎng)絡(luò)層。
圖片摘自此文:jalammar.github.io
編碼器的輸入先進(jìn)入self-attention層,有助于編碼器在編碼句中特定單詞時(shí)可參考輸入句子中其他單詞。解碼器也包含這兩層,不過(guò)在兩層中間增加了attention層,以幫助解碼器聚焦到輸入句子的相關(guān)部分。
圖片摘自此文:jalammar.github.io
注: 這部分轉(zhuǎn)自Jay Allamar的博文 https://jalammar.github.io/illustrated-transformer/
我們來(lái)看一下模型中各種不同的向量/張量,它們?cè)谝延?xùn)練模型組件中如何流轉(zhuǎn),從而把輸入轉(zhuǎn)化成輸出的。 由于這是一個(gè)NLP應(yīng)用實(shí)例,我們先用詞嵌入算法把每個(gè)輸入的詞語(yǔ)轉(zhuǎn)換為詞向量。
圖片摘自此文:jalammar.github.io
每個(gè)單詞被轉(zhuǎn)換為一個(gè)長(zhǎng)度512的向量。圖中我們用這些簡(jiǎn)單的方塊表示這些向量。
僅在最底層的解碼器處進(jìn)行詞嵌入轉(zhuǎn)換。對(duì)于所有編碼器,它們都接收大小為512的向量列表
最底層的編碼器接收的是詞嵌入,但其他編碼器接收的輸入是其下一層的直接輸出。當(dāng)輸入序列中的單詞做詞嵌入轉(zhuǎn)換后,數(shù)據(jù)就按順序流經(jīng)各層編碼器的2層結(jié)構(gòu)。
圖片摘自此文:jalammar.github.io
此處我們開(kāi)始看到Transformer的一個(gè)重要特性,每個(gè)位置上的單詞在編碼器中流經(jīng)自己的路徑。在self-attention層處理這些路徑的依賴(lài)關(guān)系。前饋神經(jīng)網(wǎng)絡(luò)不處理這些依賴(lài)關(guān)系。這樣當(dāng)數(shù)據(jù)流經(jīng)前饋神經(jīng)網(wǎng)絡(luò)時(shí),不同的路徑可被并行執(zhí)行。
接下來(lái),我們將切換到一句短句實(shí)例,看一下在編碼器的子層里會(huì)發(fā)生什么。
Self-Attention
首先讓我們來(lái)看一下如何用向量計(jì)算self-attention,然后再看一下利用矩陣運(yùn)算的實(shí)現(xiàn)方式。
找出句中單詞之間的關(guān)系并給出正確的注意力。圖片摘自此文:http://web.stanford.edu
self-attention計(jì)算的第一步是通過(guò)編碼器的輸入向量 (本例中是每個(gè)單詞的詞嵌入向量) 建立Query, Key和Value三個(gè)向量,我們通過(guò)輸入的詞嵌入向量乘以之前訓(xùn)練完成的三個(gè)矩陣得到。
注意,這些新向量的長(zhǎng)度小于詞嵌入向量的長(zhǎng)度。這里取64,而詞嵌入向量及編碼器的輸入輸出長(zhǎng)度為512。這是一個(gè)架構(gòu)性選擇,向量長(zhǎng)度不需要變得更小,使得多頭注意力(multiheaded attention)計(jì)算基本穩(wěn)定。
圖片摘自此文:jalammar.github.io
將詞向量x1乘以權(quán)重矩陣WQ得到q1,即與這個(gè)單詞關(guān)聯(lián)的“query”向量。這樣,我們最終分別得到輸入句子里每個(gè)單詞的“query”,“key”和“value”投射。
那“query”, “key”和“value”向量是什么?
它們是一種抽象,在計(jì)算和考慮注意力時(shí)會(huì)被用到。如果你讀了下文里關(guān)于注意力的計(jì)算方法,你就差不多明白各向量的角色。
計(jì)算self-attention的第二步是計(jì)算一項(xiàng)得分(score)。我們以計(jì)算句中第一個(gè)單詞Thinking的self-attention為例。我們需要計(jì)算句中每個(gè)單詞針對(duì)這個(gè)詞的得分。當(dāng)我們?cè)谔囟ǖ奈恢镁幋a一個(gè)單詞時(shí),該得分決定了在輸入句子的其他部分需要放多少焦點(diǎn)。
得分等于當(dāng)前詞的query向量與需評(píng)分詞語(yǔ)的key向量的點(diǎn)積。因此,如果需要計(jì)算#1位置處單詞的self-attention,第一個(gè)得分是q1與k1的點(diǎn)積,第二個(gè)得分就是q1和k2的點(diǎn)積。
圖片摘自此文:jalammar.github.io
第三第四步是將所有得分除以8(論文中取的是向量維數(shù)開(kāi)根號(hào)—?—?64,這樣會(huì)得到更穩(wěn)定的梯度。當(dāng)然也可以用其他值,不過(guò)這是默認(rèn)值),然后將結(jié)果放入一個(gè)softmax操作. softmax方法正則化這些得分,使它們都大于0且加和為1。
圖片摘自此文:jalammar.github.io
這個(gè)經(jīng)過(guò)softmax的score決定了該單詞在這個(gè)位置表達(dá)了多少。很顯然當(dāng)前位置所在的單詞會(huì)得到最高的softmax得分,不過(guò)有時(shí)候有助于算法注意到其他與當(dāng)前單詞相關(guān)的單詞。
第五步,將每個(gè)value向量乘以softmax得分 (準(zhǔn)備對(duì)它們求和)。這里的意圖是保持需要聚焦的單詞的value,并且去除不相關(guān)的單詞(乘以一個(gè)很小的數(shù)字比如0.001)。
第六步,求和加權(quán)后的value向量。這就產(chǎn)生了(對(duì)于第一個(gè)單詞)在self-attention層上此位置的輸出。
圖片摘自此文:jalammar.github.io
這樣self-attention計(jì)算就結(jié)束了。結(jié)果向量就可以拿來(lái)作為前饋神經(jīng)網(wǎng)絡(luò)的輸入。不過(guò)實(shí)際實(shí)現(xiàn)中,考慮到性能該計(jì)算由矩陣形式運(yùn)算完成。我們現(xiàn)在看一下,我們已經(jīng)知道如何在詞級(jí)別計(jì)算了。
Multihead attention
Transformer基本上就是這么工作的。此外還有一些其他細(xì)節(jié)使其工作得更好。比如,實(shí)現(xiàn)中使用了多頭注意力的概念,而不是只在一個(gè)維度上計(jì)算注意力。
其背后的想法是,當(dāng)你翻譯一個(gè)單詞時(shí),基于不同的問(wèn)題,會(huì)對(duì)于同一個(gè)單詞產(chǎn)生不同的注意力,如下圖所示。比如說(shuō)當(dāng)你在翻譯“I kicked the ball”句中的“kicked”時(shí),你會(huì)問(wèn)“Who kicked”。由于問(wèn)題不同,當(dāng)翻譯成另一種語(yǔ)言時(shí)結(jié)果可能改變?;蛘邌?wèn)了其他問(wèn)題,比如“Did what?”,等…
圖片摘自此文:http://web.stanford.edu
Positional Encoding
Transfomer的另一個(gè)重要步驟是為每個(gè)詞增加了位置編碼。由于每個(gè)單詞的位置與翻譯相關(guān),所以編碼每個(gè)單詞的位置是有用的。
本文概述transformers是怎么工作的,以及在序列傳導(dǎo)問(wèn)題中使用的原因。如果你希望更深入的理解模型運(yùn)作的原理及相關(guān)差異。推薦閱讀以下帖子、文章和視頻資料。
The Unreasonable Effectiveness of Recurrent Neural Networks
Understanding LSTM Networks
Visualizing A Neural Machine Translation Model
The Illustrated Transformer
The Transformer?—?Attention is all you need
The Annotated Transformer
Attention is all you need attentional neural network models
Self-Attention For Generative Models
OpenAI GPT-2: Understanding Language Generation through Visualization
WaveNet: A Generative Model for Raw Audio
想要繼續(xù)查看該篇文章相關(guān)鏈接和參考文獻(xiàn)?
點(diǎn)擊【多圖帶你讀懂 Transformers 的工作原理】或長(zhǎng)按下方地址:
https://ai.yanxishe.com/page/TextTranslation/1558
AI研習(xí)社今日推薦:雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
卡耐基梅隆大學(xué) 2019 春季《神經(jīng)網(wǎng)絡(luò)自然語(yǔ)言處理》是CMU語(yǔ)言技術(shù)學(xué)院和計(jì)算機(jī)學(xué)院聯(lián)合開(kāi)課,主要內(nèi)容是教學(xué)生如何用神經(jīng)網(wǎng)絡(luò)做自然語(yǔ)言處理。神經(jīng)網(wǎng)絡(luò)對(duì)于語(yǔ)言建模任務(wù)而言,可以稱(chēng)得上是提供了一種強(qiáng)大的新工具,與此同時(shí),神經(jīng)網(wǎng)絡(luò)能夠改進(jìn)諸多任務(wù)中的最新技術(shù),將過(guò)去不容易解決的問(wèn)題變得輕松簡(jiǎn)單。
加入小組免費(fèi)觀看視頻:https://ai.yanxishe.com/page/groupDetail/33
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。