首页 > 解决方案 > XLM/BERT 序列输出到带有加权平均池的池输出

问题描述

假设我有一个长度为 10 的标记化句子,并将其传递给 BERT 模型。

bert_out = bert(**bert_inp)
hidden_states = bert_out[0]
hidden_states.shape
>>>torch.Size([1, 10, 768])

这会返回一个形状张量: [ batch_size, seq_length, d_model ] 其中序列中的每个单词都被编码为 768 维向量

在 TensorFlow 中,BERT 还返回一个所谓的池化输出,它对应于整个句子的向量表示。
我想通过对序列向量进行加权平均来获得它,我这样做的方式是:

hidden_states.view(-1, 10).shape
>>> torch.Size([768, 10])

pooled = nn.Linear(10, 1)(hidden_states.view(-1, 10))
pooled.shape
>>> torch.Size([768, 1])

标签: pythonnlppytorchbert-language-modelattention-model

解决方案


获得句子表示有两种简单的方法:

  • 获取CLS令牌的向量。
  • 获取pooler_output

假设输入是[batch_size, seq_length, d_model],其中batch_size是句子的数量,那么要得到每个句子的 CLS 标记:

bert_out = bert(**bert_inp)
hidden_states = bert_out['last_hidden_state']
cls_tokens = hidden_states[:, 0, :]  # 0 for the CLS token for every sentence.

您将拥有一个形状为 (batch_size, d_model) 的张量。

要获得pooler_output

bert_out = bert(**bert_inp)
pooler_output = bert_out['pooler_output']

你再次得到一个形状为 (batch_size, d_model) 的张量。


推荐阅读