当前位置:   article > 正文

bert拿特征last_hidden_state中的第0个词来进行分类如何理解

bert拿特征last_hidden_state中的第0个词来进行分类如何理解

看bert中文文本分类任务,发现训练输出结果向量仅使用了第一个token(就是一句话中的第一个位置)的向量,很明显,这不对。经过查询发现:
最后一层该位对应向量可以作为整句话的语义表示

1、为什么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级别的任务时要注意它。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

同时:

last_hidden_state与pooler_output区别是什么:

在自然语言处理(NLP)中,尤其是在使用基于Transformer的模型(如BERT或RoBERTa)时,last_hidden_state和pooler_output是模型输出的两个关键组成部分。

last_hidden_state:
这是从Transformer模型的最后一层输出的隐藏状态。
对于每个输入 token,last_hidden_state包含一个固定维度的向量,这个向量编码了该 token 的上下文信息。
通常,这些向量被用作进一步的任务特定处理,例如在序列标注任务中使用它们来预测每个 token 的标签,或者在文本分类任务中使用它们来生成文档级别的表示。
pooler_output:
pooler_output通常是模型中的一个附加层,用于生成整个输入序列的单一向量表示。
在BERT模型中,pooler_output是通过应用一个线性层和一个激活函数(通常是Tanh)到last_hidden_state的第一个token(通常是[CLS]标记)的隐藏状态来生成的。
这个输出通常用于分类任务,因为它编码了整个序列的信息。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/772225
推荐阅读
相关标签
  

闽ICP备14008679号