Какой была бы наилучшая стратегия для маски только с указанием c слов во время обучения LM?
Моя цель - динамически замаскировать во время пакетной обработки только слова, представляющие интерес, которые я ранее собрал в списке.
Я уже изучал функцию mask_tokens()
в DataCollatorForLanguageModeling class
, которая является функцией, фактически маскирующей токены во время каждой партии, но Я не могу найти эффективного и умного способа замаскировать только определенные c слова и соответствующие им идентификаторы.
Я попробовал один наивный подход, состоящий в сопоставлении всех идентификаторов каждой партии со списком идентификаторов слов для маскировки. Однако подход for-l oop отрицательно сказывается на производительности.
.
Побочная проблема с пробелом с префиксом слова - уже исправлена
Спасибо @ amdex1 и @cronoik за помощь с побочной проблемой. Эта проблема возникла из-за того, что токенизатор не только разбивает одно слово на несколько токенов, но также добавляет специальные символы, если слово не встречается в начале предложения. Например:
Слово «Валькирия»:
- в начале предложений разделяется на ['V', 'alky', 'ria'] с соответствующими идентификаторами: [846, 44068, 6374].
- в то время как в середине предложения как ['ĠV', 'alky', 'ria'] с соответствующие ID: [468, 44068, 6374],
Решается установкой add_prefix_space=True
в токенизаторе.