Быстрые и медленные токенизаторы дают разные результаты
Используя инструмент конвейера HuggingFace, я был удивлен, обнаружив существенную разницу в выводе при использовании быстрого и медленного токенизатора.
В частности, когда я запускаю конвейер маски заполнения, вероятности, присвоенные словам, которые будут заполнять маску, не одинаковы для быстрого и медленного токенизатора. Более того, хотя прогнозы быстрого токенизатора остаются постоянными независимо от количества и длины вводимых предложений, это не верно для медленного токенизатора.
Вот минимальный пример:
from transformers import pipeline
slow = pipeline('fill-mask', model='bert-base-cased', \
tokenizer=('bert-base-cased', {"use_fast": False}))
fast = pipeline('fill-mask', model='bert-base-cased', \
tokenizer=('bert-base-cased', {"use_fast": True}))
s1 = "This is a short and sweet [MASK]." # "example"
s2 = "This is [MASK]." # "shorter"
slow([s1, s2])
fast([s1, s2])
slow([s2])
fast([s2])
Каждый вызов конвейера дает 5 лучших токенов, которые можно заполнить [MASK]
, вместе с их вероятностями. Я опустил фактические результаты для краткости, но вероятности, присвоенные каждому слову, которое заполняет[MASK]
за s2
не одинаковы во всех примерах. Последние 3 примера дают одинаковые вероятности, но первый дает разные вероятности. Различия настолько велики, что топ-5 не совпадают по двум группам.
Причина этого, насколько я могу судить, в том, что быстрые и медленные токенизаторы возвращают разные выходные данные. Быстрый токенизатор стандартизирует длину последовательности до 512 путем заполнения нулями, а затем создает маску внимания, которая блокирует заполнение. Напротив, медленный токенизатор заполняет только самую длинную последовательность и не создает такую маску внимания. Вместо этого он устанавливает идентификатор типа токена для заполнения равным 1 (а не 0, который является типом токенов без заполнения). Насколько я понимаю, реализация HuggingFace (найденная здесь) не эквивалентна.
Кто-нибудь знает, намеренно ли это?
1 ответ
Похоже, что эта ошибка была исправлена где-то между transformers-2.5.0
а также transformers-2.8.0
или tokenizers-0.5.0
а также tokenizers-0.5.2
. Обновление моей установки трансформаторов (и токенизаторов) решило эту проблему.
(Сообщите мне, если этот вопрос / ответ тривиален и его следует удалить)