论文《Attention Is All You Need》及Transformer模型
目錄
1. Introduction
2. 模型結(jié)構(gòu)? ? ? ? ? ? ? ? ? ? ? ? ?
2.1?Transformer模型
2.2 輸入層
2.3 位置向量:給單詞賦予上下文語境
2.4 注意力機(jī)制
2.4.1 Self-attention 和 Encoder-Decoder attention
2.4.2 Scaled Dot-Product Attention
2.4.3 Multi-Head Attention
2.5 前向神經(jīng)網(wǎng)絡(luò)? ? ? ? ? ? ? ? ? ? ? ? ? ??
3. 本文使用的注意力機(jī)制
3.1?Encoder的結(jié)構(gòu)
3.2?Decoder的結(jié)構(gòu)
4. 總結(jié)
4.1 為什么使用self-attention? ? ? ???
4.2 訓(xùn)練
4.3 結(jié)果? ? ? ? ? ??
5. 本文開源代碼
6. 參考資料
1. Introduction
? ? ? ?本文是谷歌發(fā)表的文章,針對nlp里的機(jī)器翻譯問題,提出了一種被稱為”Transformer”的網(wǎng)絡(luò)結(jié)構(gòu),基于注意力機(jī)制。文章提出,以往nlp里大量使用RNN結(jié)構(gòu)和encoder-decoder結(jié)構(gòu),RNN及其衍生網(wǎng)絡(luò)的缺點就是慢,問題在于前后隱藏狀態(tài)的依賴性,無法實現(xiàn)并行,而文章提出的”Transformer”完全摒棄了遞歸結(jié)構(gòu),依賴注意力機(jī)制,挖掘輸入和輸出之間的關(guān)系,這樣做最大的好處是能夠并行計算了。
? ? ? ? 在此之前,針對機(jī)器翻譯這個領(lǐng)域,為了應(yīng)對RNN無法并行問題,已經(jīng)有過一些使用CNN的解決方案了,例如谷歌的ByteNet,Facebook的FairSeq等等。
??自注意力機(jī)制(Self-attention)能夠把輸入序列上不同位置的信息聯(lián)系起來,然后計算出整條序列的某種表達(dá),目前自注意力機(jī)制主要應(yīng)用于閱讀理解、提取摘要、文本推論等領(lǐng)域。
2. 模型結(jié)構(gòu)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ?上圖是谷歌提出的 transformer 架構(gòu),其本質(zhì)上是一個Encoder-Decoder的結(jié)構(gòu)。把英文句子輸入模型,模型會輸出法文句子。
要搭建Transformer,我們必須要了解5個過程:
- 詞向量層
- 位置編碼
- 創(chuàng)建Masks
- 多頭注意層(The Multi-Head Attention layer)
- Feed Forward層
2.1?Transformer模型
Transformer采用encoder-decoder結(jié)構(gòu),舍棄了RNN的循環(huán)式網(wǎng)絡(luò)結(jié)構(gòu),完全基于注意力機(jī)制來對一段文本進(jìn)行建模。
Transformer所使用的注意力機(jī)制的核心思想是去計算一句話中的每個詞對于這句話中所有詞的相互關(guān)系,然后認(rèn)為這些詞與詞之間的相互關(guān)系在一定程度上反應(yīng)了這句話中不同詞之間的關(guān)聯(lián)性以及重要程度。因此再利用這些相互關(guān)系來調(diào)整每個詞的重要性(權(quán)重)就可以獲得每個詞新的表達(dá)。這個新的表征不但蘊(yùn)含了該詞本身,還蘊(yùn)含了其他詞與這個詞的關(guān)系,因此和單純的詞向量相比是一個更加全局的表達(dá)。Transformer通過對輸入的文本不斷進(jìn)行這樣的注意力機(jī)制層和普通的非線性層交疊來得到最終的文本表達(dá)。
Transformer采用Encoder與Decoder的堆疊,具體為
- Encoder:Transformer模型的Encoder由6個基本層堆疊起來,每個基本層包含兩個子層,第一個子層是一個注意力機(jī)制,第二個是一個全連接前向神經(jīng)網(wǎng)絡(luò)。對兩個子層都引入了殘差邊以及l(fā)ayer normalization。
- Decoder:Transformer模型的Decoder也由6個基本層堆疊起來,每個基本層除了Encoder里面的那兩個以外,還增加了一層注意力機(jī)制,同樣引入殘差邊以及l(fā)ayer normalization。
- Encoder的attention是self-attention;Decoder里面的attention首先是self-attention,然后是encoder-decoder attention。
2.2 輸入層
? ? ? ?編碼器和解碼器的輸入就是利用學(xué)習(xí)好的embeddings將tokens(一般應(yīng)該是詞或者字符)轉(zhuǎn)化為d維向量。對解碼器來說,利用線性變換以及softmax函數(shù)將解碼的輸出轉(zhuǎn)化為一個預(yù)測下一個token的概率。
2.3 位置向量:給單詞賦予上下文語境
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?由于本文的模型結(jié)構(gòu)沒有使用任何遞歸結(jié)構(gòu)或卷積結(jié)構(gòu),為了讓模型能利用輸入序列的順序信息,必須引入某種能表達(dá)輸入序列每個部分的絕對或相對位置的信息才行,也就是需要將tokens的相對以及絕對位置信息注入到模型中去。文章采取的方法是在輸入embeddings的基礎(chǔ)上加了一個位置編碼(positional encoding),在送入encoder和decoder之前,先對輸入進(jìn)行編碼,編碼后的向量維度是dmodel。具體來說,采用正弦和余弦函數(shù)進(jìn)行編碼。
? ? ? ?然而,只要稍微思考一下就會發(fā)現(xiàn),這樣的模型并不能捕捉序列的順序!換句話說,如果將K、V按行打亂順序(相當(dāng)于句子中的詞序打亂),那么Attention的結(jié)果還是一樣的。這就表明了,到目前為止,Attention模型頂多是一個非常精妙的“詞袋模型”而已。這問題就比較嚴(yán)重了,大家知道,對于時間序列來說,尤其是對于NLP中的任務(wù)來說,順序是很重要的信息,它代表著局部甚至是全局的結(jié)構(gòu),學(xué)習(xí)不到順序信息,那么效果將會大打折扣(比如機(jī)器翻譯中,有可能只把每個詞都翻譯出來了,但是不能組織成合理的句子)。
? ? ? ? 于是Google再祭出了一招——Position Embedding,也就是“位置向量”,將每個位置編號,然后每個編號對應(yīng)一個向量,通過結(jié)合位置向量和詞向量,就給每個詞都引入了一定的位置信息,這樣Attention就可以分辨出不同位置的詞了。
? ? ? ? Position Embedding并不算新鮮的玩意,在FaceBook的《Convolutional Sequence to Sequence Learning》也用到了這個東西。
? ? ?(1)以前在RNN、CNN模型中其實都出現(xiàn)過Position Embedding,但在那些模型中,Position Embedding是錦上添花的輔助手段,也就是“有它會更好、沒它也就差一點點”的情況,因為RNN、CNN本身就能捕捉到位置信息。但是在這個純Attention模型中,Position Embedding是位置信息的唯一來源,因此它是模型的核心成分之一,并非僅僅是簡單的輔助手段。
? ? (2)在以往的Position Embedding中,基本都是根據(jù)任務(wù)訓(xùn)練出來的向量。而Google直接給出了一個構(gòu)造Position Embedding的公式:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?其中pos代表的是第幾個詞,i代表embedding中的第幾維。Google在論文中說到他們比較過直接訓(xùn)練出來的位置向量和上述公式計算出來的位置向量,效果是接近的。因此顯然我們更樂意使用公式構(gòu)造的Position Embedding了。
? ? ? ?在給詞向量添加位置編碼之前,我們要擴(kuò)大詞向量的數(shù)值,目的是讓位置編碼相對較小。這意味著向詞向量添加位置編碼時,詞向量的原始含義不會丟失。
? ?(3)Position Embedding本身是一個絕對位置的信息,但在語言中,相對位置也很重要,Google選擇前述的位置向量公式的一個重要原因是:由于我們有sin(α+β)=sinαcosβ+cosαsinβ以及cos(α+β)=cosαcosβ?sinαsinβ,這表明位置p+k的向量可以表示成位置p的向量的線性變換,這提供了表達(dá)相對位置信息的可能性。
2.4 注意力機(jī)制
? ? ? ? 注意力機(jī)制(Attention)簡單來說就是給定一個查找(query)和一個鍵值表(key-value pairs),將query映射到正確的輸入的過程。此處的query、key、value和最終的輸出都是向量。輸出往往是一個加權(quán)求和的形式,而權(quán)重則由query、key和value決定。
??NLP領(lǐng)域中,Attention網(wǎng)絡(luò)基本成為了標(biāo)配,是Seq2Seq的創(chuàng)新。Attention網(wǎng)絡(luò)是為了解決編碼器-解碼器結(jié)構(gòu)存在的長輸入序列問題。
??Attention功能可以被描述為將查詢和一組鍵值對映射到輸出,其中查詢、鍵、值和輸出都是向量。輸出可以通過對查詢的值加權(quán)來計算。
? ? ? ? Attention通常可以進(jìn)行如下描述,表示為將query(Q)和key-value pairs映射到輸出上,其中query、每個key、每個value都是向量,輸出是V中所有values的加權(quán),其中權(quán)重是由Query和每個key計算出來的,計算方法分為三步:
? ? ? 1)計算比較Q和K的相似度,用f來表示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?2)將得到的相似度進(jìn)行softmax歸一化:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?
? ? ? 3)針對計算出來的權(quán)重,對所有的values進(jìn)行加權(quán)求和,得到Attention向量:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?計算相似度的方法有以下4種,在本文中,我們計算相似度的方式是第一種:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ?本文提出的Attention機(jī)制稱為Multi-Head Attention,不過在這之前,我們要先介紹它的簡單版本?Scaled Dot-Product Attention。
2.4.1 Self-attention 和 Encoder-Decoder attention
? ? ? ?計算Attention首先要有query、key和value。Encoder的attention是self-attention,Decoder里面的attention首先是self-attention,然后是encoder-decoder attention。這里的兩種attention是針對query和key-value來說的:
- 對self-attention來說,計算得到query和key-value的過程都是使用的同樣的輸入,因為要算自己跟自己的attention嘛;
- 對encoder-decoder attention來說,query的計算使用的是decoder的輸入,而key-value的計算使用的是encoder的輸出,因為我們要計算decoder的輸入跟encoder里面每一個的相似度嘛。?經(jīng)典模型:? ? ? ? ? ??? ? ? ?
? ? ? ??? ? ? ? ? ? ? ? ? ? ?
? ? ? ?因此本文下面對于attention的講解,都是基于self-attention來說的,如果是encoder-decoder attention,只要改一下輸入即可,其余過程都是一樣的。
? ? ? ? ? ?
2.4.2 Scaled Dot-Product Attention
? ? ? ? Scaled Dot-Product Attention 可以看作是只有一個 Head 的 Multi-Head Attention,是簡化版本。
? ? ? ? 輸入包含dk維的query和key,以及dv維的value。通過計算query和各個key的點積,除以√dk歸一化,然后經(jīng)過softmax激活變成權(quán)重,最后再乘value。點積注意力機(jī)制的優(yōu)點是速度快、占用空間小。
???? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ?
圖解參考:https://www.jianshu.com/p/b1030350aadb
例子:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?Embedding在進(jìn)入到Attention之前,有3個分叉,那表示說從1個向量,變成了3個向量Q、K、V,它是通過定義一個矩陣(這個矩陣隨機(jī)初始化,通過前向反饋網(wǎng)絡(luò)訓(xùn)練得到),將Embedding和矩陣做乘法,得到查詢向量q,假設(shè)輸入Embedding是512維,在上圖中我們用4個小方格表示,輸出的查詢向量是64維,上圖中用3個小方格以示不同。然后類似地,定義和矩陣,將Embedding和做矩陣乘法,得到鍵向量k;將embeding和做矩陣乘法,得到值向量v。對每一個Embedding做同樣的操作,那么每個輸入就得到了3個向量,查詢向量、鍵向量和值向量。需要注意的是,查詢向量和鍵向量要有相同的維度,值向量的維度可以相同,也可以不同,但一般也是相同的。至于將獲得的Q、K、V矩陣具體操作,總的來說,就是以下這幅圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
獲得的Z和目標(biāo)值進(jìn)行比較,獲得的損失反向傳播,優(yōu)化的參數(shù)是,、和。
2.4.3 Multi-Head Attention
? ? ? ?Multi-Head Attention就是把Scaled Dot-Product Attention的過程做H次,然后把輸出拼接起來,再經(jīng)過一次的線性操作,論文中,它的結(jié)構(gòu)圖如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
不同的head可以學(xué)到不同的語義關(guān)系,如一組head用于做指代消解,一組head用于做上下文。
用h個不同的線性變換(本文取8)分別將dmodel維的key、value和query映射成dk維、dk維和dv維,然后再代入注意力機(jī)制,產(chǎn)生總共h×dv維輸出,然后拼起來,再用一個線性變換得到最終的輸出。
??這個是Google提出的新概念,是Attention機(jī)制的完善。不過從形式上看,它其實就再簡單不過了,就是把Q、K、V通過參數(shù)矩陣映射一下,然后再做Attention,把這個過程重復(fù)做h次,結(jié)果拼接起來就行了,可謂“大道至簡”了。具體來說:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? 所謂“多頭”(Multi-Head),就是只多做幾次同樣的事情(參數(shù)不共享),然后把結(jié)果拼接。
2.5 前向神經(jīng)網(wǎng)絡(luò)
? ? ? ? 這是一個 Position-wise 前向神經(jīng)網(wǎng)絡(luò),encoder和decoder的每一層都包含一個全連接前向神經(jīng)網(wǎng)絡(luò),激活函數(shù)順序是線性、RELU、線性。 每層由兩個支層,attention層就是其中一個,而attention之后的另一個支層就是一個前饋的網(wǎng)絡(luò)。公式描述如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
3. 本文使用的注意力機(jī)制
? ? ? 本文使用的是Multi-Head Attention,具體體現(xiàn)在三個方面。
- 在“encoder-decoder attention”層中,query來自前一個decoder層,而key和value是encoder的輸出。這允許decoder的每個位置都去關(guān)注輸入序列的所有位置。
- encoder包含self-attention層,在self-attention層中所有的key、value和query都來自前一層的encoder。這樣encoder的每個位置都能去關(guān)注前一層encoder輸出的所有位置。
- decoder包含self-attention層
? ? ? ? ? ? ? ? ? ?
? ? ? ? 可以看到,Encoder的每一層有兩個操作,分別是Self-Attention和Feed Forward;而Decoder的每一層有三個操作,分別是Self-Attention、Encoder-Decoder Attention以及Feed Forward操作。這里的Self-Attention和Encoder-Decoder Attention都是用的是Multi-Head Attention機(jī)制。
3.1?Encoder的結(jié)構(gòu)
? ? Encoder有N層,默認(rèn)是6層,每層包括兩個sub-layers:
?(1)第一個sub-layer是Self-attention:使用multi-head self-attention mechanism,用來計算輸入的self-attention;
?(2)第二個sub-layer是簡單的全連接網(wǎng)絡(luò)。
? ? 每一個sub-layer都模擬了殘差網(wǎng)絡(luò)的結(jié)構(gòu),其網(wǎng)絡(luò)示意圖如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
3.2?Decoder的結(jié)構(gòu)
? ? ?Decoder有N(默認(rèn)是6)層,每層包括三個sub-layers:
? ?(1)第一個sub-layer是Self-Attention:使用 Masked multi-head self-attention,也是計算輸入的self-attention,但是因為是生成過程,因此在時刻 i 的時候,大于 i 的時刻都沒有結(jié)果,只有小于 i 的時刻有結(jié)果,因此需要做Mask.
? (2)第二個sub-layer是Encoder-Decoder Attention:對encoder的輸入進(jìn)行attention計算,這里仍然是 Multi-head self-attention結(jié)構(gòu),只不過輸入的分別是decoder的輸入和encoder的輸出。
? (3)第三個sub-layer是全連接網(wǎng)絡(luò):與Encoder相同。
其網(wǎng)絡(luò)示意圖如下:
? ? ? ? ? ? ? ? ? ??
4. 總結(jié)
? ? ? ?模型的整體框架基本介紹完了,其最重要的創(chuàng)新應(yīng)該就是Self-Attention和Multi-Head Attention的架構(gòu)。在摒棄傳統(tǒng)CNN和RNN的情況下,還能提高表現(xiàn),降低訓(xùn)練時間。Transformer用于機(jī)器翻譯任務(wù),表現(xiàn)極好,可并行化,并且大大減少訓(xùn)練時間。并且也給我們開拓了一個思路,在處理問題時可以增加一種結(jié)構(gòu)的選擇。
4.1 為什么使用self-attention
? ? ? ? 從三個方面去對比self-attention和遞歸結(jié)構(gòu)、卷積結(jié)構(gòu)的優(yōu)劣性,首先是每一層的計算復(fù)雜度,其次是能夠被并行的計算量,最后是網(wǎng)絡(luò)中長期依賴的路徑長度。對比顯示,self-attention表現(xiàn)最好。
? ? ? ??
4.2 訓(xùn)練
? ? ? ? 訓(xùn)練數(shù)據(jù)使用WMT English-German數(shù)據(jù)集,包含450w對語句。句子都被編碼過了,使用了一個大小約37000個token的字典。樣本被分為若干個batch,每個batch大概25000個token,每個batch中的句子長度保持基本一致。硬件上使用了8塊GPU。Optimizer使用了Adam。過擬合方面使用了dropout和Label Smoothing。
4.3 結(jié)果
? ? ? 不論是英語-德語還是英語-法語的翻譯任務(wù),對比之前的一些模型,本文提出的模型都達(dá)到更好的BELU值,同時Training Cost也最低。
? ? ? ? ? ? ?
5. 本文開源代碼
https://github.com/tensorflow/tensor2tensor
attention實現(xiàn)keras版: https://github.com/bojone/attention/blob/master/attention_keras.py
attention實現(xiàn)tensorflow版: https://github.com/bojone/attention/blob/master/attention_tf.py
6. 參考資料
- 從Encoder-Decoder(Seq2Seq)理解Attention的本質(zhì):https://www.cnblogs.com/huangyc/p/10409626.html#_label3
- 《Attention is All You Need》淺讀(簡介+代碼)https://kexue.fm/archives/4765
- Attention Is All You Need https://arxiv.org/abs/1706.03762
- 一文讀懂「Attention is All You Need」| 附代碼實現(xiàn) https://yq.aliyun.com/articles/342508
- 對Attention is all you need 的理解https://blog.csdn.net/mijiaoxiaosan/article/details/73251443
總結(jié)
以上是生活随笔為你收集整理的论文《Attention Is All You Need》及Transformer模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 循环神经网络:RNN、LSTM、GRU、
- 下一篇: 人工智能:各种知识收集----不断追加内