【机器翻译】transformer
【機器翻譯】transformer
?2018-05-01?|??ML?,?app?,?nlp?,?translation?,?2. 主流model-研究現(xiàn)狀?,?2. NMT?,?transformer?|??3129
?本文字數(shù):?|??閱讀時長 ≈
簡介
在2017年5月Facebook發(fā)布了ConvSeq2Seq模型吊打了GNMT一個月之后,Google發(fā)出了最強有力的反擊,發(fā)表了一篇論文Attention is all you need,文中提出了一種新的架構(gòu)叫做Transformer,用以來實現(xiàn)機器翻譯。它拋棄了傳統(tǒng)的CNN、RNN,只采用attention,取得了很好的效果,激起了工業(yè)界和學(xué)術(shù)界的廣泛討論。
背景,motivation
如何獲取context信息
常用的模型架構(gòu)有RNN、CNN、CRF,詳見?序列學(xué)習(xí)。
transformer橫空出世
Transformer避開了recurrence,只用attention,便可以刻畫出輸入和輸出的依賴關(guān)系。
對比RNN的決策步驟太長問題,transformer可單步?jīng)Q策。通過一層self-attention,bank能夠直接attend到river上。
ConvS2S是線性時間復(fù)雜度,ByteNet是log時間復(fù)雜度。而Transformer則是常數(shù)時間復(fù)雜度
創(chuàng)新點
- dot product attention
- multi-head
- 彩蛋: restricted self-attention,
dot product attention
| Scaled Dot Product Attention | Multi-Head Attention |
前面給出的是一般化的框架形式的描述,事實上Google給出的方案是很具體的。首先它定義了Attention一種泛化形式:
Attention(Q,K,V)=softmax(QK?dk??√)VAttention(Q,K,V)=softmax(QK?dk)V
其中Q∈Rn×dk,K∈Rm×dk,V∈Rm×dvQ∈Rn×dk,K∈Rm×dk,V∈Rm×dv。如果忽略激活函數(shù)softmax的話,那么事實上它就是三個n×dk,dk×m,m×dvn×dk,dk×m,m×dv的矩陣相乘,最后的結(jié)果就是一個n×dvn×dv的矩陣。
這里將attention抽象成?q: query,?k: key,?v: value。
為什么要采用scale?
因為量級太大,softmax后就非0即1了,不夠“soft”了。也會導(dǎo)致softmax的梯度非常小。也就是讓softmax結(jié)果不稀疏(問號臉,通常人們希望得到更稀疏的attention吧)。
Query, key, value 其實并不是專門針對翻譯的概念。不過可以舉一些翻譯中的例子。例如,當(dāng)剛剛翻譯完主語之后,attention 的內(nèi)部狀態(tài)就會想要去找謂語,這時它就把「想找謂語」這件事編碼成 query。然后句子里本身是謂語的地方,會有一個 key,表明「我這里可以提供謂語」,它跟 query 一拍即合。這個 key 對應(yīng)的 value 就是謂語本身的 embedding。
點乘注意力在何凱明的Non-local Neural Networks中被解釋成Embedded Gaussian的一種特例。非要跟高斯扯上關(guān)系,好牽強。
VS additive attention
additive attention等價于一個前饋網(wǎng)絡(luò):
softmax([Q,K]W)=softmax(QWQ+KWK)softmax([Q,K]W)=softmax(QWQ+KWK)
這個的計算速度沒有dot-product attention在GPU上快。
詳見 Neural machine translation by jointly learning to align and translate
VS 其他attention
Multi-Head Attention
以Q為例,單個head的計算
- code-t2t
- code-Kyubyong
- code-keras
將輸入向量切成8份,這每一
份可以看成一個local partial,然后再分別attnetion最終再concat成一個context向量。如果將本文multi-head attention的V輸入切成八份后的
向量類比關(guān)注不同local paritial的卷積核的話,我們可以看到CNN和這里multi-head attention異曲同工
優(yōu)勢:
- 既是細粒度的attention,又不增加計算量
舉例
忽略batch_size
復(fù)制
| 1 2 3 4 5 6 7 8 9 10 11 12 | num_units = 512 # 也叫 num_channel, emb_size max_length = 10K,Q,V = [10, 512] W = [512,512] A = attention(KW, KQ, KW)加上head后 num_head = 8 K_i,Q_i,V_i = [10,64] # W_i = [64,512] # 值得注意的是,這里不是 [64,64],即并未減少計算量和參數(shù)量 A_i = attention(K_i W_i, W_i,) |
?
- Multiple attention layers (heads) in parallel
- Each head uses different linear transformations.
- Different heads can learn different relationships.
思考
FFN層
FFN(Position-wise Feed-Forward Network)。
- Position-wise: 顧名思義,就是對每個position采用相同的操作。
- Feed-Forward Network: 就是最普通的全連接神經(jīng)網(wǎng)絡(luò),這里采用的兩層,relu作為激活函數(shù)
position wise FFN
FFN層對接multi-head attention層,那么該層的輸入?x∈Rbatchsize×length×dmodelx∈Rbatchsize×length×dmodel。
https://github.com/tensorflow/tensor2tensor/blob/v1.9.0/tensor2tensor/models/transformer.py#L1373
FFN(x)=max(0,xW1+b1)W2+b2FFN(x)=max(0,xW1+b1)W2+b2
其中輸入和輸出的維度都是$d{model}=512,中間維度是,中間維度是d{ff}=2048$。對于單個position
x∈R512,W1∈R512×2048,W2∈R2048×512x∈R512,W1∈R512×2048,W2∈R2048×512
與卷積的等價性
這里的全連接層,一種替代方案就是采用kernel size為1的卷積,即
tensor2tensor中有兩種實現(xiàn)dense_relu_dense?和?conv_relu_conv,默認采用的前者。
其中卷積的維度是
復(fù)制
| 1 2 3 | input.shape = [batch_size, length, 512] kernel_1 = [2048,1] kernel_2 = [512, 1] |
?
tensor2tensor實現(xiàn)中,conv1d中的kernel_size如果為1,默認返回dense。源碼
復(fù)制
| 1 2 3 4 | def tpu_conv1d(inputs, filters, kernel_size, padding="SAME", name="tpu_conv1d"):if kernel_size == 1:return dense(inputs, filters, name=name, use_bias=True)... |
?
逗比,conv到底比dense會不會加速?
為什么我覺得kernel_size=512才等價于全連接?
實際上,kernel_size沒必要一定是1的。
層數(shù)與維度設(shè)計
很自然,我們有兩個疑問。
通常的bottleNeck架構(gòu),先降維再升維(減小計算量)。
兩大作用:
- 類似group conv之后的merge,DWConv后的1*1卷積與channel shuffle
小結(jié)
- 解釋一: 這里FFN層是每個position進行相同且獨立的操作,所以叫position-wise。對每個position獨立做FFN。
- 解釋二:從卷積的角度解釋,這里的FFN等價于kernel_size=1的卷積,這樣每個position都是獨立運算的。如果kernel_size=2,或者其他,position之間就具有依賴性了,貌似就不能叫做position-wise了
- 目的: 增加非線性變換
- 如果不采用FFN呢?有什么替代的設(shè)計?
- 這也是所謂的bottle neck,只不過低維在IO上,中間采用high rank
Positional Encoding
回顧一下Transformer的整個架構(gòu),不難發(fā)現(xiàn)Transformer模型本身并不能捕捉序列的順序。換句話說,如果將K,V按行打亂順序(相當(dāng)于句子中的詞序打亂),那么Attention的結(jié)果還是一樣的。這就表明了,到目前為止,Attention模型頂多是一個非常精妙的“詞袋模型”而已。
Sinusoid Positional Encoding
code
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的公式:
?????PE2i(p)=sin(p/100002i/dpos)PE2i+1(p)=cos(p/100002i/dpos){PE2i(p)=sin?(p/100002i/dpos)PE2i+1(p)=cos?(p/100002i/dpos)
這里的意思是將id為pp的位置映射為一個$dpos維的位置向量,這個向量的第維的位置向量,這個向量的第i個元素的數(shù)值就是個元素的數(shù)值就是PE{i}(p)$。Google在論文中說到他們比較過直接訓(xùn)練出來的位置向量和上述公式計算出來的位置向量,效果是接近的。因此顯然我們更樂意使用公式構(gòu)造的Position Embedding了。
3、Position Embedding本身是一個絕對位置的信息,但在語言中,相對位置也很重要,Google選擇前述的位置向量公式的一個重要原因是:由于我們有?sin(α+β)=sinαcosβ+cosαsinβsin?(α+β)=sin?αcos?β+cos?αsin?β以及cos(α+β)=cosαcosβ?sinαsinβcos?(α+β)=cos?αcos?β?sin?αsin?β,這表明位置p+kp+k的向量可以表示成位置pp的向量的線性變換,這提供了表達相對位置信息的可能性。
小結(jié)
如何在結(jié)構(gòu)上突破CNN和LSTM的缺陷,達到獲取position(時序)信息、任意長度依賴、易并行的效果?
- 拼接: 起來作為一個新向量,也可以把位置向量定義為跟詞向量一樣大小,然后兩者加起來。FaceBook的論文和Google論文中用的都是后者。直覺上相加會導(dǎo)致信息損失,似乎不可取
- multi-channel:
其他
layer norm
?
transformer - data flow
Result
可視化
經(jīng)過測試,列了以下可視化結(jié)果。
TODO,+動態(tài)可視化
維度設(shè)計
在NLP的很多網(wǎng)絡(luò)里,一般
- hidden_dim和embedding_dim 相等
-
每層的維度都是相同的維度,(只在FFN層進行了局部升維)。
這與傳統(tǒng)的
參數(shù)量 & 計算量
code
- TensorFlow
- https://github.com/Kyubyong/transformer?簡易版,bucket、lr、decay等都沒有實現(xiàn)
- https://github.com/tensorflow/models/tree/master/official/transformer?TF官方code,基本不更新
- https://github.com/tensorflow/tensor2tensor#translation?官方code,產(chǎn)品級,更新頻繁
- 代碼解析:?https://blog.csdn.net/mijiaoxiaosan/article/details/74909076
- Pytorch
缺陷
ss
Attention層的好處是能夠一步到位捕捉到全局的聯(lián)系,因為它直接把序列兩兩比較(代價是計算量變?yōu)镺(n2)O(n2)),當(dāng)然由于是純矩陣運算,這個計算量相當(dāng)也不是很嚴重);相比之下,RNN需要一步步遞推才能捕捉到,而CNN則需要通過層疊來擴大感受野,這是Attention層的明顯優(yōu)勢。
擴展閱讀
- Transformer | Google-blog
- 《Attention is All You Need》淺讀(簡介+代碼)| kexue.fm?很多還沒看懂,后面繼續(xù)看
- 從convS2S到transformer | 知乎
相關(guān)文章
-
【機器翻譯】CNN系列 - convseq2seq
-
【機器翻譯】RNN系列 - GNMT
-
非局部連接網(wǎng)絡(luò) Non-local Neural Network
總結(jié)
以上是生活随笔為你收集整理的【机器翻译】transformer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NLP】Transformer详解
- 下一篇: 细讲 | Attention Is Al