输入文件应该如何格式化以进行语言模型微调(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 数据集)。我试过了
通过查看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 模型?