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)