詳解谷歌機(jī)器翻譯模型:Transformer2021-03-06

詳解谷歌機(jī)器翻譯模型:Transformer

1. 模型框/架

?Transformer 是谷歌提出的機(jī)器翻譯模型。其包括了一個(gè)編碼器Encoder和Decoder,這是一個(gè)翻譯的模型,將源語(yǔ)言input進(jìn)編碼器,然后通過(guò)解碼器輸出模型 ??梢员硎緸槿缦?/p>

圖1:整個(gè)Transformer由編碼器和解碼器組成

?輸入編碼器是一系列的編碼器的集合,這個(gè)編碼器是,論文中包括了六個(gè)編碼器(六個(gè)并沒有特殊的要求),同樣,解碼器就是也是由六個(gè)編碼器堆疊而成的如圖2。

圖二

? 六個(gè)編碼器都是一樣的結(jié)構(gòu)(盡管他們并不共享權(quán)重),每一個(gè)都可以分解為如下的兩個(gè)子層,即子注意力。

圖三:

?輸入首先經(jīng)過(guò)一個(gè)Self-Attention層作為輸入,這一層在編碼一個(gè)句子中指定的單詞的時(shí)候可以幫助觀察到其他的單詞,輸出。

?Self-Attention的輸出被送入前饋神經(jīng)網(wǎng)絡(luò),并且一個(gè)句子的每個(gè)單詞在送入前饋神經(jīng)網(wǎng)絡(luò)中都是獨(dú)立的,不會(huì)交叉輸入。

?解碼器也有這些層,但是在自注意層和前饋層還有一個(gè)Encoder-Decoder Attention 層,并且在堆疊的這些編碼器的頂部通往每一個(gè),堆疊的解碼器中的每一個(gè)Encoder-Decoder Attention 層。

圖4

2. 具體的步驟

2.1 Embedding algorithm

?一般都會(huì)把每一個(gè)單詞使用embedding algorithm編碼成一個(gè)向量,這種編碼發(fā)生在編碼器最底部的輸入之前。如下是把其編碼成了512個(gè)維度:

圖5

?在上圖我們可以看到一個(gè)句子的輸入會(huì)在自己對(duì)應(yīng)的位置開始輸入,一般會(huì)設(shè)置一個(gè)輸入的最長(zhǎng)的長(zhǎng)度如N=1000即每次最多能輸入和翻譯1000個(gè)單詞。

2.2 使用單詞進(jìn)行具體說(shuō)明
圖6

?對(duì)于下面這句話:
The animal didn't cross the street because it was too tired. 中的 it 指的是什么,自注意力就可以把它和 animal 相關(guān)聯(lián)。

圖7
2.3 三個(gè)向量Query\,vector,Key\,vector和Value\, vector的細(xì)節(jié)
step 1 后面的計(jì)算position都以1為標(biāo)準(zhǔn)

?第一步是根據(jù)每一個(gè)輸入的向量中計(jì)算出三個(gè)向量: Query\,vector,Key\,vector和Value\, vector, 這些向量通過(guò)原始輸入乘法上三個(gè)矩陣(在訓(xùn)練中學(xué)習(xí)到的)生成。注意到這些新的vector的維度要比原始的輸入的維度小很多,只有64(假設(shè))。

圖8
step 2

?第二步是計(jì)算一個(gè) score ,按照比如第一個(gè)單詞x_1:score(x_1,x_1) = q1\cdot k1,score(x_1,x_2)=q1,k2 \cdots

圖9
step3

?把這些score/8(讓其為\sqrt{Key\,vector的維度}),從而獲得更為穩(wěn)定的梯度。然后使用Softmax進(jìn)行概率的計(jì)算。來(lái)得到每一個(gè)單詞的在這個(gè)位置(position)的占比或重要程度。

?接著把每一個(gè)(Value \,vector)*(Softmax\,score)進(jìn)行加權(quán)求和(權(quán)重為Softmax\,score),來(lái)得到這一位置的最后輸出向量z_1

2.4 向量化表示,三個(gè)向量的矩陣話運(yùn)算表示
圖10
圖11

?可以從上圖看出,輸入的橫向量堆砌而成的矩陣,經(jīng)過(guò)和三個(gè)變換矩陣的乘積然后得到

Query\,matrix,Key\,matrix和Value\, matrix這三個(gè)矩陣,然后經(jīng)過(guò)一系列運(yùn)算得到最終的Z matrix

2.5 Multi-Headed

?我們希望能夠生成多組 Q,K,V從而更好的提升模型的表達(dá)效果

圖12

?對(duì)于生成的各組z我們也會(huì)通過(guò)增廣矩陣的形式并乘上一個(gè)權(quán)重矩陣從而得到最后的z ,如下圖所示

圖13
2.6 位置編碼 Positional Encoding

?這里方法用到的理念:把這些只跟位置相關(guān)的值加入到embedding后,把他們投影到Q/K/V后就可以在dot\,product\,attention過(guò)程中提供有效的距離。

