2016-03-30 4 views
0

私はDynamicLMClassifier.createNGramProcess(categories,nGram)を20GBを超える大きなデータセットに訓練しようとしています。私は現在トレーニングファイル全体をストリングとしてトレーニングメソッドに渡しています。明らかに私はAを得ていますjava.lang.OutOfMemoryError: Java heap spacelingpipeによるインクリメンタル言語モデルトレーニング

興味深いトレーニングをサポートするために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を計算するためにそれぞれのカウントでnグラムのタプルを覚えておく必要があるだけなので、これは可能であるべきだと思います。

答えて

2

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

私はLingPipeのスケーリングが言語モデルにどのように作用するかについての論文を書いており、インクリメンタルな分類器は多くの並列言語モデルを構築しています。

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

メモリを節約することができ、さらに極端な選択肢は別に、各カテゴリを訓練し、その後もLingPipeのAPIによってサポートされている分類器、に後でそれらを組み合わせることです。

+0

なので、基本的に 'categoryifier.handle(類別)'を同じカテゴリでも別の文字列で呼び出すだけでいいですか? – gidim

+1

各トレーニング項目に対して新しい 'classified'インスタンスを作成する必要があります。その後、それらをトレーナーに漸進的に供給することができ、ガベージコレクションが行われ、すべてがメモリに収まる必要はありません。 –