spaCy:训练神经网络模型

模型的训练和更新

为什么要更新模型?
  • 对特定领域有更好的结果
  • 对特定问题学习特定的分类类别
  • 对文本分类非常必要
  • 对命名实体识别非常有用
  • 对词性标注和依存关系识别不是很关键
如何训练(1)
  1. 初始化模型权重使之变为随机值
  2. 预测几个例子,看看当前权重的表现
  3. 比较预测结果和真实标注的标签
  4. 计算如何调整权重来改善预测结果
  5. 微调模型权重
  6. 重复步骤 2。
如何训练(2)
训练流程图表
  • 训练数据:例子及其标注
  • 文本:输入文本,模型会在这些文本上做标签预测。
  • 标签:模型需要预测的标签
  • 梯度:权重如何微调
举例:训练实体识别器
  • 实体识别器可以对词语和短语做基于语境的实体识别
  • 每一个词符只能是某一个实体的一部分
  • 训练例子需要带有语境
  • 并非实体的文本部分也非常重要
  • 目标:让模型学会泛化
训练数据
  • 一系列我们希望模型在语境中做出预测的例子
  • 更新现有模型:需要几百到几千个例子
  • 训练新的类别:需要几千乃至几百万个例子
    • spaCy 的中文模型是在 200 万个词语的语料规模上训练的
  • 通常需要由标注师人工标注数据
  • 也可以是半自动的,比如用 spaCy 的模板匹配器Matcher
训练数据 vs 测试数据
  • 训练数据:用来更新模型
  • 测试数据:
    • 模型在训练过程中未见到的数据
    • 用来计算模型的准确度
    • 代表了模型在生产环境中会遇到的真实数据
生成训练语料(1)
生成训练语料(2)
  • 将数据分割成两份:
    • 训练数据:用来更新模型
    • 开发数据:用来测试模型
生成训练语料(3)
  • DocBin:用来有效存储Doc对象的容器
  • 可以保存为二进制文件
  • 二进制文件可以用来训练模型
小经验:数据转换
  • spacy convert可以将语料转换为常见的格式
  • 支持.conll.conllu.iob以及 spaCy 之前的 JSON 格式。

创建训练数据

spaCy的基于规则的Matcher可以很好地被用来快速创建一些命名实体模型的训练数据。变量 TEXTS中存储着句子的列表,我们可以将其打印出来做检查。我们想要找到所有对应不同iPhone 型号的文本,所以我们可以创建一些训练数据来教会模型把它们识别为电子产品"GADGET"

  • 编写一个模板,含有两个词符且它们的小写形式可以匹配到"iphone""x"
  • 编写一个模板,含有两个词符,第一个词符的小写形式匹配到"iphone",第二个词符用"?" 运算符匹配到一个数字。

返回结果如下

在为我们的语料创建数据之后,我们需要将其存放在一个后缀为.spacy的文件中。可以参见上一个例子中的代码。

  • 使用docs的列表初始化DocBin
  • DocBin存储到一个名为train.spacy的文件中。

配置和运行训练流程

训练配置(1)
  • 所有设定的唯一真理来源
  • 通常被叫做config.cfg
  • 定义了如何初始化nlp对象
  • 包含了关于流程组件和模型实现的所有设定
  • 配置了训练过程和超参数
  • 使我们的训练过程可复现
训练配置(2)
生成一个配置文件
  • spaCy可以自动生成一个默认的配置文件
  • 文档中有可交互的快速上手插件
  • 作用于CLI的init config命令
  • init config: 要运行的命令
  • config.cfg: 生成的配置文档的输出路径
  • --lang: 流程的语言类,比如中文是 zh
  • --pipeline: 用逗号分隔的流程组件名称
训练流程(1)
  • 我们需要的只是config.cfg和训练与测试数据
  • 配置的设定可以在命令行中被覆盖
  • train: 要运行的命令
  • config.cfg: 配置文档的路径
  • --output: 保存训练流程的输出路径
  • --paths.train: 覆盖训练数据的路径
  • --paths.dev: 覆盖测试数据的路径
