【问题标题】:Incremental language model training with lingpipe使用 lingpipe 进行增量语言模型训练
【发布时间】:2016-03-30 00:15:44
【问题描述】:

我正在尝试在大于 20GB 的大型数据集上训练 DynamicLMClassifier.createNGramProcess(categories,nGram)。我目前正在将整个培训文件作为字符串提供给培训方法,出于显而易见的原因,我得到了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();
}

理想的解决方案是在训练集的 N 个子集的循环中提供分类器.handle()。从理论上讲,我认为这应该是可能的,因为模型只需要记住具有各自计数的 ngram 元组来计算 MLE。

【问题讨论】:

    标签: java nlp language-model lingpipe


    【解决方案1】:

    是的,您可以逐步训练这些分类器。您只需要编写自己的数据处理程序,它不会尝试一次读取所有数据。上面没有缓冲所有数据,而是在每个训练项目中读取一次,所以应该可以。如果您的内存仍然不足,那可能只是因为如果您有较长的上下文或没有在执行过程中显式修剪,则构建超过 20GB 的语言模型需要大量内存。

    我写了一篇关于 LingPipe 的缩放如何适用于语言模型的论文,而增量分类器只是构建了一堆并行的语言模型。

    http://www.aclweb.org/anthology/W05-1107

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

    【讨论】:

    • 所以基本上如果我只需要使用相同的类别但不同的字符串调用classifier.handle(classified)
    • 您应该为每个训练项目构造一个新的classified 实例。然后你可以将它们逐步输入到训练器中,它们会被垃圾收集起来,这样它们就不必全部存在于内存中。
    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2020-08-12
    • 2021-06-22
    相关资源
    最近更新 更多