如何为 BERT/RoBERTa 模型准备文本?

数据挖掘 深度学习 nlp 伯特 变压器 拥抱脸
2022-02-24 21:16:23

我有一个我建立的人工语料库(不是真正的语言),其中每个文档都由多个句子组成,这些句子又不是真正的自然语言句子。

我想从这个语料库中训练一个语言模型(稍后将其用于下游任务,如分类或使用句子 BERT 进行聚类)

如何标记文档?

我需要标记输入吗

像这样: <s>sentence1</s><s>sentence2</s>

或者<s>the whole document</s>

如何训练?

我需要培训 MLM 或 NSP 还是两者兼而有之?

1个回答

您可以使用现有库进行标记。

来自Github 上的文档

对于句子级任务(或句子对)任务,标记化非常简单。只需按照run_classifier.pyextract_features.py中的示例代码进行操作即可。句子级任务的基本过程是:

实例化一个实例tokenizer = tokenization.FullTokenizer

用 标记原始文本tokens = tokenizer.tokenize(raw_text)

截断到最大序列长度。(您最多可以使用 512,但出于内存和速度原因,您可能希望使用更短的时间。)

在正确的位置添加[CLS][SEP]标记。

在原始论文(第 3 节)中说:

为了使 BERT 处理各种下游任务,我们的输入表示能够在一个标记序列中明确表示单个句子和一对句子。在整个工作中,“句子”可以是连续文本的任意跨度,而不是实际的语言句子。一个“序列”是指输入到 BERT 的标记序列,它可能是一个句子,也可能是两个打包在一起的句子。

Masked LM (Task 1) 和 Next Sentence Prediction (NSP, Task 2) 都是原始论文中预训练的一部分(第 3.1 节)。对于“仅分类”,您可能对任务 1 (MLM) “没问题”,具体取决于问题。然而,MLM 和 NSP 似乎对于取得“好”的结果都很重要。NSP的动机在论文中用以下词语描述:

许多重要的下游任务,例如问答 (QA) 和自然语言推理 (NLI),都是基于对两个句子之间关系的理解,而语言建模无法直接捕捉到这一点。为了训练一个理解句子关系的模型,我们预先训练一个二值化的下一个句子预测任务,该任务可以从任何单语语料库中轻松生成

有关更多技术方面的信息(即使用变压器库),您可以在 SO 上看到此讨论