训练流程(2)
读取已经训练好的流程
  • 训练后的输出是一个正常的可读取的spaCy流程
    • model-last: 最后训练出的流程
    • model-best: 表现最好的训练流程
  • spacy.load读取流程
小经验:将流程打包
  • spacy package: 创建一个包含我们流程的可安装的Python包
  • 方便版本控制和部署

安装后读取和使用流程:

生成一个配置文件

init config命令 自动生成一个使用默认设定的训练配置文件。 我们想要训练一个命名实体识别器,所以我们要生成一个含有一个流程组件ner的配置文件。 因为我们在本课程中是在Jupyter环境中运行命令,所以加上前缀!。 如果是在本地终端中运行则不需要加这个前缀。

  • 使用spaCy的init config命令来自动生成一个中文流程的配置。
  • 将配置保存到文件config.cfg中。
  • 使用--pipeline参数指明一个流程组件ner

返回结果如下

我们来看看spaCy刚刚生成的配置文件! 我们可以运行下面的命令将配置打印到屏幕上。

返回结果如下

使用训练客户端

使用train 命令来调取训练配置文件来训练一个模型。 一个名为config_gadget.cfg的文件已经在exercise/zh中了, 同时还有一个名为train_gadget.spacy的文件包含了一些训练数据,dec_gadget.spacy文件包含了测试数据。 因为我们在本课程中是在Jupyter环境中运行命令,所以加上前缀!。 如果是在本地终端中运行则不需要加这个前缀。

  • 在文件exercises/zh/config_gadget.cfg上面运行train命令。
  • 将训练好的流程保存在output文件夹中。
  • 传入路径exercises/zh/train_gadget.spacy 和 exercises/zh/dev_gadget.spacy

返回结果如下

训练spaCy模型的最佳实践

问题一:模型“忘记”了东西
  • 已有的模型可能会在新数据上过拟合
    • 举个例子:如果我们只是想给模型更新一个"WEBSITE"的类别,模型有可能会“忘记” 之前"PERSON"这个类别。
  • 这也被称为“灾难性遗忘”的问题。
解决方法一:将之前的正确预测结果混合进来
  • 举个例子,我们要训练"WEBSITE",但我们也把"PERSON"的例子加进来。
  • 在数据上跑已有的spaCy模型然后抽取所有其它相关的实体。
问题二:模型不能学会所有东西
  • spaCy的模型基于本地语境作出预测。
  • 如果基于语境本身就很难做出判断,那模型也很难学得会
  • 标签种类最好前后一致,也不要过于特殊
    • 比如,"CLOTHING"这个类别就要比"ADULT_CLOTHING""CHILDRENS_CLOTHING"更 好。
解决方法二:仔细计划标签种类
  • 选择那些能从本地语境中反映出来的类别
  • 更通用的标签要好过更特定的标签
  • 我们可以用规则把通用标签转化为特定种类

不好的做法:

好的做法:

训练多个标签

完成数据中所有"WEBSITE"实体的位置参数。

更新训练数据,加入对"PERSON"实体”李子柒”和”马云”的标注。

总结

你的新spaCy技能
  • 抽取语言学特征:词性识别,依存关系,命名实体
  • 学会使用训练好的的流程
  • MatcherPhraseMatcher匹配规则寻找目标词汇和短语
  • 使用数据结构DocTokenSpanVocabLexeme的最佳实践
  • 使用词向量来计算语义相似度
  • 编写定制化的流程组件来生成扩展属性
  • 规模化你的spaCy流程使其运行速度更快
  • 为spaCy的统计模型创建训练数据
  • 用新数据训练和更新spaCy的神经网络模型
  • 训练和更新其它流程组件
    • 词性标注器
    • 依存关系解析器
    • 文本分类器
  • 定制化分词器
    • 增加规则和异常来用不同的方法分割文本
  • 增加或者改进对其它语种的支持
    • 现在支持60+种语言
    • 已有语种的支持还有很大改进空间,还有更多语种有待添加支持
    • 允许对其它语种训练模型

LEAVE A REPLY

游客评论不支持回复他人评论内容,如需回复他人评论内容请