为什么 Bert 转换器使用 [CLS] 令牌进行分类而不是对所有令牌进行平均?

Aad*_*Ura 16 machine-learning deep-learning keras tensorflow bert-language-model

我正在对 bert 架构进行实验,发现大部分微调任务都将最终隐藏层作为文本表示,然后将其传递给其他模型以进行进一步的下游任务。

伯特的最后一层看起来像这样:

在此处输入图片说明

我们取每个句子的 [CLS] 标记:

在此处输入图片说明

图片来源

我经历了许多的讨论继续这一huggingface问题数据科学论坛的问题GitHub的问题大部分数据科学家给出了这样的解释:

BERT 是双向的,[CLS] 是通过多层编码过程编码的,包括所有令牌的所有代表信息。[CLS] 的表示在不同的句子中是单独的。

我的问题是,为什么作者忽略了其他信息(每个令牌的向量)并采用平均值、max_pool 或其他方法来利用所有信息而不是使用 [CLS] 令牌进行分类?

这个 [CLS] 令牌与所有令牌向量的平均值相比有何帮助?

sta*_*010 13

使用[CLS]token来表示整个句子来自BERT原论文,第3节:

每个序列的第一个标记总是一个特殊的分类标记([CLS])。与此标记对应的最终隐藏状态用作分类任务的聚合序列表示。

您的直觉是正确的,平均所有标记的向量可能会产生更好的结果。事实上,这正是 BertModel 的 Huggingface 文档中提到的

退货

pooler_output(torch.FloatTensor:形状(batch_size, hidden_size)):

序列的第一个标记(分类标记)的最后一层隐藏状态由线性层和 Tanh 激活函数进一步处理。线性层权重是在预训练期间根据下一句预测(分类)目标进行训练的。

这个输出通常不是输入语义内容的一个很好的总结,你通常更好地平均或汇集整个输入序列的隐藏状态序列

更新:Huggingface 在 v3.1.0 中删除了该语句(“此输出通常不是语义内容的良好摘要......”)。你得问他们为什么。

  • BERT 和其他上下文语言模型中的嵌入不是静态的。CLS 的嵌入(即实际的 768 个浮点值)将因输入序列而异,因为它是使用注意力(即加权平均值)对所有输入标记嵌入进行计算的。 (2认同)

Jin*_*ich 11

BERT 主要用于迁移学习,即对特定任务的数据集进行微调。如果您对状态进行平均,则每个状态都会以相同的权重进行平均:包括停用词或其他与任务无关的内容。该[CLS]向量是使用自注意力计算的(就像 BERT 中的所有内容一样),因此它只能从其余隐藏状态中收集相关信息。因此,从某种意义上说,[CLS]向量也是标记向量的平均值,只是计算得更巧妙,特别是针对您微调的任务。

此外,我的经验是,当我保持权重固定并且微调 BERT 时,使用令牌平均值会产生更好的结果。