Как сделать AVG пул на выходе модели Берта для каждого предложения? - PullRequest
0 голосов
/ 13 апреля 2020

для классификации мы обычно используем [CLS] для прогнозирования меток. но теперь у меня есть еще одна просьба сделать avg-пул на выходе каждого предложения в модели Берта. это кажется немного сложным для меня? предложение делится на [SEP], но длина каждого предложения в каждом образце пакета не равна, поэтому tf.split не подходит для этой проблемы?

Пример следующим образом (batch_size = 2), как получить среднее объединение для каждого предложения?

[CLS] w1 w2 w3 [sep] w4 w5 [sep]

[CLS] x1 x2 [сент.] X3 w4 x5 [сент.]

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете получить средние значения, маскируя.

Если вы наберете encode_plus на токенизаторе и установите return_token_type_ids на True, вы получите словарь, который содержит:

  • 'input_ids': индексы токенов, которые вы передаете в свою модель
  • 'token_type_ids': список из 0 и 1, который говорит, какой токен принадлежит какому входному предложению.

Предполагая, что вы упаковали token_type_ids, так что 0 - это первое предложение, 1 - это второе предложение, а заполнение - это что-то еще (например, -1) в тензоре в переменной mask с формой batch × длина , и у вас есть вывод BERT в тензоре переменной output формы партия × длина × 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)
...
...