Transformer模型由《Attention is All You Need》提出,有一個完整的Encoder-Decoder框架,其主要由attention(注意力)機制構成。論文地址:https://arxiv.org/abs/1706.03762。git
其總體結構如圖所示:網絡
模型分爲編碼器(Encoder)和解碼器(Decoder)兩部分,包含內部結構的整體結構以下圖所示:架構
圖二框架
在論文中編碼器部分由6個相同編碼器疊在一塊兒,解碼器部分也是由6個相同解碼器疊在一塊兒,編碼器之間不共享參數。(這裏不必定要是6個)ide
在將詞向量表示送入編碼器、解碼器以前,先作positional encoding,下面依次對positional encoding、encoding、decoding進行介紹:學習
一、positional encoding編碼
如圖所示,因爲attention機制不包含位置信息,所以句子首先進行embedding獲得詞向量表示,同時爲了增長位置信息,根據句子中詞的位置信息給詞嵌入添加位置編碼向量,論文中添加位置編碼的方法是:構造一個跟輸入embedding維度同樣的矩陣,而後跟輸入embedding相加獲得multi-head attention 的輸入。spa
做者使用的positional encoding以下:.net
其中,PE爲二維矩陣,大小跟輸入embedding的維度同樣,行表示詞語,列表示詞向量;pos 表示詞語在句子中的位置;表示詞向量的維度;i表示詞向量的位置。所以,上述公式表示在每一個詞語的詞向量的偶數位置添加sin變量,奇數位置添加cos變量,以此來填滿整個PE矩陣,而後加到input embedding中去,這樣便完成位置編碼的引入了。翻譯
二、encoding
如圖二左邊結構所示,編碼器主要由前饋神經網絡層與多頭自注意力層構成,值得注意的是,在每一個編碼器中的每一個子層(自注意力、前饋網絡)的周圍都有一個殘差鏈接,而且都跟隨着一個「層-歸一化」步驟。這裏先介紹attention機制,仍是舉個栗子:
假設咱們想要翻譯這個句子:
「The animal didn't cross the street because it was too tired」
那麼it在這句話中是是指animal仍是street,人類好理解這句話,可是對機器來講就很困難了。當模型處理這個單詞「it」的時候,自注意力機制會容許「it」與「animal」創建聯繫。隨着模型處理輸入序列的每一個單詞,自注意力會關注整個輸入序列的全部單詞,幫助模型對本單詞更好地進行編碼。以下圖。
當咱們在編碼器#5(棧中最上層編碼器)中編碼「it」這個單詞的時,注意力機制的部分會去關注「The Animal」,將它的表示的一部分編入「it」的編碼中。
接下來介紹attention實現的思想。
計算自注意力的第一步就是從每一個編碼器的輸入向量(每一個單詞的詞向量)中生成三個向量。也就是說對於每一個單詞,咱們創造一個查詢向量、一個鍵向量和一個值向量。這三個向量是經過詞嵌入與三個權重矩陣後相乘建立的。在論文中這三個向量的維度比詞嵌入向量要低,實際中維度更低不是必須的,只是架構上的選擇,可使多頭注意力的大部分計算保持不變。
計算自注意力的第二步是計算得分。假設咱們須要對第一個詞’Thinking’計算自注意力向量那麼須要拿輸入句子中的每一個單詞對「Thinking」打分。這些分數決定了在編碼單詞「Thinking」的過程當中有多重視句子的其它部分。
這些分數是經過打分單詞(全部輸入句子的單詞)的鍵向量與「Thinking」的查詢向量相點積來計算的。因此若是咱們是處理位置最靠前的詞的自注意力的話,第一個分數是q1和k1的點積,第二個分數是q1和k2的點積。
第三步和第四步是將分數除以8(8是論文中使用的鍵向量的維數64的平方根,這會讓梯度更穩定。這裏也可使用其它值,8只是默認值),而後經過softmax傳遞結果。softmax的做用是使全部單詞的分數歸一化,獲得的分數都是正值且和爲1。
這個softmax分數決定了每一個單詞對編碼當下位置(「Thinking」)的貢獻。顯然,已經在這個位置上的單詞將得到最高的softmax分數,但有時關注另外一個與當前單詞相關的單詞也會有幫助。
第五步是將每一個值向量乘以softmax分數(這是爲了準備以後將它們求和)。這裏的直覺是但願關注語義上相關的單詞,並弱化不相關的單詞。
第六步是對加權值向量求和,而後即獲得自注意力層在該位置的輸出。
這樣自注意力的計算就完成了。獲得的向量就能夠傳給前饋神經網絡。
在現實中自注意力機制是經過矩陣來實現的,與上面思路同樣:
第一步是計算查詢矩陣、鍵矩陣和值矩陣,以下圖所示:
將前面的計算步驟能夠合併成:
介紹完自注意力機制後,介紹在論文中使用的多頭自注意力機制「multi-headed」 attention。
每一個頭都是獨立的查詢/鍵/值權重矩陣,從而產生不一樣的查詢/鍵/值矩陣。在論文中採用的是8頭,那麼通過8次不一樣權重矩陣運算,咱們會獲得8個不一樣的Z矩陣。
而後咱們將這8個矩陣壓縮成一個矩陣,實現原理是將這8個矩陣拼接在一塊兒,而後再用一個權重矩陣與之相乘,獲得一個融合全部注意力頭信息的矩陣Z,再將其求和與歸一化後傳給前饋層。
Decoding(解碼器):
解碼器內部組件與編碼器大同小異,須要注意的是,解碼器的第一個注意力層被稱做MaskedMulti-Head Attention,經過加入了MASK操做,使得咱們只被容許處理輸出序列中更靠前的那些位置,即咱們只能attend到前面已經處理過的語句。第二個注意力層被稱做encoder-decoder attention layer,由圖二可知,它的query來自前一級的decoder層的輸出,key、value來自encoder的輸出,encoder的輸出能夠幫助解碼器關注輸入序列哪些位置合適。接下來送入前饋層,而後重複這些步驟,直到到達一個特殊的終止符號,它表示transformer的解碼器已經完成了它的輸出。每一個步驟的輸出在下一個時間步被提供給底端解碼器,而且就像編碼器以前作的那樣,這些解碼器會輸出它們的解碼結果 。另外,就像咱們對編碼器的輸入所作的那樣,咱們會嵌入並添加位置編碼給那些解碼器,來表示每一個單詞的位置。
在解碼完成後會輸出一個實數向量,通過一個簡單的全鏈接神經網絡(線性變換層)映射到一個被稱做對數概率(logits)的向量裏,假設從訓練集中學習一萬個單詞,那麼對數概率向量爲一萬個單元格長度的向量——每一個單元格對應某一個單詞的分數。接下來的Softmax 層便會把那些分數變成機率(都爲正數、上限1.0)。機率最高的單元格被選中,而且它對應的單詞被做爲這個時間步的輸出。
transformer中的positional encoding(位置編碼)
(完)