«main» java.lang.OutOfMemoryError: Ошибка кучи Java в обучении модели распознавания пользовательских объектов Стэнфорда - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь обучить пользовательскую модель NER распознавать 41 объект (в обучающем наборе около 6000 строк)

Когда я пытаюсь запустить обучающую команду, предоставленную на сайте nlp :

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, чтобы указать максимальное пространство кучи как 4 ГБ (это максимальное доступное пространство на моей машине), но все равно не повезло.

Я также попытался добавить -Xms1024m, чтобы указать минимальное пространство кучи, но результат не изменился.

Эта же команда работала без ошибок, без ошибок пространства кучи, когда я пытался обучить модель для 20 объектов (1500 строк)

Это пространство кучи связано с ОЗУ или доступным пространством?

Должен ли я попробовать обучение на машине с большим количеством памяти или хранилища?

1 Ответ

1 голос
/ 08 июля 2019

Если вы считаете, что у вас возникла проблема с доступностью памяти, вот рекомендации от Стэнфорда (обратитесь, если сможете).

  1. В конечном итоге, если у вас множество функций и множество классоввам нужно иметь много памяти для обучения CRFClassifier.Мы часто обучаем модели, которые требуют несколько гигабайт оперативной памяти и привыкли набирать java -mx4g.
  2. . Вы можете уменьшить память limited-memory quasi-Newton optimizer (L-BFGS).Оптимизатор поддерживает ряд прошлых догадок, которые используются для приближения к гессиану.Наличие большего количества догадок делает оценку более точной, а оптимизация - быстрее, но память, используемая системой во время оптимизации, линейна по числу догадок.Это указывается параметром qnSize.По умолчанию 25. Использование 10 вполне достаточно.Если вам не хватает памяти, все равно будет работать с гораздо меньшими значениями, даже просто со значением 2.
  3. Уменьшите порядок CRF.Обычно мы используем только CRF первого порядка (maxLeft=1 и никаких функций, которые относятся к классу ответов более чем один раз - можно ссылаться на словесные объекты на любом расстоянии).Хотя код поддерживает CRF произвольного порядка, создание CRF второго, третьего или четвертого порядка значительно увеличит использование памяти и обычно не требуется.Помните: maxLeft относится к размеру контекстов класса, которые используют ваши функции (то есть он меньше размера клика).CRF первого порядка все еще может смотреть произвольно далеко влево или вправо, чтобы получить информацию о наблюдаемом контексте данных.
  4. Уменьшите количество созданных объектов.Чтобы увидеть все сгенерированные функции, вы можете установить для свойства printFeatures значение true.Затем CRFClassifier запишет (потенциально огромные) файлы в текущий каталог, перечисляя функции, сгенерированные для каждой позиции токена.Опции, которые генерируют огромное количество функций, включают useWordPairs и useNGrams, когда maxNGramLeng является большим числом.
  5. Уменьшите количество классов в вашей модели.Это может или не может быть возможным, в зависимости от ваших требований к моделированию.Но временная сложность пропорциональна количеству классов, поднятых до размера клики.
  6. Используйте флаг useObservedSeptionsOnly = true.Это позволяет маркировать смежные слова только последовательностями меток, которые были видны рядом друг с другом в данных обучения.Для некоторых видов данных это на самом деле дает лучшую точность, для других - хуже.Но если шаблоны последовательности меток не будут плотными, это уменьшит использование вашей памяти.
  7. Конечно, сокращение объема обучающих данных также уменьшит необходимую память, но не очень желательно, если вы пытаетесьтренировать лучший классификатор.Однако вы можете выбросить предложения, в которых нет сущностей.
  8. Если вас беспокоит использование памяти во время выполнения, некоторые из перечисленных выше элементов по-прежнему применимы (количество функций и классов, useObservedSeptionsOnly и порядокCRF), но кроме того, вы можете использовать флаг featureDiffThresh, например, featureDiffThresh = 0,05.В процессе обучения CRFClassifier будет обучать одну модель, сбрасывать все характеристики с весом (абсолютной величиной) ниже заданного порога и затем обучать вторую модель.Обучение, таким образом, занимает больше времени, но получающаяся модель меньше и быстрее во время выполнения, и обычно имеет очень похожую производительность для разумного порога, такого как 0,05.
...