BERT类模型

发布于:2025-05-11 ⋅ 阅读:(19) ⋅ 点赞:(0)

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, BertForSequenceClassification

tokenizer = 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 BertModel

model = 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 SentenceTransformer

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

网站公告

今日签到

点亮在社区的每一天
去签到