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