Transformer

Chapter 1: Transformer的誕生

2018年10月,Google發表了一篇論文,推出了BERT模型,橫掃NLP 11項任務。

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding


1.2 Transformer的優勢

相比之前佔領市場的 [[LSTM]] 和 [[GRU]] 模型,Transformer具有兩個優勢:

  1. Transformer能夠利用分佈式GPU進行並行訓練,提升模型訓練效率。
  2. 在分析預測更長的文本時,Transformer在捕捉間隔較長的語義關聯效果更好。

Chapter 2: Transformer架構解析

2.1 認識Transformer架構

  • 學習目標:

    • 瞭解Transformer模型的作用
    • 瞭解Transformer總體架構中各組成部分的名稱
  • Transformer模型的作用:

    • 基於seq2seq架構的Transformer模型可以完成NLP領域的典型任務,如機器翻譯、文本生成等。同時也可以用於建構預訓練語言模型,以支持不同任務的遷移學習。

  • 聲明:

    • 在接下來的架構分析中,我們將假設使用Transformer模型架構處理從一種語言文本到另一種語言文本的翻譯工作,因此很多命名方式遵循NLP中的規則。例如:Embedding層將稱作文本嵌入層,Embedding層產生的張量稱為詞嵌入張量,最後一維將稱為詞向量等。
  • Transformer總體架構圖

  • Transformer總體架構可分為四個部分:

    • 輸入部分
    • 輸出部分
    • 編碼器部分
    • 解碼器部分
  • 輸入部分包含:

    • Input Embeddings
    • Position Encodings
  • 輸出部分包含:

    • Softmax
    • Linear
  • 編碼器部分包含:

    • 由N個編碼器層堆疊而成
    • 每個編碼器層由兩個子層組成:
      • 第一個子層:Multi-head Attention 和 Add & Norm
      • 第二個子層:MLPs 和 Add & Norm
  • 解碼器部分包含:

    • 由N個解碼器層堆疊而成
    • 每個解碼器層包含三個子層:
      • 第一層:Masked Multi-head Attention 和 Add & Norm
      • 第二層:Multi-head Attention 和 Add & Norm
      • 第三層:MLPs 和 Add & Norm

2.2 輸入部分實現

  • 學習目標:

    • 瞭解文本嵌入層和位置編碼的作用
    • 掌握文本嵌入層和位置編碼的實現過程
  • 輸入部分包含:

    • Input Embeddings
    • Position Encodings
  • 文本嵌入層作用:

    • 無論是源文本嵌入還是目標文本嵌入,都是為了將文本中的詞彙數字表示轉換為向量表示,希望在高維空間中捕捉詞彙間的關係。
  • 文本嵌入層代碼分析:

1
2
3
4
5
6
7
8
9
10
import torch 
import torch.nn as nn
import math
class Embeddings(nn.Module):
def __init__(self, d_model, vocab):
super(Embeddings, self).__init__()
self.lut = nn.Embedding(vocab, d_model)
self.d_model = d_model
def forward(self, x):
return self.lut(x) * math.sqrt(self.d_model)

  • 位置編碼器的作用:

    • 由於在Transformer的架構中,沒有直接對詞彙位置信息進行處理,因此需要在Embedding層後加入位置編碼器。位置編碼器能夠將詞彙位置訊息融入詞嵌入張量中,以彌補位置訊息的缺失。
  • 位置編碼器的代碼分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import torch 
import torch.nn as nn
import math
class PositionalEncoding(nn.Module):
def __init__(self, d_model, dropout, max_len=5000):
super(PositionalEncoding, self).__init__()
self.dropout = nn.Dropout(p=dropout)
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len).unsqueeze(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)
def forward(self, x):
x = x + Variable(self.pe[:, :x.size(1)], requires_grad=False) return self.dropout(x)

  • 小節總結:
    • 學習了文本嵌入層的作用:將詞彙的數字表示轉為向量表示,以在高維空間中捕捉詞彙間的關係。
    • 學習並實現了文本嵌入層的類:Embeddings
      • 初始化函數包含d_model(詞嵌入維度)和vocab(詞彙總數)參數,內部使用nn.Embedding進行詞嵌入。
      • forward函數中,將輸入x傳入到Embedding的實例化對象中,並乘以根號下d_model進行縮放。
    • 學習了位置編碼器的作用:
      • 因Transformer中沒有直接處理詞彙位置資訊的機制,需在Embedding層後加入位置編碼器來補充位置訊息。
    • 學習並實現了位置編碼器的類:PositionalEncoding
      • 初始化函數包含d_model(詞嵌入維度)、dropout(置0比率)、max_len(句子最大長度)。
      • forward函數輸入參數x,輸出加入位置編碼訊息的詞彙嵌入張量。
    • 實現了可視化分佈曲線:
      • 確保同一詞彙隨位置不同,其位置嵌入向量會變化;cossin的範圍控制了嵌入值大小,有助於梯度快速計算。

2.3 編碼器部分實現

2.4 解碼器部分實現

2.5 輸出部分實現

2.6 模型建構

2.7 模型基本測試運行


2.8 參考文獻: