输入文件应该如何格式化以进行语言模型微调(BERT 通过 Huggingface Transformers)?

Posted

技术标签:

【中文标题】输入文件应该如何格式化以进行语言模型微调(BERT 通过 Huggingface Transformers)?【英文标题】:How exactly should the input file be formatted for the language model finetuning (BERT through Huggingface Transformers)? 【发布时间】:2020-05-16 23:51:08 【问题描述】:

我想在预训练的 Bert 模型上使用 Huggingface Transformers repository 中的 examples/run_lm_finetuning.py。但是,从遵循文档来看,语料库文件的结构并不明显(除了引用 Wiki-2 数据集)。我试过了

每行一个文档(多个句子) 每行一个句子。文档以空行分隔(我在一些较旧的 pytorch-transformers 文档中找到了这一点)

通过查看examples/run_lm_finetuning.py 的代码,并不能直接看出下一句预测目标的序列对是如何形成的。 --line-by-line 选项在这里有帮助吗?如果有人能给我一些提示,文本语料库文件应该是什么样子,我将不胜感激。

非常感谢和欢呼,

nminds

【问题讨论】:

【参考方案1】:

首先,我强烈建议也将这个问题作为一个问题在 huggingface 库中打开,因为他们可能最有兴趣回答这个问题,并且可能会将其视为他们应该更新/澄清他们的文档的标志。

但要回答您的问题,似乎这个特定的示例脚本基本上是返回一个 LineByLineTextDataset(如果您将 --line_by_line 传递给培训),否则返回一个 TextDataset,请参阅 ll。 the script 中的 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 个令牌(默认值)剪切您的文本。

如果我没记错的话(似乎与我在the documentation 中找到的一致),下一句预测任务仅针对默认的 BERT 模型实现,不幸的是它不是这个特定微调脚本的一部分。 据我所知,lm_finetuning 脚本中使用的 BERT 模型都没有使用该特定任务。

【讨论】:

好点,谢谢 - 我也会把它带到问题上。根据this,尽管您只能使用一组默认的基本 Bert 模型,但可以对蒙面语言和下一句预测目标进行训练。似乎没有提供从磁盘加载您自己的预训练模型。 没错,如果你只使用 BERT,这完全没问题(虽然我找不到任何即时实现),但当前大部分代码的编写方式也支持RoBERTa、XLM 等 @dennlinger 如果你能回答,我有 2 个问题。 1)什么方法会更好? 2)我应该制作一个语料库的文本文件,一行一个文件?如果文档长度超过 512 怎么办? 就个人而言,我总是更喜欢使用逐行的方法,因为这样你就会在行之间有明显的(语义)差异,因为在任意点分割并不能保证一个句子实际上完成了。对于2),我很少看到包含超过512个token的句子,否则我会把它们分成两半,或者继续阻塞策略......

以上是关于输入文件应该如何格式化以进行语言模型微调(BERT 通过 Huggingface Transformers)?的主要内容,如果未能解决你的问题,请参考以下文章

中文情感分类任务如何对bert语言模型微调,微调后的模型如何使用

如何将微调过的 bert 模型的输出作为输入提供给另一个微调过的 bert 模型?

将 LIME 解释应用于我的微调 BERT 以进行序列分类模型?

如何使用微调的 BERT 模型进行句子编码?

针对特定领域微调 Bert(无监督)

如何再次微调一个bert微调模型