spaCy NER 训练期间的训练时期解释

Training epochs interpretation during spaCy NER training

我正在用 transformer 训练我的 NER 模型,我不太确定为什么训练在某个时候停止了,或者为什么它甚至有这么多批次。这是我的配置文件的样子(相关部分):

[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 = 2
max_steps = 0
eval_frequency = 200
frozen_components = []
before_to_disk = null

[training.batcher]
@batchers = "spacy.batch_by_words.v1"
discard_oversize = false
tolerance = 0.2
get_length = null

[training.batcher.size]
@schedules = "compounding.v1"
start = 100
stop = 1000
compound = 1.001
t = 0.0

[training.optimizer]
@optimizers = "Adam.v1"
beta1 = 0.9
beta2 = 0.999
L2_is_weight_decay = true
L2 = 0.01
grad_clip = 1.0
use_averages = false
eps = 0.00000001
learn_rate = 0.00005

这是训练日志:

============================= Training pipeline =============================
ℹ Pipeline: ['transformer', 'ner']
ℹ Initial learn rate: 5e-05
E    #       LOSS TRANS...  LOSS NER  ENTS_F  ENTS_P  ENTS_R  SCORE 
---  ------  -------------  --------  ------  ------  ------  ------
  0       0         398.75     40.97    2.84    3.36    2.46    0.03
  0     200         906.30   1861.38   94.51   94.00   95.03    0.95
  0     400         230.06   1028.51   98.10   97.32   98.89    0.98
  0     600          90.22   1013.38   98.99   98.40   99.58    0.99
  0     800          80.64   1131.73   99.02   98.25   99.81    0.99
  0    1000          98.50   1260.47   99.50   99.16   99.85    1.00
  0    1200          73.32   1414.91   99.49   99.25   99.73    0.99
  0    1400          84.94   1529.75   99.70   99.56   99.85    1.00
  0    1600          55.61   1697.55   99.75   99.63   99.87    1.00
  0    1800          80.41   1936.64   99.75   99.63   99.87    1.00
  0    2000         115.39   2125.54   99.78   99.69   99.87    1.00
  0    2200          63.06   2395.48   99.80   99.75   99.85    1.00
  0    2400         104.14   2574.36   99.87   99.79   99.96    1.00
  0    2600          86.07   2308.35   99.88   99.79   99.97    1.00
  0    2800          81.05   1853.15   99.90   99.87   99.93    1.00
  0    3000          52.67   1462.61   99.96   99.93   99.99    1.00
  0    3200          57.99   1154.62   99.94   99.91   99.97    1.00
  0    3400         110.74    847.50   99.90   99.85   99.96    1.00
  0    3600          90.49    621.99   99.90   99.91   99.90    1.00
  0    3800          51.03    378.93   99.87   99.78   99.97    1.00
  0    4000          93.40    274.80   99.95   99.93   99.97    1.00
  0    4200         138.98    203.28   99.91   99.87   99.96    1.00
  0    4400         106.16    127.60   99.70   99.75   99.64    1.00
  0    4600          70.28     87.25   99.95   99.94   99.96    1.00
✔ Saved pipeline to output directory
training/model-last

我试图训练我的模型 2 个时期(max_epochs=2),我的训练文件有大约 123591 个示例,开发文件有 2522 个示例。

我的问题是:

编辑:继续我的第二个要点,我很想知道为什么训练一直进行到 4600 个批次,因为至少 4600 个批次意味着 4600*100 = 460000 个示例,我给出了 123591火车的例子,所以我显然已经超过了第一个纪元,但 E 仍然读作 0。

我认为你的训练停止是因为: 耐心 = 1600 如果那么多批次都没有改善,则告诉训练停止。

对于我的数据集,我必须大幅提高 'patience'。否则(类似于你的情况)我什至没有完成纪元 0。我只是羡慕你的分数。我很少超过 0.9 ...

max_epochs=2 告诉它在 2 个纪元后停止,这不是最小值。

the FAQ 中有一个条目,但总结一下:

  • max_steps 是最大迭代次数。 (不是“评估迭代”,而是批次。)
  • max_epochs是最大epoch数。
  • 如果训练 patience 批次而没有改进,它将停止。这就是停止训练的原因。

您的模型似乎已经获得了满分,所以我不确定为什么在这种情况下提前停止是个问题,但这就是正在发生的事情。