0

DynamicLMClassifier.createNGramProcess(categories,nGram)20 GB を超える大きなデータセットでトレーニングしようとしています。現在、トレーニング ファイル全体を文字列としてトレーニング メソッドに供給していますが、明らかな理由から、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() をフィードすることです。モデルは、MLE を計算するためにそれぞれのカウントを含む ngrams タプルを記憶するだけでよいため、理論的にはこれは可能であると思います。

4

1 に答える 1

2

はい、これらの分類子を段階的にトレーニングできます。一度にすべてのデータを読み取ろうとしない独自のデータ ハンドラーを作成する必要があるだけです。上記はすべてのデータをバッファリングするわけではありませんが、トレーニング項目ごとに 1 回読み込むので、うまくいくはずです。それでもメモリが不足している場合は、コンテキストが長いか、明示的にプルーニングしていない場合に、20 GB を超える言語モデルを構築するのに多くのメモリが必要なためと考えられます。

私は、LingPipe のスケーリングが言語モデルに対してどのように機能するかについての論文を書きました。増分分類器は、多数の並列言語モデルを構築するだけです。

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

メモリを節約できるさらに極端な代替手段は、各カテゴリを個別にトレーニングし、後で分類子に結合することです。これは、LingPipe API でもサポートされています。

于 2016-03-31T22:15:10.020 に答える