spaCy - 训练神经网络模型

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

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

训练步骤

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

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

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

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

  • 步骤 4 − 计算 - 比较之后,我们将决定如何更改权重以便下次做出更好的预测。

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

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

训练步骤

这里 −

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

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

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

  • 梯度 − 梯度是我们应该如何改变权重以减少误差。它将在比较预测标签和真实标签后计算出来。

训练实体识别器

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

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

  • 文本。

  • 它们包含的实体。

  • 实体标签。

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

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

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

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

("手机即将推出", {"entities": [(0, 8, "GADGET")]})

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

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

("我需要一部新手机!有什么建议吗?", {"entities": []})

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

spaCy 的训练循环

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

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

训练循环的步骤

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

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

步骤 2洗牌 - 第二步是洗牌训练数据。我们需要在每次迭代中随机洗牌数据。它有助于我们防止模型陷入次优解决方案。

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

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

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

示例

以下是 spaCy 训练循环的一个示例 −

DATA = [
   ("How to order the Phone X", {"entities": [(20, 28, "GADGET")]})
]
# 步骤 1:循环 10 次迭代
for i in range(10):
    # 步骤 2:对训练数据进行打乱
    random.shuffle(DATA)
    # 步骤 3:创建批次并对其进行迭代
    for batch in spacy.util.minibatch(DATA):
        # 步骤 4:将批次拆分为文本和注释
        texts = [text for text, comment in batch]
        annotations = [annotation for text, comment in batch]
        # 步骤 5:更新模型
    	nlp.update(texts, comments)
# 步骤 6:保存模型
nlp.to_disk(path_to_model)