【学习记录】关于向量模型中CLS pooling的思考

最近在研究embedding模型,发现向量模型大多是通过[CLS]来进行语义表征,比较好奇为什么[CLS]能表征单个句子的语义,比如bge是使用CLS作为sentence embedding

bge:BAAI/bge-large-zh · HF Mirror

With the transformers package, you can use the model like this: First, you pass your input through the transformer model, then you select the last hidden state of the first token (i.e., [CLS]) as the sentence embedding.

向量模型通常是基于BERT架构 ,Input会在句首加上一个[CLS]标签, CLS是classification的缩写,而CLS的输出能表征整个句子的含义,用于文本分类等下游任务。

选择CLS标签是因为其本来不具备语义,但是经过self-Attention层(Self-Attention 的核心是用文本中的其它词来增强目标词的语义表示)后,CLS很好地融合了整个句子的语义信息,可以理解为,将整个句子的语义信息都“平均”到了CLS上,因此CLS能够比较好地表征整个句子的语义。

除了CLS外,也有pooling方法是通过直接average整个最后一层的embedding实现的

另外收集信息时发现知乎上一个比较有趣的问题:

bert最后输出的字表示是使用固定的分类层进行分类的,为什么能区分一字多义?

### CLS Token的作用和意义 在大型视觉转换器(ViT)和其他基于变换器的大规模预训练模型中,CLS token扮演着至关重要的角色。这个特殊标记被添加到输入序列的开头位置,在整个编码过程中保持不变,并最终用于表示整个输入样本的整体特征[^1]。 #### 与传统方法的区别 相比于卷积神经网络(CNN)采用的全局平均池化(GAP),CLS token允许模型通过自注意机制自动捕捉图像或文本数据中的长期依赖关系以及上下文信息,从而获得更有效的全局描述符。具体来说: - **CNN 的全局池化 (GAP)**:通常会将最后一层产生的多通道特征映射压缩成固定长度向量; - **CLS Token**:则是在初始阶段就加入的一个额外维度,经过多次自我关注后能够集中反映所有patch embedding的信息; 这种设计不仅简化了架构还提高了表达能力,因为CLS token可以通过反向传播调整其权重以更好地适应特定任务需求[^4]。 另外值得注意的是,在某些改进版本如DeiT里也存在不使用CLS token的情况,而是采取均值汇聚(mean pooling)的方式代替之。然而,相较于简单的统计汇总手段而言,CLS token提供了一种更为灵活且具备更强泛化性的解决方案。 ```python import torch from transformers import ViTModel, ViTConfig config = ViTConfig() model = ViTModel(config) # 假设我们有一个batch_size=2, sequence_length=197(包括cls_token), hidden_size=768的输入张量 input_ids = torch.randn((2, 197, 768)) outputs = model(inputs_embeds=input_ids) last_hidden_state = outputs.last_hidden_state[:,0,:] # 取出CLS token对应的隐藏状态 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值