12分钟

训练

1. 训练也称作encoding, 是通过crf_learn 程序来完成的。

2. 训练的命令为:

crf_learn template_file train_file model_file

其中:

  • template_file:人工编写的模板文件
  • train_file:人工标注的训练文件
  • model_fileCRF++ 生成的模型文件

3. 训练的输出内容如下:

CRF++: Yet Another CRF Tool Kit
Copyright(C) 2005 Taku Kudo, All rights reserved.​

reading training data: 100.. 200.. 300.. 400.. 500.. 600.. 700.. 800.. 
Done! 1.94 s​

Number of sentences: 823
Number of features:  1075862
Number of thread(s): 1
Freq:                1
eta:                 0.00010
C:                   1.00000
shrinking size:      20
Algorithm:           CRF​

iter=0 terr=0.99103 serr=1.00000 obj=54318.36623 diff=1.00000
iter=1 terr=0.35260 serr=0.98177 obj=44996.53537 diff=0.17161
...

其中:

  • iter:表示迭代次数
  • terr:表示标记的训练错误率,它等于标记的训练错误数量 / 标记的总数
  • serr:表示sentence 的训练错误率,它等于sentence的训练错误数量 / sentence的总数
  • obj:当前的目标函数值。当目标函数值收敛到某个固定值时,CRF++ 停止迭代。
  • diff:目标函数值的相对变化。它等于当前的目标函数值减去上一个目标函数值。

4. 常用训练参数:

  • -a CRF-L2 或者 -a CRF-L1:选择训练算法。 CRF-L2 表示L2 正则化的CRF ,它也是CRF++ 的默认选择。CRF-L1 表示L1 正则化的CRF
  • -c float:设置CRF 的正则化项的系数 Cfloat 是一个大于0的浮点数,默认为 1.0。 如果 C 较大,则CRF++ 容易陷入过拟合。通过调整该参数,模型可以在欠拟合和过拟合之间取得平衡。
  • -f NUM:设置特征的下限,NUM 是一个整数,默认为 1 。 如果某个特征(由特征模板生成的)发生的次数小于NUM,则该特征会被忽略。 当应用于大数据集时,特征的种类可能到达上百万,此时设置一个较大的NUM 会过滤掉大部分低频特征,提高模型的计算效率。
  • -p NUM:设置线程数量,NUM 是一个整数。 如果是多核CPU,则可以通过多线程来加速训练。NUM 表示线程的数量。
  • -t:同时生成文本格式的模型,用于调试。
  • -e float:设置停止条件的阈值,float 是一个大于0的浮点数,默认为 1.00.0001。
  • -v:显示版本并退出程序。
  • -m NUM:设置LBFGS 的最大迭代次数,NUM 是一个整数,默认为 10K 。

5. 在v0.45 以后的CRF++ 版本中,支持single-best MIRA 训练算法。 Margin-infused relaxed algorithm:MIRA 是一种超保守在线算法, 在分类、排序、预测等应用领域取得不错成绩。 通过参数 -a MIRA 来选择MIRA 算法。

  • 输出:

CRF++: Yet Another CRF Tool Kit
Copyright(C) 2005 Taku Kudo, All rights reserved.​

reading training data: 100.. 200.. 300.. 400.. 500.. 600.. 700.. 800.. 
Done! 1.92 s​

Number of sentences: 823
Number of features:  1075862
Number of thread(s): 1

Freq:                1
eta:                 0.00010
C:                   1.00000
shrinking size:      20
Algorithm:           MIRA

​iter=0 terr=0.11381 serr=0.74605 act=823 uact=0 obj=24.13498 kkt=28.00000
iter=1 terr=0.04710 serr=0.49818 act=823 uact=0 obj=35.42289 kkt=7.60929
...

其中:

  • iter,terr,serr:意义与前面CRF 相同
  • actworking set 中,active 的样本的数量
  • uact:对偶参数达到软边界的上界 C 的样本的数量。 如果为0,则表明给定的训练样本是线性可分的。
  • obj:当前的目标函数值 ||w ⃗ | |²
  • kkt:最大的kkt 违反值。当它为 0.0 时,训练结束。

  • 参数:
    • -c float:设置软边界的参数 Cfloat 是一个大于0的浮点数。 如果 C 较大,则CRF++ 容易陷入过拟合。通过调整该参数,模型可以在欠拟合和过拟合之间取得平衡。
    • -H NUM:设置shrinking size 。 当一个训练sentence 未能应用于更新参数向量NUM 次时,认为该sentence 不再对训练有用。此时CRF++ 会删除该sentence 。 当shrinking size 较小时,会在早期发生收缩。这会大大减少训练时间。 但是不建议使用太小的shrinking size ,因为训练结束时,MIRA 会再次尝试所有的训练样本,以了解是否所有KKT 条件得到满足。shrinking size 条小会增加重新检查的机会。
    • -f NUM-e-t-p-v:意义与前面CRF 相同