Vowpal Wabbit继续训练

时间:2014-09-16 01:46:00

标签: vowpalwabbit

继续进行一些实验here我感兴趣的是如何继续训练大众模型。

我首先跑了这个并保存了模型。

vw -d housing.vm --loss_function squared -f housing2.mod --invert_hash readable.housing2.mod

检查可读模型:

Version 7.7.0
Min label:0.000000
Max label:50.000000
bits:18
0 pairs: 
0 triples: 
rank:0
lda:0
0 ngram: 
0 skip: 
options:
:0
 ^AGE:104042:0.020412
 ^B:158346:0.007608
 ^CHAS:102153:1.014402
 ^CRIM:141890:0.016158
 ^DIS:182658:0.278865
 ^INDUS:125597:0.062041
 ^LSTAT:170288:0.028373
 ^NOX:165794:2.872270
 ^PTRATIO:223085:0.108966
 ^RAD:232476:0.074916
 ^RM:2580:0.330865
 ^TAX:108300:0.002732
 ^ZN:54950:0.020350
Constant:116060:2.728616

如果我继续使用另外两个例子(在housing_2.vm中)继续训练模型,那么注意,ZN和CHAS的值为零:

27.50 |  CRIM:0.14866 ZN:0.00 INDUS:8.560 CHAS:0 NOX:0.5200 RM:6.7270 AGE:79.90 DIS:2.7778 RAD:5 TAX:384.0 PTRATIO:20.90 B:394.76 LSTAT:9.42
26.50 |  CRIM:0.11432 ZN:0.00 INDUS:8.560 CHAS:0 NOX:0.5200 RM:6.7810 AGE:71.30 DIS:2.8561 RAD:5 TAX:384.0 PTRATIO:20.90 B:395.58 LSTAT:7.67

如果加载了保存的模型并且继续训练,则系数似乎从这些零值特征中丢失。我做错了什么或这是一个错误?

vw -d housing_2.vm --loss_function squared -i housing2.mod --invert_hash readable.housing3.mod

输出来自readable.housing3.mod:

Version 7.7.0
Min label:0.000000
Max label:50.000000
bits:18
0 pairs: 
0 triples: 
rank:0
lda:0
0 ngram: 
0 skip: 
options:
:0
 ^AGE:104042:0.023086
 ^B:158346:0.008148
 ^CRIM:141890:1.400201
 ^DIS:182658:0.348675
 ^INDUS:125597:0.087712
 ^LSTAT:170288:0.050539
 ^NOX:165794:3.294814
 ^PTRATIO:223085:0.119479
 ^RAD:232476:0.118868
 ^RM:2580:0.360698
 ^TAX:108300:0.003304
Constant:116060:2.948345

1 个答案:

答案 0 :(得分:2)

如果您想以平稳的方式从已保存状态继续学习,则必须使用--save_resume选项。

有3种根本不同类型的“状态”可以保存到vw“模型”文件中:

  1. 显然是权重向量(回归量)。这就是模型本身。
  2. 不变参数,例如vw的版本(以确保版本之间并不总是保留的二进制兼容性),向量中的位数(-b)和模型类型
  3. 在学习期间动态变化的状态。该子集包括学习和衰减率等参数,这些参数在学习过程中逐渐变化,每个示​​例,示例数字本身等等。
  4. --save_resume保存最后一组。

    - save_resume不是默认值,因为它有开销,在大多数用例中它不需要。例如如果你保存模型一次以进行许多预测而没有学习(-t),则无需保存第三个状态子集。

    因此,我相信您的具体情况,您希望使用--save_resume

    始终存在错误的可能性,特别是因为vw支持如此多的选项(最后计数约为100),这些选项通常是相互依赖的。有些选项组合有意义,有些则没有。对大约2 ^ 100个可能的选项组合进行健全性检查有点不切实际。如果您发现了错误,请在github上打开一个问题。在这种情况下,请确保使用完整的示例(完整数据和命令行),以便重现您的问题。

    更新2014-09-20(在github上打开问题后,谢谢!): 0值特征“消失”(不是真的来自模型,但只来自--invert_hash输出)的原因是1)--invert_hash从未设计用于多次传递,因为保留原始特征名称哈希表会产生很大的性能开销2)缺少的功能是零值的功能,这些功能将被丢弃。模型本身应该仍然具有任何先前传递非零权重的任何特征。由于实现原因,修复这种不一致性太复杂且成本太高,并且会违背使vw更快的最重要动机,特别是对于最有用/常见的用例。无论如何,感谢报告,我也从中学到了新东西。