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

?輸入編碼器是一系列的編碼器的集合,這個(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 層。

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

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

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

2.3 三個(gè)向量
的細(xì)節(jié)
step 1 后面的計(jì)算position都以
為標(biāo)準(zhǔn)
?第一步是根據(jù)每一個(gè)輸入的向量中計(jì)算出三個(gè)向量: , 這些向量通過(guò)原始輸入乘法上三個(gè)矩陣(在訓(xùn)練中學(xué)習(xí)到的)生成。注意到這些新的
的維度要比原始的輸入的維度小很多,只有64(假設(shè))。

step 2
?第二步是計(jì)算一個(gè) ,按照比如第一個(gè)單詞
:

step3
?把這些,從而獲得更為穩(wěn)定的梯度。然后使用Softmax進(jìn)行概率的計(jì)算。來(lái)得到每一個(gè)單詞的在這個(gè)位置(position)的占比或重要程度。
?接著把每一個(gè)進(jìn)行加權(quán)求和(權(quán)重為
),來(lái)得到這一位置的最后輸出向量
。
2.4 向量化表示,三個(gè)向量的矩陣話運(yùn)算表示


?可以從上圖看出,輸入的橫向量堆砌而成的矩陣,經(jīng)過(guò)和三個(gè)變換矩陣的乘積然后得到
這三個(gè)矩陣,然后經(jīng)過(guò)一系列運(yùn)算得到最終的
2.5 Multi-Headed
?我們希望能夠生成多組 從而更好的提升模型的表達(dá)效果

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

2.6 位置編碼 Positional Encoding
?這里方法用到的理念:把這些只跟位置相關(guān)的值加入到后,把他們投影到
后就可以在
過(guò)程中提供有效的距離。

?原文提出了兩種方式:一種是訓(xùn)練出一個(gè)位置編碼,第二種是用原文使用的三角函數(shù)編碼的方式,其具體公式如下:
# 具體的編碼代碼實(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ì)有殘差連接,具體可以如下:
?由上圖可以看出殘差連接會(huì)從下面的一個(gè)Self-Attention的輸入連接到Self-Attention的輸出進(jìn)行操作,具體如下圖所示:

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

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

?由上圖可以看出,解碼器的工作方式和編碼器有些不同,解碼器每一步輸出一個(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步驟之前就把后面的位置填充為符號(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è)單詞。

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))” ).

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

?在經(jīng)歷過(guò)多次的迭代優(yōu)化后,可以讓其在對(duì)應(yīng)的位置達(dá)到很高的概率.
4.
- 讀 Attention Is All You Need 這一篇論文, the Transformer blog post (Transformer: A Novel Neural Network Architecture for Language Understanding), and the Tensor2Tensor announcement.
- 觀看 ?ukasz Kaiser’s talk 從而獲得模型和細(xì)節(jié)
- 實(shí)戰(zhàn)操作 Jupyter Notebook provided as part of the Tensor2Tensor repo
- 探索 Tensor2Tensor repo.
后續(xù)的一些工作:
- Depthwise Separable Convolutions for Neural Machine Translation
- One Model To Learn Them All
- Discrete Autoencoders for Sequence Models
- Generating Wikipedia by Summarizing Long Sequences
- Image Transformer
- Training Tips for the Transformer Model
- Self-Attention with Relative Position Representations
- Fast Decoding in Sequence Models using Discrete Latent Variables
- Adafactor: Adaptive Learning Rates with Sublinear Memory Cost