Day 6 了解詞向量與嵌入
- 詞向量 word embeddings : 將詞語轉換為數字表示的方法,這些數字表示的向量具有特定的性質,能夠表示詞語之間的語義和關聯性
- 句子向量 sentence embeddings : 將整個句子表示為向量,在捕捉句子的整體含義、語氣和上下文
如何得到句子向量
- 簡單平均詞向量(Avg word vectors): 把句中每個詞的靜態詞向量取平均(或加權平均),簡單但效果有限,尤其遇到語序、否定等語義結構時會失準
使用預訓練的句子模型 :
- Sentence-BERT (SBERT) : 把 BERT-type 模型經過 siamese / triplet 或 NLI 任務微調,使得直接對句向量做 cos 相似度能反映語意
- Universal Sentence Encoder / InferSent / LASER / LaBSE:其他常見的句子向量模型,設計目標為語意相似度與多語支援
從 Transformer 拿 pooled representation直接用 BERT 的 [CLS] 預測向量或做 mean pooling,但原生 BERT 沒有保證 [CLS] 代表整句語意(因此不如 SBERT 精準)
- BERT(Bidirectional Encoder Representations from Transformers) : 理解上下文的語言代表模型
BERT 與其他模型差別
- BERT:encoder-only,適合分類、NER、句子配對等下游任務。
- GPT:decoder-only(causal LM),適合純生成。
- Encoder-decoder(如 T5):同時做輸入編碼與輸出解碼,適合翻譯、摘要。
Siamese(孿生網路)
- 概念:把同一個 encoder 複製成兩個支路(共享權重),輸入兩個句子各自得到向量,再用相似度函數(例如 cosine)計算距離。
- 用途:常用於句子相似度/檢索任務(正樣本 vs 負樣本)。
- 訓練:以正/負對(sentence A, sentence B, label)訓練,使正樣本對的向量靠近、負樣本對的向量遠離。
Triplet(三元組訓練)
- 概念:每次訓練取三個句子:Anchor(A),Positive(P,與 A 相似),Negative(N,不相似)。
- Loss(典型):triplet loss
L=max(0, margin+d(A,P)−d(A,N))L = \max(0,; \text{margin} + d(A,P) - d(A,N))L=max(0,margin+d(A,P)−d(A,N))
其中 d(⋅,⋅)d(\cdot,\cdot)d(⋅,⋅) 是距離(例如 Euclidean 或 1 - cosine),margin 是超參數。目標:讓 A 與 P 距離比 A 與 N 小至少 margin。
- 用途:用於學習可區別性的向量空間(人臉辨識、句子向量等)。
NLI(自然語言推理,Natural Language Inference)
- 概念:NLI 資料集(如 SNLI、MultiNLI)包含句對 + 標籤:entailment(蕴含)、contradiction(矛盾)、neutral(中立)。
- 如何用來做句子向量:把句對和其 NLI 標籤當 supervision 訓練模型,或把 NLI 資料當作「相似/不相似」的標籤來源來微調,使語義相近(entailment)的句向量靠近。
- SBERT(例子):Sentence-BERT 就把 BERT 用 siamese 結構,並用 NLI 類資料/對作為訓練,讓句向量直接可用於 cos 相似度比較
Universal Sentence Encoder(USE)
- 由 Google 提出,有兩個主要變體:Transformer-based 與 DAN(Deep Averaging Network)。
- 特點:設計為快且直接可用的句子表示;部分變體較輕量(DAN),適合實務快速部署。支援英語與部分多語版本。
InferSent
- 由 Facebook 提出(較早的工作),使用 BiLSTM + max-pooling 的架構,並在 SNLI / MultiNLI 上訓練。
- 特點:在其時代句子相似與文本分類表現很好(比簡單平均詞向量強),但比後來的 transformer-based SBER 類模型小幅落後。
LASER (Language-Agnostic SEntence Representations)
- 由 Facebook AI 提出,是一個多語句子向量系統(BiLSTM + BPE),訓練使用大量平行語料(翻譯文本),目標是不同語言的相同句子產生相似向量(language-agnostic)。支援很多語言,適合跨語檢索 / 翻譯檢索情境。
LaBSE (Language-Agnostic BERT Sentence Embedding)
- 由 Google 提出,是BERT-類的多語句子向量模型,透過平行語料與翻譯排序(translation ranking)類的訓練,使多語句子在向量空間對齊。支援大量語言(多達百餘語),在跨語檢索很受歡迎。
pooled representation(何謂「pooled representation」)
- [CLS] token:取輸出序列的第一個 token 的向量(BERT 的常用做法)。
- mean pooling / average pooling:把所有 token embedding 以平均值合成(通常會考慮 attention_mask,對 pad token 做掩蔽)。
- max pooling:對各維度取最大值。
- attentive pooling:用一個小 attention 層學習加權再合成(通常效果更好但需額外參數)。
[CLS]
-
在 BERT 的輸入格式中,會在序列開頭加入一個特殊 token [CLS](classification token)。對於輸入 [CLS] token_1 token_2 ... token_n [SEP],模型會學到一個 CLS 的輸出向量。
-
用途:在下游的分類任務中常把 CLS 的向量作為整句表示,再接一層 dense 做分類。(因此在 fine-tuning 時 CLS 會學習為分類提供好的表示)
-
注意:BERT-預訓練的目標不是明確讓 CLS 成為通用句子嵌入,因此直接拿原始未經專門微調的 CLS 做語意檢索或相似度比較,常常表現不如經過 SBERT 類訓練後的 pooled vectors。
-
在 Hugging Face 的 AutoModel 回傳的 outputs 通常有兩個相關欄位:
- last_hidden_state[:,0,:]:就是 token 0(CLS)對應的最後隱藏層向量。
- pooler_output:BERT 的 pooler(一個小 dense + tanh)對 CLS 的變換結果(但不是所有 model 都有 pooler_output)。