XLM/BERT 序列输出到带加权平均池化的池化输出

XLM/BERT sequence outputs to pooled output with weighted average pooling

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

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

This returns me 一个形状的张量:[batch_size, seq_length, d_model] 其中每个单词在序列被编码为768维向量

在 TensorFlow BERT 中也 returns 所谓的池化输出,它对应于整个句子的向量表示。
我想通过对序列向量进行加权平均来获得它,我的做法是:

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])

有两种简单的方法可以获取句子表示:

  • 获取 CLS 标记的向量。
  • 获得pooler_output

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

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) 的张量。