一、Transformer 中的詞嵌入是什么?
1. 定義與作用
? 詞嵌入(Word Embedding):將離散的詞語映射為低維連續向量,捕捉語義和語法信息。
? 在 Transformer 中的位置:
? 輸入層:每個詞通過嵌入層轉換為向量(如 embedding_dim=512
)。
? 輸出層:解碼器輸出的向量通過反向嵌入映射回詞表概率(如 logits = decoder_output * embedding_matrix^T
)。
2. 與 Word2Vec 的對比
特性 | Word2Vec | Transformer 中的詞嵌入 |
---|---|---|
上下文相關性 | 靜態(每個詞僅一個向量) | 動態(同一詞在不同上下文中向量不同) |
訓練方式 | 獨立預訓練(無監督) | 端到端學習(通常結合預訓練任務) |
多義詞處理 | 無法區分多義詞 | 基于上下文動態調整(如 BERT) |
位置信息 | 無 | 通過位置編碼(Positional Encoding) |
參數規模 | 較小(僅詞表大小 × 嵌入維度) | 較大(嵌入層是模型的一部分) |
二、Transformer 詞嵌入的核心革新
1. 上下文相關(Contextualized Embeddings)
? 問題:Word2Vec 的靜態詞向量無法處理一詞多義(例如“bank”在“river bank”和“bank account”中的不同含義)。
? 解決方案:Transformer 通過自注意力機制動態調整詞向量:
? 輸入序列中的每個詞向量在編碼過程中與其他詞交互,生成上下文相關的表示。
? 示例:在句子 Apple launched a new phone
中,“Apple”的向量會包含“phone”的語義;而在 Apple pie is delicious
中,“Apple”的向量會包含“pie”的語義。
2. 位置編碼(Positional Encoding)
? 問題:Transformer 拋棄了 RNN 的時序結構,需顯式注入位置信息。
? 實現方式:
? 絕對位置編碼:通過正弦函數或可學習向量編碼詞的位置(原始論文方法):
P E ( p o s , 2 i ) = sin ? ( p o s / 1000 0 2 i / d model ) PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{\text{model}}}) PE(pos,2i)?=sin(pos/100002i/dmodel?) P E ( p o s , 2 i + 1 ) = cos ? ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i+1)} = \cos(pos10000^{2i/d_{\text{model}}}) PE(pos,2i+1)?=cos(pos100002i/dmodel?)
? 相對位置編碼:某些變體(如 Transformer-XL)編碼詞之間的相對距離。
3. 預訓練任務驅動
? 預訓練任務:Transformer 的詞嵌入通常通過大規模預訓練任務學習:
? BERT:掩碼語言模型(Masked Language Model, MLM) + 下一句預測(Next Sentence Prediction, NSP)。
? GPT:自回歸語言模型(預測下一個詞)。
? 優勢:
? 詞嵌入不僅包含通用語義,還編碼了任務相關的知識(如句間關系、長程依賴)。
三、Transformer 詞嵌入的技術細節
1. 嵌入層的數學表示
? 給定詞表大小為 V V V,嵌入維度為 d d d,嵌入層是一個 V × d V \times d V×d的矩陣。
? 輸入序列 [ w 1 , w 2 , . . . , w n ] [w_1, w_2, ..., w_n] [w1?,w2?,...,wn?] 經過嵌入層后得到矩陣 X ∈ R n × d X \in \mathbb{R}^{n \times d} X∈Rn×d,再與位置編碼 P P P 相加:
X final = X + P X_{\text{final}} = X + P Xfinal?=X+P
2. 與自注意力的交互
? 自注意力機制通過查詢(Query)、鍵(Key)、值(Value)矩陣對詞向量進行交互:
Attention ( Q , K , V ) = softmax ( Q K ? d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk??QK??)V
? 結果:每個詞的輸出向量是所有詞向量的加權和,權重由語義相關性決定。
3. 跨層信息傳遞
? Transformer 的每一層(Layer)都會更新詞向量:
? 底層編碼局部語法(如詞性)。
? 高層編碼全局語義(如指代消解、情感傾向)。
四、實例分析:BERT 的嵌入層
1. 輸入表示
BERT 的輸入嵌入由三部分組成:
- 詞嵌入(Token Embeddings):將詞語映射為向量。
- 位置嵌入(Position Embeddings):可學習的位置編碼。
- 段嵌入(Segment Embeddings):區分句子對(如問答任務中的問題和答案)。
2. 掩碼語言模型(MLM)
? 訓練任務:隨機遮蓋輸入中的某些詞(如替換為 [MASK]
),讓模型預測被遮蓋的詞。
? 對詞嵌入的影響:
? 迫使模型通過上下文推斷被遮蓋詞,增強嵌入的上下文敏感性。
? 示例:在句子 The [MASK] sat on the mat
中,模型需根據 sat
和 mat
推斷 [MASK]
可能是 cat
。
3. 輸出示例
? 輸入詞 bank
在不同上下文中的 BERT 嵌入向量:
? 上下文 1:river bank
→ 向量靠近 shore
, water
。
? 上下文 2:bank account
→ 向量靠近 money
, finance
。
五、代碼示例:Transformer 嵌入層的實現(PyTorch)
import torch
import torch.nn as nnclass TransformerEmbedding(nn.Module):def __init__(self, vocab_size, embed_dim, max_seq_len, dropout=0.1):super().__init__()self.token_embed = nn.Embedding(vocab_size, embed_dim)self.pos_embed = nn.Embedding(max_seq_len, embed_dim) # 可學習的位置編碼self.dropout = nn.Dropout(dropout)def forward(self, x):# x: [batch_size, seq_len]positions = torch.arange(x.size(1), device=x.device).unsqueeze(0)token_emb = self.token_embed(x) # [batch_size, seq_len, embed_dim]pos_emb = self.pos_embed(positions) # [1, seq_len, embed_dim]return self.dropout(token_emb + pos_emb)# 使用示例
vocab_size = 10000
embed_dim = 512
max_seq_len = 128
model = TransformerEmbedding(vocab_size, embed_dim, max_seq_len)input_ids = torch.randint(0, vocab_size, (32, max_seq_len)) # 模擬輸入(batch_size=32)
output_emb = model(input_ids) # [32, 128, 512]
六、總結:Transformer 的詞嵌入
- 上下文動態調整:通過自注意力機制捕捉長距離依賴,解決一詞多義。
- 預訓練賦能:在大規模語料上預訓練,使詞嵌入包含豐富的世界知識。
- 位置感知:顯式編碼位置信息,彌補無時序結構的缺陷。
- 端到端學習:嵌入層與模型其他部分聯合優化,適應具體任務需求。