簡介
transformer是一個sequence to sequence(seq2seq)的模型,它可以應用在語音識別(普通話到中文)、機器翻譯(中文到英文)、語音翻譯(普通話到英文)、nlp(input文本與問題,output答案)等眾多領域。


seq2seq模型在transformer出現之前就已經提出了(左下圖),但是由transformer發揚光大(右圖),主要由編碼器(encoder)和解碼器(decoder)兩部分組成。

Encoder
輸入vector set,輸出等長的vector set;如下圖,可以看到transformer中encoder的幾個關鍵部分:positional encoding、multi-head attention、add & norm、feed forward

其中positional encoding和multi-head attention在[https://www.cnblogs.com/wangxy323/articles/15635321.html](self attention)中已經介紹。如下圖,encoder的輸入經過若干個block后得到輸出,其中block的具體結構已給出。

與之前self attention不同的是,這里多了一些操作:一是self attention輸出后與輸入進行了相加;二是相加后進行了normalization(這里是layer normalization,需區別下batch normalization)。即add & norm的含義就是residual+layer normalization(Bert的encoder也是這樣)

Decoder
Decoder有兩種方式,autoregressive與non-autoregressive,先看下主流的自回歸,如下圖,首先需要一個特殊的記號(special token)來表征開始,從而輸出第一個字,這里的輸出經過softmax后是一個概率分布。假設共有4k個字,那么輸出就是一個維度為4k的vector,概率值最大的維度即答案,也就是多分類問題。

接着,將第一個輸出轉換為one hot vector后作為第二個輸入,比如第一個輸出為[0.8,0.1,0.1],則轉換為[1,0,0]來作為第二個輸入,並以此類推。

這樣會有一個問題,因為我們不知道output sequence的正確長度,所以輸出是永遠不會停止的。解決方法就是引入一個end記號,輸出end時就可以停止了。


如果我們忽略encoder輸入連接到decoder的部分,decoder的結構圖如下所示,可以看到,不同的地方是masked multi-head attention,masked表示每個輸入在做self attention時,只考慮其前面的輸入,不考慮后面的。這是非常符合現實的,因為對於第t個輸入,它之后的輸入都還沒有出現。

接下來,是非自回歸的方式,與AT一個接一個輸出不同,NAT是一次輸出結果(注意輸入全是start)。

最后,是我們忽略的部分,即cross attention,即encoder的輸出與decoder部分作cross attention;



