我正在对 bert 架构进行实验,发现大多数微调任务都将最终的隐藏层作为文本表示,然后将其传递给其他模型以进行进一步的下游任务。
Bert 的最后一层如下所示:
我们获取每个句子的 [CLS] 标记:
图片来源 https://jalammar.github.io/a-visual-guide-to-using-bert-for-the-first-time/
我对此进行了多次讨论拥抱问题 https://github.com/huggingface/transformers/issues/1950, 数据科学论坛问题 https://datascience.stackexchange.com/questions/66207/what-is-purpose-of-the-cls-token-and-why-its-encoding-output-is-important, github问题 https://github.com/google-research/bert/issues/196大多数数据科学家给出了这样的解释:
BERT 是双向的,[CLS] 被编码,包括所有
通过多层的所有代币的代表性信息
编码过程。 [CLS] 的表示是单独的
不同的句子。
我的问题是,为什么作者忽略其他信息(每个标记的向量)并采用平均值、max_pool或其他方法来利用所有信息而不是使用[CLS]标记进行分类?
与所有标记向量的平均值相比,这个 [CLS] 标记有何帮助?
BERT 主要是为迁移学习而设计的,即对特定任务数据集进行微调。如果对状态进行平均,则每个状态都会以相同的权重进行平均:包括停用词或与任务不相关的其他内容。这[CLS]
向量是使用自注意力计算的(就像 BERT 中的所有内容一样),因此它只能从其余隐藏状态收集相关信息。所以,从某种意义上说[CLS]
向量也是令牌向量的平均值,只是计算得更巧妙,特别是针对您微调的任务。
另外,我的经验是,当我保持重量固定并且do not微调 BERT,使用 token 平均值会产生更好的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)