BERT类模型
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基础上专门优化句子嵌入,更适合相似度等任务。