Инкрементальная языковая модель обучения с помощью лингпайпа
Я пытаюсь тренировать DynamicLMClassifier.createNGramProcess(categories,nGram)
на большом наборе данных> 20GB. В настоящее время я передаю весь учебный файл в виде строки для методов обучения, и по понятным причинам я получаю java.lang.OutOfMemoryError: Java heap space
Хотя может быть возможно увеличить размер кучи JVM для поддержки такого обучения, я заинтересован в поиске метода приращения.
Учебный код выглядит так:
char[] csBuf = new char[numChars];
for (int i = 0; i < categories.length; ++i) {
String category = categories[i];
File trainingFile = new File(new File(dataDir,category),
category + ".txt");
FileInputStream fileIn
= new FileInputStream(trainingFile);
InputStreamReader reader
= new InputStreamReader(fileIn,Strings.UTF8);
reader.read(csBuf);
String text = new String(csBuf,0,numChars);
Classification c = new Classification(category);
Classified<CharSequence> classified
= new Classified<CharSequence>(text,c);
classifier.handle(classified);
reader.close();
}
Идеальным решением было бы подать classifier.handle() в цикле из N подмножеств обучающего набора. Теоретически я думаю, что это должно быть возможно, так как модель должна помнить только кортежи ngrams с соответствующими значениями для вычисления MLE.
1 ответ
Да, вы можете обучать эти классификаторы постепенно. Вам просто нужно написать свой собственный обработчик данных, который не пытается прочитать все данные сразу. Вышеупомянутое не буферизует все данные, но читает их один раз для каждого элемента обучения, так что это должно работать. Если вам все еще не хватает памяти, возможно, это просто потому, что для построения языковой модели более 20 ГБ требуется много памяти, если у вас длинный контекст или вы явно не сокращаете его по ходу работы.
Я написал статью о том, как работает масштабирование LingPipe для языковых моделей, а инкрементные классификаторы просто создают кучу параллельных языковых моделей.
http://www.aclweb.org/anthology/W05-1107
Еще более экстремальная альтернатива, которая может сэкономить память, - это тренировать каждую категорию отдельно, а затем объединять их в классификатор, который также поддерживается API LingPipe.