Как именно должен быть отформатирован входной файл для тонкой настройки языковой модели (BERT через Huggingface Transformers)?

Я хотел использовать examples/run_lm_finetuning.py из репозитория Huggingface Transformers на предварительно обученной модели Берта. Однако из документации не очевидно, как должен быть структурирован файл корпуса (кроме ссылки на набор данных Wiki-2). я пробовал

  • Один документ в строке (несколько предложений)
  • Одно предложение в строке. Документы разделяются пустой строкой (я нашел это в какой-то старой документации по pytorch-transformers).

Глядя на код examples/run_lm_finetuning.py, не совсем очевидно, как формируются пары последовательностей для цели прогнозирования следующего предложения. Поможет ли здесь опция --line-by-line? Буду признателен, если кто-нибудь подскажет, как должен выглядеть файл текстового корпуса.

Большое спасибо и ура,

Minds


person nminds    schedule 31.01.2020    source источник


Ответы (1)


Прежде всего, я настоятельно рекомендую также открыть это как проблему в библиотеке huggingface, поскольку они, вероятно, наиболее заинтересованы ответить на этот вопрос и могут воспринять это как знак того, что им следует обновить / уточнить свою документацию.

Но чтобы ответить на ваш вопрос, похоже, что этот конкретный пример сценария в основном возвращает либо LineByLineTextDataset (если вы передаете --line_by_line в обучение), либо TextDataset, см. Ll. 144–149 в скрипте (слегка отформатирован для лучшего видимость):

def load_and_cache_examples(args, tokenizer, evaluate=False):
    file_path = args.eval_data_file if evaluate else args.train_data_file
    if args.line_by_line:
        return LineByLineTextDataset(tokenizer, args, 
                           file_path=file_path, block_size=args.block_size)
    else:
        return TextDataset(tokenizer, args, 
                           file_path=file_path, block_size=args.block_size)

TextDataset просто разбивает текст на последовательные блоки определенной длины (токена), например, он будет вырезать ваш текст каждые 512 токенов (значение по умолчанию).

Задача прогнозирования следующего предложения реализована только для модели BERT по умолчанию, если я правильно это помню (похоже, согласуется с тем, что я нашел в документация), и, к сожалению, не является частью этого конкретного скрипта точной настройки. Насколько я могу судить, ни одна из используемых в сценарии lm_finetuning моделей BERT не использует эту конкретную задачу.

person dennlinger    schedule 31.01.2020
comment
Хорошее замечание, спасибо - я тоже отнесусь к вопросам. Согласно этому тренингу как по маскированному языку, так и по предсказанию следующего предложения цели были возможны, хотя вы могли использовать только набор базовых моделей Берта по умолчанию. Загрузка собственной предварительно обученной модели с диска, похоже, не предусмотрена. - person nminds; 31.01.2020
comment
Точно, если вы используете только BERT, это прекрасно (хотя я не могу найти никаких реализаций на лету), но большая часть текущего кода написана таким образом, чтобы также поддерживать RoBERTa, XLM и т. Д. - person dennlinger; 31.01.2020
comment
@dennlinger У меня есть 2 вопроса, если вы можете ответить. 1) Какой подход лучше? 2) Я должен сделать текстовый файл корпуса, с одним документом в строке? что делать, если документ длиннее 512? - person Nauman Naeem; 06.02.2020
comment
Лично я всегда предпочитаю использовать построчный подход, поскольку тогда у вас есть четкие (семантические) различия между строками, поскольку разделение в произвольных точках не гарантирует, что предложение действительно завершится. Для 2) я редко видел предложения, содержащие более 512 токенов, иначе я бы разделил их пополам или продолжил стратегию блокировки ... - person dennlinger; 06.02.2020