持续预训练与使用 MLM 微调语言模型
Continual pre-training vs. Fine-tuning a language model with MLM
我有一些自定义数据要用于进一步预训练 BERT 模型。到目前为止,我已经尝试了以下两种方法:
- 从预训练的 BERT 检查点开始,然后使用 Masked Language Modeling (
MLM
) + Next Sentence Prediction (NSP
) heads 继续预训练(例如使用 BertForPreTraining 模型)
- 从具有
MLM
objective 的预训练 BERT 模型开始(例如,使用 BertForMaskedLM假设我们的预训练部分不需要 NSP 的模型。)
但我仍然感到困惑,如果使用 BertForPreTraining 或 BertForMaskedLM 实际上会在 BERT 上进行持续预训练,或者这些是只有两个微调模型,分别使用 MLM+NSP 和 MLM 微调 BERT。使用 MLM+NSP 微调 BERT 或使用这两个头持续预训练它之间是否有任何区别,或者这是我们需要测试的东西?
我已经回顾了类似的问题,例如 但是,我仍然想确定从技术上讲,从初始检查点持续预训练模型和使用相同 objective/head.
答案只是所用术语的不同。当模型在大型通用语料库上训练时,它被称为 'pre-training'。当它适用于特定任务或数据集时,它被称为 'fine-tuning'.
从技术上讲,无论是哪种情况('pre-training' 或 'fine-tuning'),都会更新模型权重。
例如,通常情况下,您可以只使用预训练模型,然后针对特定任务(例如分类、问答等)对其进行微调。但是,如果您发现目标数据集来自特定领域,并且您有一些未标记的数据可能有助于模型适应特定领域,那么您可以进行 MLM 或 MLM+NSP 'fine-tuning' (无监督学习)(一些研究人员将其称为'pre-training',尤其是当使用庞大的语料库来训练模型时),然后使用目标语料库进行目标任务微调。
是的,pre-training和“进一步pre-training”是有区别的。
Pre-training 通常意味着采用原始模型,随机初始化权重,并在一些大型语料库上从头开始训练模型。
进一步 pre-training 意味着采用一些已经 pre-trained 的模型,并且基本上应用迁移学习——使用已经从训练模型中保存的权重并在一些新领域上训练它。如果您没有非常大的语料库,这通常是有益的。
关于BertForPreTraining
和BertForMaskedLM
,您可以使用其中任何一个来实现上述两个目的。事实证明,在 MLM 上进一步 pre-training 是非常有益的,而且通常根本不需要 NSP。所以你最好选择 BertForMaskedLM
.
注意!您可以通过以下方式初始化模型检查点:BertForMaskedLM.from_pretrained({model_name})
,然后应用训练程序,否则只需将配置传递给它(来自 huggingface API)
我有一些自定义数据要用于进一步预训练 BERT 模型。到目前为止,我已经尝试了以下两种方法:
- 从预训练的 BERT 检查点开始,然后使用 Masked Language Modeling (
MLM
) + Next Sentence Prediction (NSP
) heads 继续预训练(例如使用 BertForPreTraining 模型) - 从具有
MLM
objective 的预训练 BERT 模型开始(例如,使用 BertForMaskedLM假设我们的预训练部分不需要 NSP 的模型。)
但我仍然感到困惑,如果使用 BertForPreTraining 或 BertForMaskedLM 实际上会在 BERT 上进行持续预训练,或者这些是只有两个微调模型,分别使用 MLM+NSP 和 MLM 微调 BERT。使用 MLM+NSP 微调 BERT 或使用这两个头持续预训练它之间是否有任何区别,或者这是我们需要测试的东西?
我已经回顾了类似的问题,例如
答案只是所用术语的不同。当模型在大型通用语料库上训练时,它被称为 'pre-training'。当它适用于特定任务或数据集时,它被称为 'fine-tuning'.
从技术上讲,无论是哪种情况('pre-training' 或 'fine-tuning'),都会更新模型权重。
例如,通常情况下,您可以只使用预训练模型,然后针对特定任务(例如分类、问答等)对其进行微调。但是,如果您发现目标数据集来自特定领域,并且您有一些未标记的数据可能有助于模型适应特定领域,那么您可以进行 MLM 或 MLM+NSP 'fine-tuning' (无监督学习)(一些研究人员将其称为'pre-training',尤其是当使用庞大的语料库来训练模型时),然后使用目标语料库进行目标任务微调。
是的,pre-training和“进一步pre-training”是有区别的。
Pre-training 通常意味着采用原始模型,随机初始化权重,并在一些大型语料库上从头开始训练模型。
进一步 pre-training 意味着采用一些已经 pre-trained 的模型,并且基本上应用迁移学习——使用已经从训练模型中保存的权重并在一些新领域上训练它。如果您没有非常大的语料库,这通常是有益的。
关于BertForPreTraining
和BertForMaskedLM
,您可以使用其中任何一个来实现上述两个目的。事实证明,在 MLM 上进一步 pre-training 是非常有益的,而且通常根本不需要 NSP。所以你最好选择 BertForMaskedLM
.
注意!您可以通过以下方式初始化模型检查点:BertForMaskedLM.from_pretrained({model_name})
,然后应用训练程序,否则只需将配置传递给它(来自 huggingface API)