spaCy - 训练神经网络模型



在本章中,让我们学习如何在 spaCy 中训练神经网络模型。

在这里,我们将了解如何更新 spaCy 的统计模型以根据我们的用例对其进行定制。例如,预测在线评论中的新实体类型。要进行自定义,我们首先需要训练自己的模型。

训练步骤

让我们了解在 spaCy 中训练神经网络模型的步骤。

  • 步骤 1 - **初始化** - 如果您不使用预训练模型,那么首先,我们需要使用 **nlp.begin_training** 随机初始化模型权重。

  • 步骤 2 - **预测** - 接下来,我们需要使用当前权重预测一些示例。可以通过调用 **nlp.updates** 来完成。

  • 步骤 3 - **比较** - 现在,模型将检查预测结果与真实标签是否一致。

  • 步骤 4 - **计算** - 比较之后,在这里,我们将决定如何更改权重以便下次进行更好的预测。

  • 步骤 5 - **更新** - 最后,对当前权重进行微小更改,并选择下一批示例。继续对您获取的每一批示例调用 **nlp.updates**。

现在让我们借助下图了解这些步骤 -

Steps for Training

这里 -

  • **训练数据** - 训练数据是示例及其注释。这些是我们想要更新模型的示例。

  • **文本** - 它表示模型应该预测其标签的输入文本。它可以是句子、段落或更长的文档。

  • **标签** - 标签实际上是我们希望模型预测的内容。例如,它可以是文本类别。

  • **梯度** - 梯度是指我们应该如何更改权重以减少误差。在将预测标签与真实标签进行比较后,将计算梯度。

训练实体识别器

首先,实体识别器将获取文档并预测短语及其标签。

这意味着训练数据需要包含以下内容 -

  • 文本。

  • 它们包含的实体。

  • 实体标签。

每个标记只能是某个实体的一部分。因此,实体不能重叠。

我们还应该在实体及其周围上下文中对其进行训练,因为实体识别器会在上下文中预测实体。

这可以通过向模型显示文本和字符偏移列表来完成。

例如,在下面给出的代码中,phone 是一个从字符 0 开始到字符 8 结束的小工具。

("Phone is coming", {"entities": [(0, 8, "GADGET")]})

在这里,模型还应该学习除实体之外的其他单词。

考虑另一个训练实体识别器的示例,如下所示 -

("I need a new phone! Any suggestions?", {"entities": []})

主要目标应该是教会我们的实体识别器模型,即使在训练数据中不存在,也能在类似上下文中识别新的实体。

spaCy 的训练循环

一些库为我们提供了负责模型训练的方法,但另一方面,spaCy 为我们提供了对训练循环的完全控制。

训练循环可以定义为一系列步骤,这些步骤用于更新和训练模型。

训练循环步骤

让我们看看训练循环的步骤,如下所示 -

**步骤 1** - **循环** - 第一步是循环,我们通常需要执行多次,以便模型从中学习。例如,如果您想训练模型 20 次迭代,则需要循环 20 次。

**步骤 2** - **随机洗牌** - 第二步是随机洗牌训练数据。我们需要对每次迭代的数据进行随机洗牌。这有助于防止模型陷入次优解。

**步骤 3** - **划分** – 然后将数据分成批次。在这里,我们将训练数据分成小批次。这有助于提高梯度估计的可读性。

**步骤 4** - **更新** - 下一步是更新每个步骤的模型。现在,我们需要更新模型并重新开始循环,直到达到最后一次迭代。

**步骤 5** - **保存** - 最后,我们可以保存此训练后的模型并在 spaCy 中使用它。

示例

以下是 spaCy 的训练循环示例 -

DATA = [
   ("How to order the Phone X", {"entities": [(20, 28, "GADGET")]})
]
# Step1: Loop for 10 iterations
for i in range(10):
   # Step2: Shuffling the training data
   random.shuffle(DATA)
   # Step3: Creating batches and iterating over them
   for batch in spacy.util.minibatch(DATA):
      # Step4: Splitting the batch in texts and annotations
      texts = [text for text, annotation in batch]
      annotations = [annotation for text, annotation in batch]
      # Step5: Updating the model
      nlp.update(texts, annotations)
# Step6: Saving the model
nlp.to_disk(path_to_model)
广告