python - 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])
- 这是正确的继续方式,还是应该将整个事物展平然后应用线性?
- 还有其他方法可以获得良好的句子表示吗?
解决方案
获得句子表示有两种简单的方法:
- 获取
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) 的张量。
推荐阅读
- elasticsearch - 嵌套字段上的 Elasticsearch 复合聚合查询
- azure-active-directory - Azure AD B2C 会话超时无效
- pandas - 熊猫与 numpy 不兼容
- visual-studio - Ctrl+Shift+右箭头在 Visual Studio 2019 中不起作用
- spring - 使用 Spring 在非 Web 应用程序中使用 ElasticSearch 客户端
- foreach - 使用 ForEach 时,在 SwiftUI 中选择时是否可以更改 tabItem 的图像?
- apache-flink - Flink 中的检查点随时间增加
- javascript - Javascript- 使 JSON 排序函数可扩展为 Date 对象
- python - 读取使用 O_DIRECT 标志打开的文件
- django - Django:多对多关系将模型中的所有对象放在另一个对象中