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

时间:2020-07-02 21:25:04

标签: tensorflow machine-learning keras deep-learning bert-language-model

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

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

enter image description here

我们在每个句子中使用[CLS]标记的地方:

enter image description here

Image source

我对此huggingface issuedatascience forum questiongithub issue进行了很多讨论,大多数数据科学家都给出了以下解释:

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

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

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

2 个答案:

答案 0 :(得分:6)

使用[CLS]标记表示整个句子来自original BERT paper,第3节:

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

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

返回

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

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

此输出通常不能很好地概括输入的语义内容,通常最好对整个输入序列的平均隐藏状态序列进行平均或合并

>

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

答案 1 :(得分:1)

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

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