1. BERT類模型是否需要處理 [CLS]
或池化?
那首先搞懂 [CLS]
和池化
(1)[CLS]
的作用
BERT 的輸入格式中,每個序列的開頭會添加一個特殊的 [CLS]
Token(Classification Token)。它的設計初衷是為分類任務提供全局的句子表示:
- 原始BERT預訓練時:
[CLS]
的隱藏狀態被用于“下一句預測(NSP)”任務,判斷兩個句子是否連續。 - 微調階段:在單文本分類任務(如情感分析)中,
[CLS]
的向量會被輸入一個分類層(如全連接層)進行預測。
(2)池化的作用
如果任務需要句子級表示(如語義相似度),直接使用 [CLS]
效果可能不佳(因其在預訓練時主要針對NSP任務優化),此時需要對所有Token的隱藏狀態進行池化:
- 均值池化(Mean Pooling):對所有Token的向量取平均。
- 最大值池化(Max Pooling):取每個維度上的最大值。
[CLS]
池化:直接使用[CLS]
的向量(簡單但可能不魯棒)。
結論:
- 需要處理
[CLS]
或池化:當任務需要句子級表示(如分類、相似度)時,必須選擇一種方式聚合Token向量。 - 無需處理:如果任務是Token級的(如命名實體識別、問答),直接使用各Token的隱藏狀態即可。
BERT在預訓練階段的兩個核心任務,通過這兩個任務讓模型學會語言理解和句子關系建模:
(1)掩碼語言模型(Masked Language Model, MLM)
- 目標:隨機遮蓋輸入文本中的部分Token(如15%),讓模型預測被遮蓋的單詞。
- 示例:
輸入:"The [MASK] sat on the mat."
模型需預測[MASK]
的位置可能是"cat"
。 - 作用:迫使模型學習上下文相關的詞表示(解決一詞多義問題)。
(2)下一句預測(Next Sentence Prediction, NSP)
- 目標:判斷兩個句子是否是連續的文本片段。
- 示例:
輸入:"[CLS] Sentence A [SEP] Sentence B [SEP]"
標簽:1
(連續)或0
(不連續)。 - 作用:讓模型理解句子間的關系,對段落級任務(如問答、推理)有幫助。
為什么這兩個任務重要?
- MLM:使模型掌握詞匯和語法知識(類似完形填空)。
- NSP:使模型理解句子間的邏輯關聯(對需要上下文的任務至關重要)。
3. 與Sentence-BERT的關系
- 原始BERT的局限性:
MLM和NSP的預訓練目標并非直接優化句子嵌入,導致直接用[CLS]
或簡單池化的句向量質量不高。 - Sentence-BERT的改進:
通過微調階段使用句子對(如孿生網絡)和對比損失(如余弦相似度),專門優化句向量的語義表達。
4. 代碼示例對比
(1)原始BERT:使用 [CLS]
進行分類
from transformers import BertTokenizer, BertForSequenceClassificationtokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')inputs = tokenizer("Hello, world!", return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits # 分類得分(基于[CLS]向量)
(2)原始BERT:手動池化生成句向量
from transformers import BertModelmodel = BertModel.from_pretrained('bert-base-uncased')
inputs = tokenizer("Hello, world!", return_tensors="pt")
outputs = model(**inputs)# 均值池化
token_embeddings = outputs.last_hidden_state # [1, seq_len, 768]
sentence_embedding = token_embeddings.mean(dim=1) # [1, 768]
(3)Sentence-BERT:直接生成優化后的句向量
from sentence_transformers import SentenceTransformermodel = SentenceTransformer('all-MiniLM-L6-v2')
sentence_embedding = model.encode("Hello, world!") # 已優化池化
5. 總結
問題 | 答案 |
---|---|
BERT是否需要處理 [CLS] /池化? | 是,當任務需要句子級表示時(如分類、相似度),需選擇 [CLS] 或池化方法。 |
MLM和NSP的作用 | MLM學習詞匯和上下文,NSP學習句子關系,兩者共同構成BERT的預訓練目標。 |
Sentence-BERT的改進 | 通過微調直接優化句向量,避免原始BERT的池化缺陷。 |
簡單來說:
- BERT像是一個“語言通才”,通過MLM和NSP學會基礎語言能力。
- Sentence-BERT是“語義專家”,在BERT基礎上專門優化句子嵌入,更適合相似度等任務。