【问题标题】:Explanation/interpretation of the parameters in the spaCy config filespaCy 配置文件中参数的解释/解释
【发布时间】:2021-07-02 13:20:40
【问题描述】:

关于我们在config.cfg 文件中定义的参数,我有几个问题。虽然 spaCy 的文档确实试图解释它们,但我觉得解释的描述性不够,而且很多东西都散落在文档周围,很难找到你需要的东西,尤其是 spaCy v3,(除非我'我查看了网站的错误部分)这是最近的,因此论坛中的问题/答案确实更少。 我基本上是在构建一个命名实体识别 (NER) 模型以及一个转换器组件。我的问题如下:

  1. 在下面的部分(corpora.train 也有同样的问题),max_lengthlimit 有什么区别?

    对于max_length,文档说“训练文档长度的限制”
    对于limit,文档说“限制训练示例的数量”

    他们不是差不多吗?我的意思是我可以通过限制文档本身的长度来限制训练示例的数量,对吧?

[corpora.dev]
@readers = "spacy.Corpus.v1"
path = ${paths.dev}
max_length = 0
gold_preproc = false
limit = 0
augmenter = null
  1. 在下面的sn-p中,一个'step'是什么意思?我了解max_steps=0 表示无限步数。但是我怎么知道有多少这样的“步骤”构成一个纪元? 1个这样的步骤涵盖了多少例句?
[training]
train_corpus = "corpora.train"
dev_corpus = "corpora.dev"
seed = ${system.seed}
gpu_allocator = ${system.gpu_allocator}
dropout = 0.1
accumulate_gradient = 1
patience = 1600
max_epochs = 10
max_steps = 0
eval_frequency = 200
frozen_components = []
before_to_disk = null
  1. 在训练过程中,learn_rate 在下面的 sn-p 代码中究竟是如何修改的?更具体地说,total_stepswarmup_steps 是什么意思?
[training.optimizer.learn_rate]
@schedules = "warmup_linear.v1"
warmup_steps = 250
total_steps = 200
initial_rate = 0.00005
  1. 最后,在训练过程的CLI输出中,这个'#'到底是什么? GitHub discussions 之一中提到 “# 列是优化步骤的数量(= 处理的批次)”,但是这 1 个批次或“优化步骤”到底是什么?如果训练过程向我显示了 200 个这样的“批次”之后的分数,我该如何解释它(例如在此之前已经处理了多少个例句)?

【问题讨论】:

  • 你真的应该把这个分成多个问题,当所有这些无关的问题放在一起时,你很难回答。
  • @polm23 我从这个问题中删除了不相关的查询。
  • 老实说这个问题还是太多了,请看这个。有几个小而有针对性的问题是可以的。 meta.stackexchange.com/questions/39223/…

标签: python nlp spacy named-entity-recognition spacy-3


【解决方案1】:

在下面的部分(对于 corpora.train 也有同样的问题),max_length 和 limit 有什么区别? 对于 max_length,文档说“培训文档长度的限制” 对于限制,文档说“限制训练示例的数量” 他们不是或多或少相同的东西吗?我的意思是我可以通过限制文档本身的长度来限制训练示例的数量,对吧?

这些是不同的东西,您似乎对什么是“文档”感到困惑。您可以将“文档”视为 spaCy 中的单个对象。不同的文档对彼此一无所知。文档基于单个字符串。以普通 Python 字符串为例:

["cat", "dog", "fish"] # this is three strings
["cat dog fish"] # this is one string

您可以看到“从列表中获取三个字符串”和“获取长度不超过三个字符的字符串”是非常不同的事情。 spaCy中的值就是这样的。

在下面的sn-p中,一个'step'是什么意思?我理解 max_steps=0 意味着无限步。但是我怎么知道有多少这样的“步骤”构成一个纪元? 1个这样的步骤涵盖了多少例句?

一个“步骤”是一个“批次”。 “批次”正在对一些示例进行训练并更新一次模型权重。您可以控制批次的大小,因此它可以是任意数量的示例。 “epoch”是指训练看到每个示例一次需要多长时间,因此如果您每批有 5 个文档和 30 个训练文档,那么 6 个步骤将是一个 epoch。

spaCy 不一定对训练中的“句子”一无所知,文档是批处理的基本单位。您的训练示例可能都是单句,但这不是必需的。

这些术语不是特定于 spaCy 的,它们广泛用于机器学习。

在训练过程中,在下面的 sn-p 代码中,learn_rate 究竟是如何修改的?更具体地说,total_steps 和 warmup_steps 是什么意思?

这是来自 Thinc,see the docs there

引用:

生成一个系列,从初始速率开始,然后是预热期,然后是线性下降。用于学习率。

total_steps 结束时,学习率停止变化。

最后,在训练过程的 CLI 输出中,这个“#”到底是什么?在 GitHub 讨论之一中提到“# 列是优化步骤的数量(= 处理的批次)”,但是这 1 个批次或“优化步骤”到底是什么?如果训练过程向我显示了 200 个这样的“批次”之后的分数,我该如何解释它(比如到那时为止已经处理了多少个例句)?

一个步骤与 #2 中的相同,它是一批。批量大小以文档而非句子表示。

【讨论】:

  • 我仍然对文档和例句之间的关系感到困惑。我的输入 jsonl 文件中有多少个句子在一个文档中?每个文档是 1 句话吗?
  • 这取决于您如何设置数据,我必须看到它才能说。一个文档可以包含任意数量的句子。当您调用 nlp(text) 时,无论文本中有多少个句子,都会生成一个文档。
  • 嗯...所以我的 jsonl 数据集的格式与 spaCy 示例项目之一(NER 时尚品牌)中建议的格式相同。然后我使用preprocess.py 脚本将jsonl 转换为.spacy 格式,据我所知,这个脚本一个接一个地循环每个句子,每次都准备一个文档。我想这意味着每个文档对象正好有 1 个句子?
  • 看时尚NER教程项目,它把JSONL中的每一行都变成了一个Doc。看起来 JSONL 中的许多示例不止一个句子,例如 eval 文件中的前两行。
  • 对了!我认为我们之间存在误解,在“示例”和“句子”之间。当我一直在说“句子”时,我实际上是在尝试引用一个“例句”(又名 1 行 JSONL 文件)。整个答案和讨论消除了一些疑问/困惑。非常感谢!
猜你喜欢
  • 2013-06-26
  • 2020-07-09
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
相关资源
最近更新 更多