gpt4 book ai didi

java - 使用 lingpipe 进行增量语言模型训练

转载 作者:行者123 更新时间:2023-12-02 03:45:54 24 4
gpt4 key购买 nike

我正在尝试在 > 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 个子集的循环中提供 classifier.handle()。从理论上讲,我认为这应该是可能的,因为模型只需要记住 ngrams 元组及其各自的计数来计算 MLE。

最佳答案

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

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

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

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

关于java - 使用 lingpipe 进行增量语言模型训练,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36297422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com