Java 基于lingpipe的增量语言模型训练

Java 基于lingpipe的增量语言模型训练,java,nlp,language-model,lingpipe,Java,Nlp,Language Model,Lingpipe,我正在尝试在一个大于20GB的大数据集上训练一个dynamiclassizer.createNGramProcess(categories,nGram)。我目前正在将整个培训文件作为字符串提供给培训方法,出于明显的原因,我得到了一个java.lang.OutOfMemoryError:java堆空间 虽然可以增加JVM堆大小以支持此类培训,但我对找到一种增量方法感兴趣 培训代码如下所示: char[] csBuf = new char[numChars]; for (int i = 0; i &

我正在尝试在一个大于20GB的大数据集上训练一个
dynamiclassizer.createNGramProcess(categories,nGram)
。我目前正在将整个培训文件作为字符串提供给培训方法,出于明显的原因,我得到了一个
java.lang.OutOfMemoryError:java堆空间

虽然可以增加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();
}
char[]csBuf=新字符[numChars];
对于(int i=0;i

理想的解决方案是将分类器.handle()放入训练集的N个子集的循环中。理论上,我认为这应该是可能的,因为模型只需要记住ngrams元组及其各自的计数即可计算MLE。

是的,您可以增量地训练这些分类器。您只需要编写自己的数据处理程序,而不是试图一次读取所有数据。上面的方法并没有缓冲所有的数据,而是在每个训练项目中读取一次,这样就可以了。如果您的内存仍然不足,这可能是因为如果您有很长的上下文,或者没有在运行时显式删减,那么构建超过20GB的语言模型需要大量内存

我写了一篇关于LingPipe的语言模型伸缩工作原理的论文,增量分类器只是构建了一组并行语言模型


可以节省内存的一个更极端的替代方法是分别训练每个类别,然后将它们组合成一个分类器,这也是LingPipe API所支持的。

是的,您可以增量训练这些分类器。您只需要编写自己的数据处理程序,而不是试图一次读取所有数据。上面的方法并没有缓冲所有的数据,而是在每个训练项目中读取一次,这样就可以了。如果您的内存仍然不足,这可能是因为如果您有很长的上下文,或者没有在运行时显式删减,那么构建超过20GB的语言模型需要大量内存

我写了一篇关于LingPipe的语言模型伸缩工作原理的论文,增量分类器只是构建了一组并行语言模型


另一种可以节省内存的更极端的方法是分别训练每个类别,然后将它们组合成一个分类器,这也是LingPipe API支持的。

基本上如果我只需要调用
classifier.handle(classified)
使用相同的类别但不同的字符串?您应该为每个培训项目构造一个新的
classified
实例。然后你可以逐渐地将它们输入培训师,它们将被垃圾收集,这样它们就不必全部存在内存中。因此,基本上如果我只需要调用
分类器。使用相同的类别但不同的字符串处理(分类)
,你应该为每个培训项目构造一个新的
分类
实例。然后,你可以将它们增量地输入培训师,它们将被垃圾收集,这样它们就不必都存在于内存中。