【自然語言處理】: transformer原理實現

1.seq2seq

一般在我們序列模型當中,都會分爲encoder和decoder兩個部分,如下圖所示:

 

 而我們的transformer變形金剛其實相當於是一種對我們seq2seq的一種升級版本,也就是在seq2seq上加上了self-attention,也就變成了我們的transformer,我們可以看到transformer的結構如下所示:

 

在上面這張圖當中,左邊的就是我們的的encoder,而右邊則是我們的decoder。只是這個encoder和decoder都特別的大哈哈哈

2.Encoder的架構

encoder的架構總體來說是這樣的,我們輸入一排向量,然後相應的,會輸出一排向量。而在我們的輸入和輸出之間,輸入最先經過的層是一個self-attention層。

 

 對於上圖當中的第一個藍色向量而言,首先會經過self-attention層,得到一個向量a,然後這個向量a再和之前原來初始的向量,我們成稱爲向量b,進行相加。得到新的向量a+b,十分類似於殘差神經網絡當中的一個short-cut,也就是進行一個skip connection,進行一個跳級連接。之後再進行一個layer normilization。

而這個layer normalization是什麼意思呢?

也就是將我們這個layer當中所有的數值做一個正太化的處理,也就是使用公式(x-mean)/standard deviation ,就可以得到一個新的數值了。這樣所有的數值也會投射到0-1的一個範圍內。

做了這樣的處理之後,我們看這張圖的最右邊,我們拿到這個normalize之後的向量c,經過一個全連接神經網絡得到d,d和原來的c又進行shortcut,也就是一個risidual的連接。連接之後,再經過一個layer normilization層,這樣就得到最後我們transformer encoder的一個對某一個向量的輸出。

2.Decoder

如果我們把下面這張圖,也就是decoder的中間,將其遮住,那麼我們就可以發現其實encoder和decoder的結構幾乎是一樣的,如下所示:

 

 我們除了在最下方的一個attenton機制,這裏加入的是masked multi head attention,而非普通的multi-head attention.

masked attention和我們普通self attention不同的地方也就是後面一個向量的輸出只會考慮到前面向量的輸入,而不會考慮到後面的的輸入。這個其實是和RNN的道理是相似的,也很有道理。因爲我們的self-attention是考慮到的整個input的輸入。

然後我們的encoder是如何和decoder進行連接的呢?我們的encoder的資訊最後是傳遞到了decoder的中間的multihead attention進行了一個這樣的連接。同時,decoder中間的multihead

 attention和自己的輸入,從masked multi head attention也進行了一個連接。因此我們的decoder中間層擁有了encoder傳遞過來的兩個信息,以及masked multi head attention傳遞過來的一個信息,最終進行我們的訓練。局部的流程圖如下圖所示:

 

 整體的流程圖如下所示:

 

 這就是tranformer的原理啦,希望大家看了之後有所收穫!如有不足,也請大家多多指正!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章