PyTorch Huggingface BERT-NLP для распознавания именованных объектов
Я уже давно использую реализацию Google BERT от PyTorch от HuggingFace для набора данных MADE 1.0. До последнего времени (11 февраля) я использовал библиотеку и получал F-Score 0,81 для своей задачи распознавания именованных объектов с помощью Fine Tuning модели. Но на этой неделе, когда я запустил точно такой же код, который был скомпилирован и запущен ранее, при выполнении этого оператора возникла ошибка:
input_ids = pad_sequences([tokenizer.convert_tokens_to_ids(txt) for txt in tokenized_texts], maxlen=MAX_LEN, dtype="long", truncating="post", padding="post")
ValueError: Длина последовательности индексов токена превышает указанную максимальную длину последовательности для этой модели BERT (632 > 512). Выполнение этой последовательности через BERT приведет к ошибкам индексации
Полный код доступен в этой записной книжке.
Чтобы обойти эту ошибку, я изменил приведенное выше утверждение на приведенное ниже, взяв первые 512 токенов любой последовательности, и внес необходимые изменения, чтобы добавить индекс [SEP] в конец усеченной / дополненной последовательности, как того требует BERT.
input_ids = pad_sequences([tokenizer.convert_tokens_to_ids(txt[:512]) for txt in tokenized_texts], maxlen=MAX_LEN, dtype="long", truncating="post", padding="post")
Результат не должен был измениться, потому что я рассматриваю только первые 512 токенов в последовательности, а затем урезаю их до 75 как мое (MAX_LEN=75), но мой F-Score упал до 0,40, а моя точность до 0,27, тогда как Recall остается то же самое (0,85). Я не могу предоставить доступ к набору данных, так как подписал предложение о конфиденциальности, но могу заверить, что вся предварительная обработка, как того требует BERT, была выполнена, и все расширенные токены, такие как (Johanson -> Johan ##son), были помечены знаком X и заменены. позже после прогноза, как сказано в документе BERT.
Кто-нибудь еще сталкивался с подобной проблемой или может уточнить, в чем может быть проблема или какие изменения люди PyTorch (Huggingface) недавно сделали для своей цели?
1 ответ
Я нашел решение, чтобы обойти это. Выполнение того же кода с pytorch-pretrained-bert==0.4.0 решает проблему, и производительность восстанавливается до нормальной. В обновлении BERT Tokenizer или BERTForTokenClassification есть что-то, что влияет на производительность модели. Надеюсь, что HuggingFace скоро это прояснит.:)
pytorch-pretrained-bert == 0,4,0, тест F1-оценка: 0,82
pytorch-pretrained-bert == 0.6.1, тест F1-оценка: 0.41
Благодарю.
Я думаю, тебе стоит использовать batch_encode_plus
и вывод маски, а также кодирование.
См. Batch_encode_plus в https://huggingface.co/transformers/main_classes/tokenizer.html