一篇文章把Self-Attention与Transformer讲明白
文章主要內容概覽:
1. Seq2Seq以及注意力機制
Seq2Seq 任務指的是輸入和輸出都是序列的任務。例如說英語翻譯成中文。
1.1 Encoder-Decoder模型與Seq2Seq的關系?
答:編碼器-解碼器(Encoder-Decoder)模型最初是由Cho等提出應用在機器翻譯中。由于在機器翻譯中是文本到文本的轉換,比如將法語翻譯成英語,Sutskever等也稱編碼器-解碼器模型為序列到序列學習(Seq2Seq)。
相關論文如下:
【1】Cho K, Van Merri?nboer B, Gulcehre C, et al. Learning phrase representations using RNN encoder-decoder for statistical machine translation[J]. arXiv preprint arXiv:1406.1078, 2014.
【2】Sutskever I, Vinyals O, Le Q V. Sequence to sequence learning with neural networks[C]//Advances in neural information processing systems. 2014: 3104-3112.
1.2 Encoder-Decoder模型
通常來說,Seq2Seq任務最常見的是使用Encoder+Decoder的模式,先將一個序列編碼成一個上下文矩陣,在使用Decoder來解碼。當然,我們僅僅把context vector作為編碼器到解碼器的輸入。
編碼器-解碼器模型雖然非常經典,但是局限性也很大。最大的局限性是編碼器和解碼器之間唯一的聯系是一個固定長度的語義向量context vector。也就是說,編碼器要將整個序列的信息壓縮成一個固定長度的向量。它存在三個弊端:
(1)對于編碼器來說,語義向量context vector可能無法完全表示整個序列的信息。
(2)對于編碼器來說,先輸入到網絡的序列攜帶的信息可能會被后輸入的序列覆蓋掉,輸入的序列越長,這種現象就越嚴重。
(3)對于解碼器來說,在解碼的時候,對于輸入的每個單詞的權重是不一致的。
以上三個弊端使得在解碼的時候解碼器一開始可能就沒有獲得輸入序列足夠多的信息,自然解碼的準確率也就不高。所以,在NMT(Neural Machine Translation,神經機器翻譯)任務上,還添加了attention的機制。
1.3 注意力機制的本質思想
關于注意力機制入門文章請看我之前的一篇文章:深度學習中的注意力機制,Microstrong,地址:https://mp.weixin.qq.com/s/3911D_FkTWrtKwBo30vENg
熟悉了注意力機制的原理后,我們來探究一下注意力機制的本質思想。
我們可以這樣來看待Attention機制(上圖):將Source中的構成元素想象成是由一系列的<Key,Value>數據對構成,此時給定Target中的某個元素Query(解碼器隱藏層狀態? ),通過計算Query和各個Key(輸入句子中每個單詞)的相似性或者相關性,得到每個Key對應Value(輸入句子中每個單詞對應的語義編碼,即各個編碼器隱藏層狀態? )的權重系數(也就是,編碼器每個隱藏層向量的權重? ),然后對Value進行加權求和,即得到了最終的Attention數值。所以本質上Attention機制是對Source中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重系數。即可以將其本質思想改寫為如下公式:
其中,? 代表Source的長度,公式含義即如上所述。在機器翻譯的例子里,因為在計算Attention的過程中,Source中的Key和Value合二為一,指向的是同一個東西,也即輸入句子中每個單詞對應的語義編碼,所以可能不容易看出這種能夠體現本質思想的結構。
當然,從概念上理解,把Attention仍然理解為從大量信息中有選擇地篩選出少量重要信息并聚焦到這些重要信息上,忽略大多不重要的信息,這種思路仍然成立。聚焦的過程體現在權重系數的計算上,權重越大越聚焦于其對應的Value值上,即權重代表了信息的重要性,而Value是其對應的信息。
對于Attention機制的具體計算過程,如果對目前大多數方法進行抽象的話,可以將其歸納為兩個過程:第一個過程是根據Query和Key計算權重系數,第二個過程根據權重系數對Value進行加權求和。而第一個過程又可以細分為兩個階段:第一個階段根據Query和Key計算兩者的相似性或者相關性;第二個階段對第一階段的原始分數值進行歸一化處理。這樣,可以將Attention的計算過程抽象為下圖展示的三個階段。
在第一個階段, 可以引入不同的函數和計算機制,根據Query和某個? ,計算兩者的相似性或者相關性,最常見的方法包括:求兩者的向量點積、求兩者的向量Cosine相似性或者通過再引入額外的神經網絡來求值,即如下方式:
點積:
Cosine相似性:
MLP網絡:
第一階段產生的分數值根據具體產生的方法不同其數值取值范圍也不一樣,第二階段引入類似SoftMax的計算方式對第一階段的得分進行數值轉換,一方面可以進行歸一化,將原始計算分數值整理成所有元素權重之和為1的概率分布;另一方面也可以通過SoftMax的內在機制更加突出重要元素的權重。即一般采用如下公式計算:
第二階段 的計算結果? 即為? 對應的權重系數,然后進行加權求和即可得到Attention數值:
通過如上三個階段的計算,即可求出針對Query的Attention數值,目前絕大多數具體的注意力機制計算方法都符合上述的三階段抽象計算過程。
2. 基于LSTM方法論存在的一些弊端
傳統的RNN存在梯度消失和梯度爆炸的問題。LSTM和GRU都緩解了梯度消失和梯度爆炸的問題,但是沒有徹底解決該問題。因此,為了讓模型的能力進一步提升,在論文《Attention is All You Need》中提出了Transformer模型,該模型利用Attention機制可以完全代替RNN、CNN等系列模型。目前大熱的Bert就是基于Transformer構建的,這個模型廣泛應用于NLP領域,例如:機器翻譯、問答系統、文本摘要和語音識別等方向。
關于RNN、LSTM中梯度消失與爆炸問題的文章:
【1】循環神經網絡(RNN),Microstrong,地址:https://mp.weixin.qq.com/s/IPyI2Ee6Kzyv3wFAUN7NOQ
【2】理解LSTM網絡,Microstrong,地址:https://mp.weixin.qq.com/s/0Q0aK4xmyKkZ0fMUIhc3Sg
3. Transformer的總體結構
Transformer的結構和Attention機制一樣,Transformer模型中也采用了 Encoder-Decoder 架構。但其結構相比于Attention更加復雜,論文中Encoder層由6個Encoder堆疊在一起,Decoder層也一樣。
每一個Encoder和Decoder的內部結構如下圖:
Encoder包含兩層,一個Self-attention層和一個前饋神經網絡層,Self-attention層能幫助當前節點不僅僅只關注當前的詞,從而能獲取到上下文的語義。
Decoder也包含Encoder提到的兩層網絡,但是在這兩層中間還有一層Attention層,幫助當前節點獲取到當前需要關注的重點內容。
4. Transformer Encoder的結構
首先,模型需要對輸入的數據進行一個embedding操作,也可以理解為類似word2vec的操作,embedding結束之后,輸入到Encoder層,Self-attention處理完數據后把數據送給前饋神經網絡,前饋神經網絡的計算可以并行,得到的輸出會輸入到下一個Encoder。
4.1 Positional Encoding
Transformer模型中缺少一種解釋輸入序列中單詞順序的方法,它跟序列模型還不一樣。為了處理這個問題,Transformer給Encoder層和Decoder層的輸入添加了一個額外的向量Positional Encoding,維度和embedding的維度一樣,這個向量采用了一種很獨特的方法來讓模型學習到這個值,這個向量能決定當前詞的位置,或者說在一個句子中不同的詞之間的距離。這個位置向量的具體計算方法有很多種,論文中的計算方法如下:
其中pos是指當前詞在句子中的位置,? 是指向量中每個值的index,可以看出,在偶數位置,使用正弦編碼,在奇數位置,使用余弦編碼。
最后把這個Positional Encoding與embedding的值相加,作為輸入送到下一層。
4.2 Self-Attention
讓我們從宏觀視角看自注意力機制,精煉一下它的工作原理。
例如,下列句子是我們想要翻譯的輸入句子:
The animal didn't cross the street because it was too tired
這個“it”在這個句子是指什么呢?它指的是street還是這個animal呢?這對于人類來說是一個簡單的問題,但是對于算法則不是。
當模型處理這個單詞“it”的時候,自注意力機制會允許“it”與“animal”建立聯系。
隨著模型處理輸入序列的每個單詞,自注意力會關注整個輸入序列的所有單詞,幫助模型對本單詞更好地進行編碼。如果你熟悉RNN(循環神經網絡),回憶一下它是如何維持隱藏層的。RNN會將它已經處理過的前面的所有單詞/向量的表示與它正在處理的當前單詞/向量結合起來。而自注意力機制會將所有相關單詞的理解融入到我們正在處理的單詞中。
如上圖所示,當我們在編碼器#5(棧中最上層編碼器)中編碼“it”這個單詞的時,注意力機制的部分會去關注“The Animal”,將它的表示的一部分編入“it”的編碼中。接下來我們看一下Self-Attention詳細的處理過程。
(1)首先, Self-Attention會計算出三個新的向量,在論文中,向量的維度是維,我們把這三個向量分別稱為Query、Key、Value,這三個向量是用embedding向量與一個矩陣(? )相乘得到的結果,這個矩陣是隨機初始化的,維度為(64,512),注意第二個維度需要和embedding的維度一樣,其值在BP的過程中會一直進行更新,得到的這三個向量的維度是64。
從上圖中可以看出,? 與? 權重矩陣相乘得到? , 就是與這個單詞相關的"query"向量。最終使得輸入序列的每個單詞的創建一個"query"向量、一個"key"向量和一個"value"向量。
什么是"query"向量、"key"向量和"value"向量呢?
答:它們都是有助于計算和理解注意力機制的抽象概念。請繼續閱讀下文的內容,你就會知道每個向量在計算注意力機制中到底扮演什么樣的角色。
(2)第二步計算Self-Attention的分數值, 該分數值決定了當我們在某個位置encode一個詞時,對輸入句子的其他部分的關注程度。這個分數值的計算方法是Query與Key做點成,以下圖為例,假設我們在為這個例子中的第一個詞“Thinking”計算自注意力向量,我們需要拿輸入句子中的每個單詞對“Thinking”打分。這些分數決定了在編碼單詞“Thinking”的過程中有多重視句子的其它部分。
這些分數是通過打分單詞(所有輸入句子的單詞)的key向量與“Thinking”的Value向量相點積來計算的。所以如果我們是處理位置最靠前的詞的自注意力的話,第一個分數是? 和? 的點積,第二個分數是? 和? 的點積。
(3)接下來, 把點成的結果除以一個常數,這里我們除以8,這個值一般是采用上文提到的矩陣的第一個維度的開方即64的開方8,這會讓梯度更穩定。當然也可以選擇其他的值,8只是默認的值。然后把得到的結果做一個softmax的計算。softmax的作用是使所有單詞的分數歸一化,得到的分數都是正值且和為1。得到的結果即是每個詞對于當前位置的詞的相關性大小。
這個softmax分數決定了每個單詞對編碼當下位置(“Thinking”)的貢獻。顯然,已經在這個位置上的單詞將獲得最高的softmax分數,即當前位置的詞相關性肯定會很大,但有時關注另一個與當前單詞相關的單詞也會有幫助。
(4)下一步 就是把每個Value向量和softmax得到的值進行相乘(這是為了準備之后將它們求和),這里的直覺是希望關注語義上相關的單詞,并弱化不相關的單詞(例如,讓它們乘以0.001這樣的小數)。然后對相乘的值進行相加,得到的結果即是self-attetion層在當前位置的輸出(在我們的例子中是對于第一個單詞)。
這樣自自注意力的計算就完成了。得到的向量就可以傳遞給前饋神經網絡。然而實際中,這些計算是以矩陣形式完成的,以便算得更快。那我們接下來就看看如何用矩陣實現的。
(1)第一步是計算Query矩陣、Key矩陣和Value矩陣。為此,我們將輸入句子的詞嵌入裝進矩陣? 中,將其乘以我們訓練的權重矩陣 () 。
由上圖可知,? 矩陣中的每一行對應于輸入句子中的一個單詞。我們再次看到詞嵌入向量 (512,或圖中的4個格子)和? 向量(64,或圖中的3個格子)的大小差異。
(2)最后,由于我們處理的是矩陣,我們可以將Self-Attention詳細計算中步驟2到步驟4合并為一個公式來計算自注意力層的輸出。
總結,在實際的應用場景,為了提高計算速度,我們采用的是矩陣的方式,直接計算出Query, Key, Value的矩陣,然后把embedding的值與三個矩陣直接相乘,把得到的新矩陣 Q 與 K 相乘,除以一個常數,做softmax操作,最后乘上 V 矩陣。這種通過 query 和 key 的相似性程度來確定 value 的權重分布的方法被稱為scaled dot-product attention。
4.3 Multi-Headed Attention
通過增加一種叫做“多頭”注意力(“multi-headed”attention)的機制,論文進一步完善了自注意力層,并在兩方面提高了注意力層的性能:
它擴展了模型專注于不同位置的能力。在上面的例子中,雖然每個單詞的編碼都在? 中有或多或少的體現,但是它可能被實際的單詞本身所支配。如果我們翻譯一個句子,比如“The animal didn’t cross the street because it was too tired”,我們會想知道“it”指的是哪個詞,這時模型的“多頭”注意力機制會起到作用。
它給出了注意力層的多個“表示子空間”(representation subspaces)。接下來我們將看到,對于“多頭”注意力機制,我們有多個Query/Key/Value權重矩陣集(Transformer使用八個注意力頭,因此我們對于每個編碼器/解碼器有八個矩陣集合)。這些集合中的每一個都是隨機初始化的,在訓練之后,每個集合都被用來將輸入詞嵌入(或來自較低編碼器/解碼器的向量)投影到不同的表示子空間中。
從上圖可以看出,在“多頭”注意力機制下,我們為每個頭保持獨立的Q/K/V權重矩陣,從而產生不同的Q/K/V矩陣。和之前一樣,我們拿 X 乘以? 矩陣來產生Q/K/V矩陣。
如果我們做與上述相同的自注意力計算,只需八次不同的權重矩陣運算,我們就會得到八個不同的? 矩陣。
這給我們帶來了一點挑戰。前饋層不需要8個矩陣,它只需要一個矩陣(由每一個單詞的表示向量組成)。所以我們需要一種方法把這八個矩陣壓縮成一個矩陣。那該怎么做?其實可以直接把這些矩陣拼接在一起,然后用一個附加的權重矩陣? 與它們相乘。
這幾乎就是多頭自注意力的全部。這確實有好多矩陣,我們試著把它們集中在一個圖片中,這樣可以一眼看清。
既然我們已經摸到了注意力機制的這么多“頭”,那么讓我們重溫之前的例子,看看我們在例句中編碼“it”一詞時,不同的注意力“頭”集中在哪里:
當我們編碼“it”一詞時,一個注意力頭集中在“animal”上,而另一個則集中在“tired”上,從某種意義上說,模型對“it”一詞的表達在某種程度上是“animal”和“tired”的代表。
然而,如果我們把所有的attention都加到圖示里,事情就更難解釋了:
4.4 The Residuals and Layer normalization
在繼續進行下去之前,我們需要提到一個編碼器架構中的細節:在每個編碼器中的每個子層(自注意力、前饋網絡)的周圍都有一個殘差連接,并且都跟隨著一個Layer Normalization(層-歸一化)步驟。
相關論文:
【1】Ba J L, Kiros J R, Hinton G E. Layer normalization[J]. arXiv preprint arXiv:1607.06450, 2016.
如果我們去可視化這些向量以及這個和自注意力相關聯的layer-norm操作,那么看起來就像下面這張圖描述一樣:
解碼器的子層也是這樣樣的。如果我們想象一個2層編碼器-解碼器結構的Transformer,它看起來會像下面這張圖一樣:
4.5 Batch Normalization and Layer Normalization
Normalization有很多種,但是它們都有一個共同的目的,那就是把輸入轉化成均值為0方差為1的數據。我們在把數據送入激活函數之前進行normalization(歸一化),因為我們不希望輸入數據落在激活函數的飽和區。
(1)Batch Normalization
BN的主要思想就是:在每一層的每一批數據上進行歸一化。我們可能會對輸入數據進行歸一化,但是經過該網絡層的作用后,我們的數據已經不再是歸一化的了。隨著這種情況的發展,數據的偏差越來越大,我的反向傳播需要考慮到這些大的偏差,這就迫使我們只能使用較小的學習率來防止梯度消失或者梯度爆炸。BN的具體做法就是對每一小批數據,在批這個方向上做歸一化。
(2)Layer normalization
它也是歸一化數據的一種方式,不過LN是在每一個樣本上計算均值和方差,而不是BN那種在批方向計算均值和方差!公式如下:
5. Transformer Decoder的結構
根據上面的總體結構圖可以看出,Decoder部分其實和Encoder部分大同小異,剛開始也是先添加一個位置向量Positional Encoding,方法和4.1節一樣,接下來接的是masked mutil-head attetion,這里的mask也是transformer一個很關鍵的技術,下面我們會進行一一介紹。其余的層結構與Encoder一樣,詳細細節請看上面Encoder層的介紹。
5.1 masked mutil-head attetion
mask表示掩碼,它對某些值進行掩蓋,使其在參數更新時不產生效果。 Transformer 模型里面涉及兩種 mask,分別是 padding mask 和 sequence mask。其中,padding mask 在所有的 scaled dot-product attention 里面都需要用到,而 sequence mask 只有在 Decoder 的 self-attention 里面用到。
(1)padding mask
什么是 padding mask 呢?因為每個批次輸入序列長度是不一樣的也就是說,我們要對輸入序列進行對齊。具體來說,就是給在較短的序列后面填充 0。但是如果輸入的序列太長,則是截取左邊的內容,把多余的直接舍棄。因為這些填充的位置,其實是沒什么意義的,所以我們的attention機制不應該把注意力放在這些位置上,所以我們需要進行一些處理。
具體的做法是,把這些位置的值加上一個非常大的負數(負無窮),這樣的話,經過 softmax,這些位置的概率就會接近0!
而我們的 padding mask 實際上是一個張量,每個值都是一個Boolean,值為 false 的地方就是我們要進行處理的地方。
(2)Sequence mask
sequence mask 是為了使得 decoder 不能看見未來的信息。也就是對于一個序列,在 time_step 為 t 的時刻,我們的解碼輸出應該只能依賴于 t 時刻之前的輸出,而不能依賴 t 之后的輸出。因此我們需要想一個辦法,把 t 之后的信息給隱藏起來。
那么具體怎么做呢?也很簡單:產生一個上三角矩陣,上三角的值全為0。把這個矩陣作用在每一個序列上,就可以達到我們的目的。
對于 decoder 的 self-attention,里面使用到的 scaled dot-product attention,同時需要padding mask 和 sequence mask 作為 attn_mask,具體實現就是兩個mask相加作為attn_mask。
其他情況,attn_mask 一律等于 padding mask。
5.2 最終的線性變換和Softmax層
當Decoder層全部執行完畢后,怎么把得到的向量映射為我們需要的詞呢,很簡單,只需要在結尾再添加一個全連接層和softmax層,假如我們的詞典是1萬個詞,那最終softmax會輸出1萬個詞的概率,概率值最大的對應的詞就是我們最終的結果。
上面這張圖,底部以解碼器組件產生的輸出向量開始。之后它會轉化出一個輸出單詞。
6. Transformer動態流程圖
編碼器通過處理輸入序列開啟工作。頂端編碼器的輸出之后會變轉化為一個包含向量K(鍵向量)和V(值向量)的注意力向量集 ,這是并行化操作。 這些向量將被每個解碼器用于自身的“編碼-解碼注意力層”,而這些層可以幫助解碼器關注輸入序列哪些位置合適:
在完成編碼階段后,則開始解碼階段。解碼階段的每個步驟都會輸出一個輸出序列的元素(在這個例子里,是英語翻譯的句子)。
接下來的步驟重復了這個過程,直到到達一個特殊的終止符號,它表示transformer的解碼器已經完成了它的輸出。每個步驟的輸出在下一個時間步被提供給底端解碼器,并且就像編碼器之前做的那樣,這些解碼器會輸出它們的解碼結果 。另外,就像我們對編碼器的輸入所做的那樣,我們會嵌入并添加位置編碼給那些解碼器,來表示每個單詞的位置。
而那些解碼器中的自注意力層表現的模式與編碼器不同:在解碼器中,自注意力層只被允許處理輸出序列中更靠前的那些位置。在softmax步驟前,它會把后面的位置給隱去(把它們設為-inf)。
這個“編碼器-解碼器注意力層”工作方式基本就像多頭自注意力層一樣,只不過它是通過在它下面的層來創造Queries矩陣,并且從編碼器的輸出中取得Keys、Values矩陣。
7. Transformer訓練部分總結
現在我們已經了解了一個訓練完畢的Transformer的前向過程,順道看下訓練的概念也是非常有用的。
在訓練時,模型將經歷上述的前向過程,當我們在標記訓練集上訓練時,可以對比預測輸出與實際輸出。
為了可視化,假設輸出一共只有6個單詞(“a”, “am”, “i”, “thanks”, “student”, “”)
圖:模型的詞表是在訓練之前的預處理中生成的
一旦定義了詞表,我們就能夠構造一個同維度的向量來表示每個單詞,比如one-hot編碼,下面舉例編碼“am”。
圖:舉例采用one-hot編碼輸出詞表
下面讓我們討論下模型的loss損失,在訓練過程中用來優化的指標,指導學習得到一個非常準確的模型。
8. 損失函數
我們用一個簡單的例子來示范訓練,比如翻譯“merci”為“thanks”。那意味著輸出的概率分布指向單詞“thanks”,但是由于模型未訓練是隨機初始化的,不太可能就是期望的輸出。
由于模型參數是隨機初始化的,未訓練的模型輸出隨機值。我們可以對比真實輸出,然后利用誤差后傳調整模型權重,使得輸出更接近與真實輸出。
如何對比兩個概率分布呢?簡單采用交叉熵(cross-entropy)或者KL散度(Kullback-Leibler divergence)中的一種。
鑒于這是個極其簡單的例子,更真實的情況是,使用一個句子作為輸入。比如,輸入是“je suis étudiant”,期望輸出是“i am a student”。在這個例子下,我們期望模型輸出連續的概率分布滿足如下條件:
每個概率分布都與詞表同維度。
第一個概率分布對“i”具有最高的預測概率值。
第二個概率分布對“am”具有最高的預測概率值。
一直到第五個輸出指向""標記。
圖:對一個句子而言,訓練模型的目標概率分布
在足夠大的訓練集上訓練足夠時間之后,我們期望產生的概率分布如下所示:
訓練好之后,模型的輸出是我們期望的翻譯。當然,這并不意味著這一過程是來自訓練集。注意,每個位置都能有值,即便與輸出近乎無關,這也是softmax對訓練有幫助的地方。
現在,因為模型每步只產生一組輸出,假設模型選擇最高概率,扔掉其他的部分,這是種產生預測結果的方法,叫做greedy 解碼。另外一種方法是beam search,每一步僅保留最頭部高概率的兩個輸出,根據這倆輸出再預測下一步,再保留頭部高概率的兩個輸出,重復直到預測結束。top_beams是超參可試驗調整。
9. 關于Transformer的若干問題
9.1 Transformer為什么需要進行Multi-head Attention?這樣做有什么好處?Multi-head Attention的計算過程?
原論文中說進行Multi-head Attention的原因是將模型分為多個頭,形成多個子空間,可以讓模型去關注不同方面的信息,最后再將各個方面的信息綜合起來。其實直觀上也可以想到,如果自己設計這樣的一個模型,必然也不會只做一次attention,多次attention綜合的結果至少能夠起到增強模型的作用,也可以類比CNN中同時使用多個卷積核的作用,直觀上講,多頭的注意力有助于網絡捕捉到更豐富的特征/信息。Multi-head Attention的計算過程前面已經詳細講過。
9.2 Transformer相比于RNN/LSTM,有什么優勢?為什么?
RNN系列的模型,并行計算能力很差。RNN并行計算的問題就出在這里,因為 T 時刻的計算依賴 T-1 時刻的隱層計算結果,而 T-1 時刻的計算依賴 T-2 時刻的隱層計算結果,如此下去就形成了所謂的序列依賴關系。
Transformer的特征抽取能力比RNN系列的模型要好。具體實驗對比可以參考: 放棄幻想,全面擁抱Transformer:自然語言處理三大特征抽取器(CNN/RNN/TF)比較,張俊林,地址:https://zhuanlan.zhihu.com/p/54743941。
但是值得注意的是,并不是說Transformer就能夠完全替代RNN系列的模型了,任何模型都有其適用范圍,同樣的,RNN系列模型在很多任務上還是首選,熟悉各種模型的內部原理,知其然且知其所以然,才能遇到新任務時,快速分析這時候該用什么樣的模型,該怎么做好。
9.3 為什么說Transformer可以代替seq2seq?
seq2seq缺點: 這里用代替這個詞略顯不妥當,seq2seq雖已老,但始終還是有其用武之地,seq2seq最大的問題在于將Encoder端的所有信息壓縮到一個固定長度的向量中 ,并將其作為Decoder端首個隱藏狀態的輸入,來預測Decoder端第一個單詞(token)的隱藏狀態。在輸入序列比較長的時候,這樣做顯然會損失Encoder端的很多信息,而且這樣一股腦的把該固定向量送入Decoder端,Decoder端不能夠關注到其想要關注的信息。上述兩點都是seq2seq模型的缺點,后續論文對這兩點有所改進,如著名的《Neural Machine Translation by Jointly Learning to Align and Translate》,雖然確確實實對seq2seq模型有了實質性的改進,但是由于主體模型仍然為RNN(LSTM)系列的模型,因此模型的并行能力還是受限。
Transformer優點: transformer不但對seq2seq模型這兩點缺點有了實質性的改進(多頭交互式attention模塊),而且還引入了self-attention模塊,讓源序列和目標序列首先“自關聯”起來,這樣的話,源序列和目標序列自身的embedding表示所蘊含的信息更加豐富,而且后續的FFN層也增強了模型的表達能力(ACL 2018會議上有論文對Self-Attention和FFN等模塊都有實驗分析,見論文:《How Much Attention Do You Need?A Granular Analysis of Neural Machine Translation Architectures》),并且Transformer并行計算的能力是遠遠超過seq2seq系列的模型,因此我認為這是transformer優于seq2seq模型的地方。
9.4 Transformer如何并行化的?
Transformer的并行化我認為主要體現在self-attention模塊,在Encoder端Transformer可以并行處理整個序列,并得到整個輸入序列經過Encoder端的輸出,在self-attention模塊,對于某個序列,self-attention模塊可以直接計算的點乘結果,而RNN系列的模型就必須按照順序從計算到。
10. Reference
【1】【transformer】 你應該知道的 transformer,機器學習算法與自然語言處理出品,地址:https://mp.weixin.qq.com/s/lwAPIdIt98O7EgfMzi4G4Q
【2】Attention? Attention!,Lil'Log,地址:https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html#whats-wrong-with-seq2seq-model
【3】The Illustrated Transformer,地址:https://jalammar.github.io/illustrated-transformer/
【4】Transformer各層網絡結構詳解!面試必備!(附代碼實現),地址:https://mp.weixin.qq.com/s/NPkVJz7u0L4WWD_meZw3MQ
【5】圖解Transformer(完整版),地址:https://blog.csdn.net/longxinchen_ml/article/details/86533005
【6】[譯] The Illustrated Transformer - Zewei Chu的文章 - 知乎 https://zhuanlan.zhihu.com/p/75591049
【7】關于Transformer的若干問題整理記錄 - Adherer的文章 - 知乎 https://zhuanlan.zhihu.com/p/82391768
【8】深度學習中的注意力機制,地址:https://mp.weixin.qq.com/s/swLwla75RIQfyDDCPYynaw
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)備注:加入本站微信群或者qq群,請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的一篇文章把Self-Attention与Transformer讲明白的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐一些能提高生产力的 Python 库
- 下一篇: 直播 NO.5 | Facebook 田