如何从零开始训练BERT模型EBET易博app

  新闻资讯     |      2023-10-06 12:53

  我的许多文章都专注于 BERT——这个模型出现并主导了自然语言处理 (NLP) 的世界,标志着语言模型的新时代。

  对于那些之前可能没有使用过 Transformer 模型(例如 BERT 是什么)的人,这个过程看起来有点像这样:

  现在,这是一个很好的方法,但如果我们只这样做,我们就会缺乏对创建我们自己的 Transformer 模型的理解。

  而且,如果我们不能创建自己的 Transformer 模型——我们必须依赖于一个适合我们问题的预训练模型,但情况并非总是如此:

  因此,在本文中,我们将探讨构建我们自己的 Transformer 模型必须采取的步骤——特别是 BERT 的进一步开发版本,称为 RoBERTa。

  这个过程有几个步骤,所以在我们深入研究之前,让我们先总结一下我们需要做什么。 总的来说,有四个关键部分:

  一旦我们完成了这些部分中的每一个,我们将使用我们构建的标记器和模型 - 并将它们保存起来,以便我们可以像通常使用 from_pretrained 一样的方式使用它们。

  与任何机器学习项目一样,我们需要数据。 在用于训练 Transformer 模型的数据方面,我们几乎可以使用任何文本数据。

  OSCAR 数据集拥有大量不同的语言——从头开始训练最清晰的用例之一是我们可以将 BERT 应用于一些不太常用的语言,例如泰卢固语或纳瓦霍语。

  我的语言是英语——但我的女朋友是意大利人,所以她——劳拉,将评估我们讲意大利语的 BERT 模型——FiliBERTo 的结果。

  现在让我们以一种可以在构建分词器时使用的格式存储我们的数据。 我们需要创建一组仅包含数据集中文本特征的纯文本文件,我们将使用换行符 \n 拆分每个样本。

  接下来是标记器! 在使用转换器时,我们通常会加载一个分词器,连同其各自的转换器模型——分词器是该过程中的关键组件。

  在构建我们的分词器时,我们将为它提供我们所有的 OSCAR 数据,指定我们的词汇量大小(分词器中的标记数)和任何特殊标记。

  因此,我们确保将它们包含在标记器的 train 方法调用的 special_tokens 参数中。

  有了这些,我们可以继续初始化我们的分词器,以便我们可以像使用任何其他 from_pretrained 分词器一样使用它。

  我们首先使用我们之前构建的两个文件来初始化分词器——使用一个简单的 from_pretrained:

  现在我们的标记器已经准备好了,我们可以尝试用它编码一些文本。 编码时,我们使用与通常使用的两种方法相同的方法,encode 和 encode_batch。

  我们训练过程的输入管道是整个过程中比较复杂的部分。 它包括我们获取原始 OSCAR 训练数据,对其进行转换,然后将其加载到准备进行训练的 DataLoader 中。

  首先,我们需要打开我们的文件——我们之前保存为 .txt 文件的相同文件。 我们根据换行符 \n 拆分每个,因为这表示单个样本。

  现在我们可以继续创建我们的张量——我们将通过掩码语言建模 (MLM) 来训练我们的模型。 所以,我们需要三个张量:

  我们的 attention_mask 和标签张量只是从我们的批次中提取的。 但是input_ids 张量需要更多操作,对于这个张量,我们屏蔽了大约 15% 的标记——为它们分配标记 ID 3。

  在最终输出中,我们可以看到编码的 input_ids 张量的一部分。 第一个令牌 ID 是 1 — [CLS] 令牌。 在张量周围,我们有几个 3 个令牌 ID——这些是我们新添加的 [MASK] 令牌。

  最后,我们的数据集被加载到 PyTorch DataLoader 对象中——我们使用它在训练期间将数据加载到我们的模型中。

  我们需要两件东西来训练,我们的 DataLoader 和一个模型。 我们拥有的 DataLoader — 但没有模型。

  对于训练,我们需要一个原始的(未预训练的)BERTLMHeadModel。 要创建它,我们首先需要创建一个 RoBERTa 配置对象来描述我们想要用来初始化 FiliBERTo 的参数。

  然后,我们使用语言建模 (LM) 头导入并初始化我们的 RoBERTa 模型。

  在进入我们的训练循环之前,我们需要设置一些东西。 首先,我们设置 GPU/CPU 使用率。 然后我们激活我们模型的训练模式——最后,初始化我们的优化器。

  最后——训练时间! 我们按照通常通过 PyTorch 进行培训时的方式进行训练。

  如果我们继续使用 Tensorboard,随着时间的推移,我们会发现我们的损失——它看起来很有希望。

  现在是进行真正测试的时候了。 我们建立了一个MLM管道——并请劳拉评估结果。

  我们首先使用“fill-mask”参数初始化一个管道对象。 然后像这样开始测试我们的模型:

  EBET易博官网

  总的来说,看起来我们的模型通过了劳拉的测试——我们现在有一个名为 FiliBERTo 的意大利语模型!

  我们已经涵盖了很多方面,从获取和格式化我们的数据——一直到使用语言建模来训练我们的原始 BERT 模型。