Bert 中[CLS]的意义

BERT模型在第一句前添加[CLS]标记,用于整句话的语义表示,因为它在经过多层self-attention后能融合所有词的信息,形成无偏的句子表示。此外,BERT的输出包括get_pooled_out()([CLS]的表示)和get_sequence_out()(所有token的向量)。[CLS]更适合句子级任务,而其他token可用于token级任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bert 中[CLS]的意义

BERT在第一句前会加一个[CLS]标志,最后一层该位对应向量可以作为整句话的语义表示,从而用于下游的分类任务等。

为什么选它表示整句话语义?
因为与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。

具体来说,self-attention是用文本中的其它词来增强目标词的语义表示,但是目标词本身的语义还是会占主要部分的,因此,经过BERT的12层,每次词的embedding融合了所有词的信息,可以去更好的表示自己的语义。

而[CLS]位本身没有语义,经过12层,得到的是attention后所有词的加权平均,相比其他正常词,可以更好的表征句子语义。

当然,也可以通过对最后一层所有词的embedding做pooling去表征句子语义。

这里补充一下bert的输出,有两种,在BERT TF源码中对应:

一种是get_pooled_out(),就是上述[CLS]的表示,输出shape是[batch size,hidden size]。

一种是get_sequence_out(),获取的是整个句子每一个token的向量表示,输出shape是[batch_size, seq_length, hidden_size],这里也包括[CLS],因此在做token级别的任务时要注意它。
————————————————
版权声明:本文为优快云博主「凝眸伏笔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:点击链接到

### 使用 BERT 实现中文文本相似度的方法 为了实现基于 BERT 的中文文本相似度计算,需先加载适合中文环境的预训练模型。Hugging Face 提供了多种支持多语言(含中文)的 BERT 变体,如 `bert-base-multilingual-cased` 或专门针对中文优化过的版本 `chinese-bert-wwm-ext`。 #### 加载必要的库和资源 ```python from transformers import BertTokenizer, BertModel import torch.nn.functional as F import torch ``` #### 初始化 Tokenizer 和 Model 选择合适的 tokenizer 和 model 对于处理特定语言非常重要。对于中文而言,建议采用经过良好调优的中文版 BERT 模型。 ```python tokenizer = BertTokenizer.from_pretrained('hfl/chinese-roberta-wwm-ext') model = BertModel.from_pretrained('hfl/chinese-roberta-wwm-ext') ``` #### 文本编码函数 创建一个辅助函数来帮助将输入字符串转换为可用于推理的形式。 ```python def encode_text(text): inputs = tokenizer( text, padding=True, truncation=True, max_length=64, return_tensors="pt" ) with torch.no_grad(): outputs = model(**inputs) embeddings = outputs.last_hidden_state[:, 0, :] # 获取 [CLS] token embedding normalized_embeddings = F.normalize(embeddings, p=2, dim=-1) return normalized_embeddings.squeeze().numpy() ``` #### 计算两个文本之间的相似度分数 通过比较两段文字对应的向量表示间的夹角余弦值作为衡量标准。 ```python def compute_similarity(text_a, text_b): vec_a = encode_text(text_a).unsqueeze(0) vec_b = encode_text(text_b).unsqueeze(0) cosine_sim = F.cosine_similarity(vec_a, vec_b)[0].item() return round(cosine_sim * 100, 2), "%" example_texts = ["我喜欢吃冰淇淋", "我不喜欢吃冰淇淋"] similarity_score = compute_similarity(*example_texts) print(f"The similarity score between the two sentences is {similarity_score}") ``` 此方法能够有效地评估不同句子间的意义关联程度,尽管有时可能会遇到一些挑战,比如当涉及到语义反转的情况时[^5]。然而,随着技术的发展,这些局限正在逐渐被克服。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值