Spacy 简明教程

spaCy - Training Neural Network Model

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

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

Steps for Training

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

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

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

  3. 步骤 3 − Compare - 现在,模型将根据真实标签检查预测。

  4. 步骤 4 − Calculate - 在进行比较后,我们将决定如何更改权重以在下次预测中获得更好的结果。

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

现在让我们借助以下图表了解这些步骤 −

steps for training

这里 -

  1. Training Data - 训练数据是示例及其注释。这些是希望用其更新模型的示例。

  2. Text - 它表示输入文本,模型应为其预测一个标签。它应该是句子、段落或较长的文档。

  3. Label - 标签实际上是我们希望模型预测的结果。例如,它可以是文本类别。

  4. Gradient - 梯度是我们应如何更改权重来减少误差。将在将预测标签与真实标签相比较后进行计算。

Training the Entity Recognizer

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

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

  1. Texts.

  2. The entities they contain.

  3. The entity labels.

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

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

可以通过向模型显示文本和一组字符偏移量来完成此操作。

举例如下:在下面给出的代码中,phone 是一个始于字符 0 并结束于字符 8 的小工具。

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

在此,模型还应当学习除了实体以外的单词。

考虑以下Training实体识别程序的另一个示例:

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

主要目标应该是教会我们的实体识别程序模型在相似上下文中识别新的实体,即使这些实体不在训练数据中。

spaCy’s Training Loop

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

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

Steps for Training Loop

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

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

Step 2Shuffle - 第二步是随机播放训练数据。我们需要为每次迭代随机播放数据。这有助于防止模型陷入次优解。

Step 3Divide – 稍后将数据分成批次。在此,我们将训练数据分成小批次。它有助于提高梯度估计的可读性。

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

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

Example

以下示例说明了 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)