日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【机器翻译】transformer

發(fā)布時間:2025/3/21 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器翻译】transformer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【機器翻譯】transformer

?2018-05-01?|??ML?,?app?,?nlp?,?translation?,?2. 主流model-研究現狀?,?2. NMT?,?transformer?|??3129

?本文字數:?|??閱讀時長 ≈

簡介

在2017年5月Facebook發(fā)布了ConvSeq2Seq模型吊打了GNMT一個月之后,Google發(fā)出了最強有力的反擊,發(fā)表了一篇論文Attention is all you need,文中提出了一種新的架構叫做Transformer,用以來實現機器翻譯。它拋棄了傳統的CNN、RNN,只采用attention,取得了很好的效果,激起了工業(yè)界和學術界的廣泛討論。

背景,motivation

如何獲取context信息

常用的模型架構有RNN、CNN、CRF,詳見?序列學習。

transformer橫空出世

Transformer避開了recurrence,只用attention,便可以刻畫出輸入和輸出的依賴關系。

對比RNN的決策步驟太長問題,transformer可單步決策。通過一層self-attention,bank能夠直接attend到river上。

ConvS2S是線性時間復雜度,ByteNet是log時間復雜度。而Transformer則是常數時間復雜度

創(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。如果忽略激活函數softmax的話,那么事實上它就是三個n×dk,dk×m,m×dvn×dk,dk×m,m×dv的矩陣相乘,最后的結果就是一個n×dvn×dv的矩陣。

這里將attention抽象成?q: query,?k: key,?v: value。

為什么要采用scale?

因為量級太大,softmax后就非0即1了,不夠“soft”了。也會導致softmax的梯度非常小。也就是讓softmax結果不稀疏(問號臉,通常人們希望得到更稀疏的attention吧)。

  • attention 可以不只是用于 decoder 里每步輸入一個符號,而是可以用在網絡中的任意一層,把一個序列轉換成另一個序列。這個作用與 convolutional layer、recurrent layer 等是類似的,但有一個好處就是不再局限于局域性。attention是直接去capture dependency structure,擺脫了局限性魔咒
  • attention 可以一般地描述為在一個 key-value mapping 中進行檢索,只不過 query 跟 key 可以進行模糊匹配,檢索結果是各個 key 對應的 value 的加權平均。
  • Query, key, value 其實并不是專門針對翻譯的概念。不過可以舉一些翻譯中的例子。例如,當剛剛翻譯完主語之后,attention 的內部狀態(tài)就會想要去找謂語,這時它就把「想找謂語」這件事編碼成 query。然后句子里本身是謂語的地方,會有一個 key,表明「我這里可以提供謂語」,它跟 query 一拍即合。這個 key 對應的 value 就是謂語本身的 embedding。

    點乘注意力在何凱明的Non-local Neural Networks中被解釋成Embedded Gaussian的一種特例。非要跟高斯扯上關系,好牽強。

    VS additive attention

    additive attention等價于一個前饋網絡:

    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輸入切成八份后的
    向量類比關注不同local paritial的卷積核的話,我們可以看到CNN和這里multi-head attention異曲同工

    優(yōu)勢

  • It expands the model’s ability to focus on different positions。 這個最強勢。通過attention到不同的維度。細粒度的attention,超贊。
    • 既是細粒度的attention,又不增加計算量
  • 能在encode的時候并行化,(這里的并行是相對RNN嗎?one-head是大矩陣也可以并行。convS2S同樣可以)
  • 降維到d/head,即bottleneck的思想,減少計算量
  • 舉例
    忽略batch_size

    復制

    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],即并未減少計算量和參數量 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.

    思考

  • self attention遺漏了什么?位置信息
  • self attention中的k, q, v分別指代什么?
  • self attention是否可逆向?
  • FFN層

    FFN(Position-wise Feed-Forward Network)。

    • Position-wise: 顧名思義,就是對每個position采用相同的操作。
    • Feed-Forward Network: 就是最普通的全連接神經網絡,這里采用的兩層,relu作為激活函數

    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中有兩種實現dense_relu_dense?和?conv_relu_conv,默認采用的前者。

    其中卷積的維度是

    復制

    1 2 3 input.shape = [batch_size, length, 512] kernel_1 = [2048,1] kernel_2 = [512, 1]

    ?

    tensor2tensor實現中,conv1d中的kernel_size如果為1,默認返回dense。源碼

    復制

    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的。

    層數與維度設計

    很自然,我們有兩個疑問。

  • 為什么要兩層?MLP?
  • 為什么要先升維再降維? high-rank
  • 通常的bottleNeck架構,先降維再升維(減小計算量)。

    兩大作用:

  • multi-head attention之后的merge
    • 類似group conv之后的merge,DWConv后的1*1卷積與channel shuffle
  • 小結

  • 為什么叫強調position-wise?
    • 解釋一: 這里FFN層是每個position進行相同且獨立的操作,所以叫position-wise。對每個position獨立做FFN。
    • 解釋二:從卷積的角度解釋,這里的FFN等價于kernel_size=1的卷積,這樣每個position都是獨立運算的。如果kernel_size=2,或者其他,position之間就具有依賴性了,貌似就不能叫做position-wise了
  • 為什么要采用全連接層?
    • 目的: 增加非線性變換
    • 如果不采用FFN呢?有什么替代的設計?
  • 為什么采用2層全連接,而且中間升維?
    • 這也是所謂的bottle neck,只不過低維在IO上,中間采用high rank
  • Positional Encoding

    回顧一下Transformer的整個架構,不難發(fā)現Transformer模型本身并不能捕捉序列的順序。換句話說,如果將K,V按行打亂順序(相當于句子中的詞序打亂),那么Attention的結果還是一樣的。這就表明了,到目前為止,Attention模型頂多是一個非常精妙的“詞袋模型”而已。

    Sinusoid Positional Encoding

    code

    1、以前在RNN、CNN模型中其實都出現過Position Embedding,但在那些模型中,Position Embedding是錦上添花的輔助手段,也就是“有它會更好、沒它也就差一點點”的情況,因為RNN、CNN本身就能捕捉到位置信息。但是在這個純Attention模型中,Position Embedding是位置信息的唯一來源,因此它是模型的核心成分之一,并非僅僅是簡單的輔助手段。

    2、在以往的Position Embedding中,基本都是根據任務訓練出來的向量。而Google直接給出了一個構造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個元素的數值就是個元素的數值就是PE{i}(p)$。Google在論文中說到他們比較過直接訓練出來的位置向量和上述公式計算出來的位置向量,效果是接近的。因此顯然我們更樂意使用公式構造的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的向量的線性變換,這提供了表達相對位置信息的可能性。

    小結

  • Transformer并沒有在結構上突破傳統的LSTM和CNN,只是采用了position encoding的方式取巧。
    如何在結構上突破CNN和LSTM的缺陷,達到獲取position(時序)信息、任意長度依賴、易并行的效果?
  • 其他方案
    • 拼接: 起來作為一個新向量,也可以把位置向量定義為跟詞向量一樣大小,然后兩者加起來。FaceBook的論文和Google論文中用的都是后者。直覺上相加會導致信息損失,似乎不可取
    • multi-channel:
  • 其他

    layer norm

    ?

    transformer - data flow

    Result

    可視化

    經過測試,列了以下可視化結果。

    TODO,+動態(tài)可視化

    維度設計

    在NLP的很多網絡里,一般

    • hidden_dim和embedding_dim 相等
      -

    每層的維度都是相同的維度,(只在FFN層進行了局部升維)。

    這與傳統的

    參數量 & 計算量

    code

    • TensorFlow
      • https://github.com/Kyubyong/transformer?簡易版,bucket、lr、decay等都沒有實現
      • https://github.com/tensorflow/models/tree/master/official/transformer?TF官方code,基本不更新
      • https://github.com/tensorflow/tensor2tensor#translation?官方code,產品級,更新頻繁
      • 代碼解析:?https://blog.csdn.net/mijiaoxiaosan/article/details/74909076
    • Pytorch

    缺陷

    ss

    Attention層的好處是能夠一步到位捕捉到全局的聯系,因為它直接把序列兩兩比較(代價是計算量變?yōu)镺(n2)O(n2)),當然由于是純矩陣運算,這個計算量相當也不是很嚴重);相比之下,RNN需要一步步遞推才能捕捉到,而CNN則需要通過層疊來擴大感受野,這是Attention層的明顯優(yōu)勢。

    擴展閱讀

    • Transformer | Google-blog
    • 《Attention is All You Need》淺讀(簡介+代碼)| kexue.fm?很多還沒看懂,后面繼續(xù)看
    • 從convS2S到transformer | 知乎

    相關文章

    • 【機器翻譯】CNN系列 - convseq2seq

    • 【機器翻譯】RNN系列 - GNMT

    • 非局部連接網絡 Non-local Neural Network

    總結

    以上是生活随笔為你收集整理的【机器翻译】transformer的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。