我正在尝试训练自定义NER模型以识别41个实体(训练集约有6000行)
当我尝试运行nlp site中提供的训练命令时:
java -cp stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier -prop austen.prop
这是我面临的错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at edu.stanford.nlp.optimization.AbstractCachingDiffFunction.ensure(AbstractCachingDiffFunction.java:136)
at edu.stanford.nlp.optimization.AbstractCachingDiffFunction.derivativeAt(AbstractCachingDiffFunction.java:151)
at edu.stanford.nlp.optimization.QNMinimizer.evaluateFunction(QNMinimizer.java:1150)
at edu.stanford.nlp.optimization.QNMinimizer.minimize(QNMinimizer.java:898)
at edu.stanford.nlp.optimization.QNMinimizer.minimize(QNMinimizer.java:856)
at edu.stanford.nlp.optimization.QNMinimizer.minimize(QNMinimizer.java:850)
at edu.stanford.nlp.optimization.QNMinimizer.minimize(QNMinimizer.java:93)
at edu.stanford.nlp.ie.crf.CRFClassifier.trainWeights(CRFClassifier.java:1935)
at edu.stanford.nlp.ie.crf.CRFClassifier.train(CRFClassifier.java:1742)
at edu.stanford.nlp.ie.AbstractSequenceClassifier.train(AbstractSequenceClassifier.java:785)
at edu.stanford.nlp.ie.AbstractSequenceClassifier.train(AbstractSequenceClassifier.java:756)
at edu.stanford.nlp.ie.crf.CRFClassifier.main(CRFClassifier.java:3011)
我尝试将-Xmx4096m添加到我的java命令中,以将最大堆空间指定为4GB(这是我的计算机中的最大可用空间),但仍然没有运气。
我还尝试添加-Xms1024m来指定最小堆空间,但没有不同的结果。
当我尝试使用该命令训练20个实体(1500行)的模型时,该命令完美运行,没有任何堆空间错误
此堆空间与RAM或可用空间有关吗?
我应该尝试在具有更多内存或存储空间的机器上进行培训吗?
答案 0 :(得分:1)
如果您认为自己最终遇到了内存可用性问题,请参考斯坦福大学的指导原则(如果可以,请回头)。
java -mx4g.
limited-memory quasi-Newton optimizer (L-BFGS)
的内存。优化器保留许多过去的猜测,这些猜测用于近似Hessian。拥有更多的猜测可以使估计更加准确,并且优化速度更快,但是系统在优化过程中使用的内存在猜测数目中是线性的。这由参数qnSize
指定。默认值为25。使用10完全足够。如果您内存不足,则仍然可以使用较小的值工作,即使只有2值。maxLeft=1
,并且没有一个特征引用答案类的特征超过一个-可以在任何距离之外都引用单词特征)。虽然代码支持任意顺序的CRF,但是构建第二,第三或第四阶CRF将大大增加内存使用量,通常是没有必要的。请记住:maxLeft指的是您的功能使用的类上下文的大小(即,它比集团的大小小一个)。一阶CRF仍然可以向左或向右任意偏远,以获取有关所观察到的数据上下文的信息。