keras BERT -合并输出与序列输出的第一个向量不同

7nbnzgx9  于 2022-11-24  发布在  其他
关注(0)|答案(4)|浏览(343)

我在Tensorflow中使用BERT,有一个细节我不太明白。根据文档(https://tfhub.dev/google/bert_uncased_L-12_H-768_A-12/1),池输出是整个序列的输出。根据原始论文,这似乎是在setence开始时标记“CLS”的输出。

pooled_output[0]

但是,当我查看与句子中第一个标记对应的输出时

setence_output[0,0,:]

我相信它对应于标记“CLS”(句子中的第一个标记),两个结果是不同的。

eoigrqb6

eoigrqb61#

pooled_outputsequence_output的意图是不同的。由于在输出层来自BERT模型的嵌入已知为上下文嵌入,所以第一令牌(即[CLS]令牌)的输出将捕获足够的上下文。因此,BERT论文的作者发现,对于少数任务(如分类),仅使用第一个令牌的输出就足够了。他们将此输出称为单个令牌的输出(即,第一令牌)表示为pooled_output
由于TFHub模块的源代码不可用,并且假设TFHub将使用与BERT作者的代码的开源版本相同的实现(https://github.com/google-research/bert/).如modeling.py脚本的源代码所给出(https://github.com/google-research/bert/blob/bee6030e31e42a9394ac567da170a89a98d2062f/modeling.py),即pooled_output(通常由get_pooled_output()函数调用),返回第一个令牌的隐藏状态的激活。

bf1o4zei

bf1o4zei2#

如Huggingface文档中关于BertModel输出所述,pooler输出为:
由线性层和Tanh激活函数进一步处理的序列的第一记号(分类记号)的最后层隐藏状态。
因此,由于further processed by a Linear layer and a Tanh activation function,序列输出(CLS标记)的第一个向量的输出和池输出的值不同(但两个向量的大小相同)

5hcedyr0

5hcedyr03#

我在使用Transformers库中的BertModel时遇到了类似的问题,我想你的问题可能也是一样的。下面是我的发现:
BertModel的输出包含sequence_output(通常为shape [batch_size,max_sequence_length,768]),这是Bert的最后一层。它还具有pooled_output(通常为shape [batch_size,768]),这是附加“pooler”层的输出。Pooler层采用sequence_output[:,0](第一个令牌,即CLS令牌),后面是密集层和Tanh激活。
这就是pooled_output的名称来源,也是它与CLS标记不同的原因,但两者的用途是相同的。

p8ekf7hl

p8ekf7hl4#

池输出[0]!=设置输出[0,0,:]

语句输出:只是每个标记的最后一层隐藏表示的数组(表示),大小为(batch_size,seq_len,hidden_size)
池输出:CLS标记的表示/嵌入是否通过Bertpooler、线性/密集和激活函数的更多层传递。建议使用此pooler_output,因为它包含整个序列的上下文化信息。

相关问题