谷歌在2017年發表了一篇論文名字教《Attention Is All You Need》,提出了一個只基於attention的結構來處理序列模型相關的問題,好比機器翻譯。傳統的神經機器翻譯大都是利用RNN或者CNN來做爲encoder-decoder的模型基礎,而谷歌最新的只基於Attention的Transformer模型摒棄了固有的定式,並無用任何CNN或者RNN的結構。該模型能夠高度並行地工做,因此在提高翻譯性能的同時訓練速度也特別快。html
Transformer的主體結構圖:算法
模型分爲編碼器和解碼器兩個部分。網絡
編碼器和解碼器的輸入就是利用學習好的embeddings將tokens(通常應該是詞或者字符)轉化爲d維向量。對解碼器來講,利用線性變換以及softmax函數將解碼的輸出轉化爲一個預測下一個token的機率。架構
因爲模型沒有任何循環或者卷積,爲了使用序列的順序信息,須要將tokens的相對以及絕對位置信息注入到模型中去。論文在輸入embeddings的基礎上加了一個「位置編碼」。位置編碼和embeddings由一樣的維度都是\(d_{model}\)因此二者能夠直接相加。有不少位置編碼的選擇,既有學習到的也有固定不變的。框架
論文中用的attention是基本的點乘的方式,就是多了一個所謂的scale。輸入包括維度爲\(d_k\)的queries以及keys,還有維度爲\(d_v\)的values。計算query和全部keys的點乘,而後每一個都除以\(\sqrt{d_k}\)(這個操做就是所謂的Scaled)。以後利用一個softmax函數來獲取values的權重。
實際操做中,attention函數是在一些列queries上同時進行的,將這些queries並在一塊兒造成一個矩陣\(Q\)同時keys以及values也並在一塊兒造成了矩陣\(K\)以及\(V\)。則attention的輸出矩陣能夠按照下述公式計算:函數
\[ Attention(Q,K,V) = softmax({QK^T\over {\sqrt {d_k}}})V \]性能
本文結構中的Attention並非簡簡單單將一個點乘的attention應用進去。做者發現先對queries,keys以及values進行\(h\)次不一樣的線性映射效果特別好。學習到的線性映射分別映射到\(d_k\),\(d_k\)以及\(d_v\)維。分別對每個映射以後的獲得的queries,keys以及values進行attention函數的並行操做,生成\(dv\)維的output值。具體結構和公式以下。學習
\[ MultiHead(Q,K,V) = Concat(head_1,...,head_h) \]編碼
\[ where: head_i = Attention(Q{W_i}^Q,K{W_i}^K,V{W_i}^V) \]spa
Transformer以三種不一樣的方式使用了多頭attention。
每層由兩個支層,attention層就是其中一個,而attention以後的另外一個支層就是一個前饋的網絡。公式描述以下。
\[ FFN(x) = max(0,xW_1 + b_1)W_2 + b_2 \]
模型的總體框架基本介紹完了,其最重要的創新應該就是Self-Attention和Multi-Head Attention的架構。在摒棄傳統CNN和RNN的狀況下,還能提升表現,下降訓練時間。Transformer用於機器翻譯任務,表現極好,可並行化,而且大大減小訓練時間。而且也給咱們開拓了一個思路,在處理問題時能夠增長一種結構的選擇。