圖14

?原文提出了兩種方式:一種是訓(xùn)練出一個(gè)位置編碼,第二種是用原文使用的三角函數(shù)編碼的方式,其具體公式如下:
PE(pos)= \begin{cases} sin\left( \cfrac {pos}{10000^{\cfrac{i}{d_{model}}}}\right) if\, i為偶數(shù) \\ cos\left( \cfrac {pos}{10000^{\cfrac{i-1}{d_{model}}}}\right) if\,i為奇數(shù) \end{cases}\\ 注:使用三角函數(shù)是因?yàn)槿呛瘮?shù)的性質(zhì)既可以考慮到絕對(duì)位置又可以考慮到相對(duì)位置\\ cos(\alpha + \beta)=cos(\alpha)*cos(\beta)-sin(\alpha)*sin(\beta)\\ sin(\alpha+\beta)=sin(\alpha)*cos(\beta)+cos(\alpha)*sin(\beta)\\ 通過(guò)這些公式可以通過(guò)位置k的先行表達(dá)來(lái)表示位置k+x

# 具體的編碼代碼實(shí)現(xiàn),可以了解一下
class PositionalEncoding(nn.Module):
    "Implement the PE function."
    def __init__(self, d_model, dropout, max_len=5000):
        super(PositionalEncoding, self).__init__()
        self.dropout = nn.Dropout(p=dropout)
        (
        # Compute the positional encodings once in log space.
        pe = torch.zeros(max_len, d_model)  # (max_words_nums,d_model)維度矩陣
        position = torch.arange(0, max_len).unsqueeze(1)    # 生成一個(gè)[0,1...max_len-1]的列向量,維度為(max_len,1)
        div_term = torch.exp(torch.arange(0, d_model, 2) *
                             -(math.log(10000.0) / d_model))
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        pe = pe.unsqueeze(0)
        self.register_buffer('pe', pe)  #使用這個(gè)函數(shù) 是為了不放入模型的self.parameters(),而是注冊(cè)一個(gè)緩沖區(qū)進(jìn)行保存
    def forward(self, x):
        x = x + Variable(self.pe[:, :x.size(1)], 
                         requires_grad=False)
        return self.dropout(x)
2.7 殘差塊

?在Encoder之間會(huì)有殘差連接,具體可以如下:
圖15

?由上圖可以看出殘差連接會(huì)從下面的一個(gè)Self-Attention的輸入連接到Self-Attention的輸出進(jìn)行Add和Normalize操作,具體如下圖所示:

圖16

?同時(shí)解碼器也有同樣的結(jié)構(gòu),具體的可以用下圖來(lái)表示:

圖17
2.8 解碼器工作

?編碼器以處理輸入序列作為開始,最頂端的編碼器輸出的Q,K,V會(huì)送入解碼器的每一個(gè)Encoder-Decoder\,Attention層,從而能讓解碼器注意到適當(dāng)?shù)奈恢谩?/p>

圖18

?由上圖可以看出,解碼器的工作方式和編碼器有些不同,解碼器每一步輸出一個(gè)元素,并重復(fù)這個(gè)過(guò)程直到輸出一個(gè)特定的符號(hào)來(lái)表示一個(gè)翻譯的結(jié)尾。,每一步的輸出在下一次運(yùn)算時(shí)被送入底部的解碼器,并且項(xiàng)編碼器一樣被加入了位置信息。

?Decoder中的Self-Attention層和Decoder中的有一些的區(qū)別,在Decoder中,self-attention layer 僅僅能訪問之前輸出的Output,這是通過(guò)在self-attenion 計(jì)算過(guò)程中Softmax步驟之前就把后面的位置填充為-inf符號(hào)來(lái)實(shí)現(xiàn)的。

2.9 最后的Linear 和Softmax Layer

?解碼器把輸出堆疊為浮點(diǎn)型向量,這個(gè)向量通過(guò)Linear層后跟Softmax layer 來(lái)實(shí)現(xiàn)的。通過(guò)Softmax layer算的對(duì)數(shù)概率,最后輸出概率最大的那個(gè)單詞。

圖19

3. 訓(xùn)練的一些細(xì)節(jié)

?在訓(xùn)練過(guò)程中,可以把標(biāo)注和輸出進(jìn)行監(jiān)督學(xué)習(xí).為了可視化這個(gè)過(guò)程,假設(shè)輸出詞匯僅包含六個(gè)單詞(“a”, “am”, “i”, “thanks”, “student”, and “<eos>(eos是句子的結(jié)束符號(hào))” ).

圖20

?沒有訓(xùn)練的輸出可以比較雜亂無(wú)章, 他們之間的loss就可以用一些交叉熵和KL散度等其他的方式來(lái)計(jì)算.

圖21

?在經(jīng)歷過(guò)多次的迭代優(yōu)化后,可以讓其在對(duì)應(yīng)的位置達(dá)到很高的概率.

4.

后續(xù)的一些工作:

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

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