Transformer詳解(一):從RNN到Attention機(jī)制

對于《Attention is all you need》這篇文章中提到的transformer模型,自己最初閱讀的時候并不是很理解,于是決定從頭開始,一點(diǎn)一點(diǎn)梳理transformer模型的由來。整個文章計劃分成三個部分,第一部分,也就是本文,將重點(diǎn)介紹一下NLP方面對于seq2seq的基本發(fā)展。第二部分,將講解attention機(jī)制的各個細(xì)節(jié)。最后一部分,將介紹transformer模型的具體結(jié)構(gòu)。

基本RNN結(jié)構(gòu)

對于自然語言處理中的問題,相比較傳統(tǒng)的詞袋模型和普通的前饋神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),RNN結(jié)構(gòu)可以更好的考慮到句子中詞的先后順序所帶來的不同影響。
RNN的基本結(jié)構(gòu)如下圖所示。


整個RNN分成3個部分,輸入,輸出,和中間的隱狀態(tài)(hidden state)。隱狀態(tài)與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)最大的不同是會接受上一時刻的隱狀態(tài)。
對于h1而言,
h_1 = f(Ux_1+Wh_0+b)

這里的U,W,b分別是對應(yīng)的參數(shù)。f是激活函數(shù)。
h2的計算公式和h1相同,只不過對應(yīng)的h和x要做改變。
可以看出,要計算當(dāng)前時刻的隱狀態(tài)
h_t
,需要2個輸入。一個是當(dāng)前的輸入
x_t
,另外一個就是上一時刻的隱狀態(tài)
h_{t-1}

這里有一個地方需要注意,在RNN中,U,W,b這三個參數(shù)在不同的隱狀態(tài)中也是相同的。也就是說參數(shù)是共享的。
計算得到隱狀態(tài)后,要計算當(dāng)前時刻的輸出。
y_t = Softmax(Vh_t+c)

注意這里的參數(shù)V和c也是共享的。
以上就是最基本的RNN模型,這個模型中,輸入的個數(shù)嚴(yán)格的等于輸出。是標(biāo)準(zhǔn)的N對N。下面將介紹幾種RNN的常見變種。

RNN變種

N vs 1

相比于以前每一個輸入對應(yīng)一個輸出,當(dāng)前模型只在最后的一個時刻輸出。



最常見的使用場景就是做文本分類,將最后一個時刻的輸出作為類別的判斷。

1 vs N

與上一個模型相反,這次是輸入只有一個。
一種情況是把輸入作為最初階段的輸入:



另一種情況是在每個階段,都把X作為輸入:



這種結(jié)構(gòu)可以應(yīng)用的場景有: 圖像生成文字等
N vs M

接下來就要引出本文的核心結(jié)構(gòu)了,當(dāng)RNN的輸入和輸出是N vs M這種結(jié)構(gòu)時,這種結(jié)構(gòu)也被稱作Encoder-Decoder 模型,也可以被稱作 seq2seq模型。

Encoder-Decoder 模型

對于Encoder-decoder 模型,最抽象的一種表示如下圖所示


Encoder網(wǎng)絡(luò)負(fù)責(zé)將輸入進(jìn)行編碼,得到語義的編碼C。 Decoder網(wǎng)絡(luò)負(fù)責(zé)根據(jù)得到的編碼C,進(jìn)行解碼,解碼后輸出結(jié)果。一個很常見的encoder-decoder的例子就是機(jī)器翻譯,例如中譯英,講中文作為輸入放進(jìn)encode網(wǎng)絡(luò),再將其解碼后輸出英文。
對于作為輸入的中文,我們把它看成給定的輸入句子,Source。經(jīng)過解碼后輸出的英文,就是目標(biāo)句子Target。整個流程可以總結(jié)為
Source =<x_1,x_2,x_3,...,x_n>

C = f(Souce)

y_i = g(C,y_1,y_2,...,y_{i-1})

Target = <y_1,y_2,y_3,...,y_m>

以上的流程就是基本的encoder-decoder模型的流程,把編碼后的C作為最初的輸入給decoder網(wǎng)絡(luò)。decoder網(wǎng)絡(luò)會根據(jù)C和上一個時間點(diǎn)的輸出,輸出當(dāng)前時間點(diǎn)的輸出。直到最后輸出終止符的時候,停止輸出。
對于編碼后的C,有時也會把C作為輸入,輸入給每一個y。對于C的不同使用,見下圖示例,但是通常都是把C當(dāng)做初始狀態(tài)h0。
c作為decoder的初始狀態(tài)h0

c作為decoder的每一步輸入

當(dāng)然,對于C的計算,也有很多種方法。最簡單的方法就是把最后一個時刻的隱狀態(tài)賦值給C。也就是
h_n = C
,也可以對最后一步的隱狀態(tài)變化后再賦值,或者可以對全部的隱狀態(tài)都做一個變換。
以上就是最常見的Encoder-Decode網(wǎng)絡(luò)的結(jié)構(gòu),那么缺點(diǎn)也很明顯。首先,對于輸入的句子沒有區(qū)分,在decoder輸出時,會把整個輸入的句子平等看待。而以人翻譯句子的習(xí)慣來看,這是不正常的。 第二個問題,如果僅僅把C作為初始狀態(tài)進(jìn)行輸入,隨著RNN網(wǎng)絡(luò)的推進(jìn),傳到后面時前面的信息已經(jīng)非常小了。對于以上情況的改進(jìn),就是下一篇文章要提出的attention機(jī)制。

參考文獻(xiàn)

[1]完全圖解RNN、RNN變體、Seq2Seq、Attention機(jī)制
[2]深度學(xué)習(xí)中的注意力模型(2017版)
[3]從Encoder到Decoder實(shí)現(xiàn)Seq2Seq模型

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容