如何对每个句子的bert模型输出做avg pool?
how to do avg pool on the output of bert model for each sentence?
对于分类,我们通常使用[CLS]来预测标签。但现在我有另一个请求对 bert 模型中每个句子的输出进行平均池化。对我来说似乎有点难?
句子被 [SEP] 拆分,但批次的每个样本中每个句子的长度不相等,所以 tf.split 不适合这个问题?
例子如下(batch_size=2),如何得到每个句子的avg-pooling?
[CLS] w1 w2 w3 [sep] w4 w5 [sep]
[CLS] x1 x2 [sep] x3 w4 x5 [sep]
你可以通过掩码得到平均值。
如果您在分词器上调用 encode_plus
并将 return_token_type_ids
设置为 True
,您将获得一个包含以下内容的字典:
'input_ids'
:您传递给模型的令牌索引
'token_type_ids'
:0 和 1 的列表,表示哪个标记属于哪个输入句子。
假设您对 token_type_ids
进行了批处理,这样 0 是第一句话,1 是第二句话,填充是变量 mask
中具有形状的张量中的其他内容(如 -1) batch × length,并且您在形状为 batch[= 的变量 output
中的张量中得到 BERT 输出35=]×长度×768,你可以这样:
first_sent_mask = tf.cast(mask == 0, tf.float32)
first_sent_lens = tf.reduce_sum(first_sent_mask, axis=1, keepdims=True)
first_sent_mean = (
tf.reduce_sum(output * tf.expand_dims(first_sent_mask, 2)) /
first_sent_lens)
second_sent_mask = tf.cast(mask == 1, tf.float32)
...
对于分类,我们通常使用[CLS]来预测标签。但现在我有另一个请求对 bert 模型中每个句子的输出进行平均池化。对我来说似乎有点难? 句子被 [SEP] 拆分,但批次的每个样本中每个句子的长度不相等,所以 tf.split 不适合这个问题?
例子如下(batch_size=2),如何得到每个句子的avg-pooling?
[CLS] w1 w2 w3 [sep] w4 w5 [sep]
[CLS] x1 x2 [sep] x3 w4 x5 [sep]
你可以通过掩码得到平均值。
如果您在分词器上调用 encode_plus
并将 return_token_type_ids
设置为 True
,您将获得一个包含以下内容的字典:
'input_ids'
:您传递给模型的令牌索引'token_type_ids'
:0 和 1 的列表,表示哪个标记属于哪个输入句子。
假设您对 token_type_ids
进行了批处理,这样 0 是第一句话,1 是第二句话,填充是变量 mask
中具有形状的张量中的其他内容(如 -1) batch × length,并且您在形状为 batch[= 的变量 output
中的张量中得到 BERT 输出35=]×长度×768,你可以这样:
first_sent_mask = tf.cast(mask == 0, tf.float32)
first_sent_lens = tf.reduce_sum(first_sent_mask, axis=1, keepdims=True)
first_sent_mean = (
tf.reduce_sum(output * tf.expand_dims(first_sent_mask, 2)) /
first_sent_lens)
second_sent_mask = tf.cast(mask == 1, tf.float32)
...