赞
踩
看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级别的任务时要注意它。
同时:
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]标记)的隐藏状态来生成的。
这个输出通常用于分类任务,因为它编码了整个序列的信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。