私は、大きな語彙を扱うことができる階層的なsoftmaxモデル、例えば10Mクラスのオーダーを実装することに興味があります。大規模なクラスにスケーラビリティがあり、効率的になるようにするには、これを行う最善の方法は何ですか?例えば、少なくともone paperは、各ノードがクラスする2レベルのツリーを使用する場合、HSが大きなボキャブのスピードアップを〜25倍に達成できることを示しています。sqrt(N)
私は、任意の枝ツリーの任意の枝分かれ係数を持つより一般的なバージョンにも興味があります。Tensorflowのスケーラブルで効率的な階層的Softmax?
私はここを参照してくださいいくつかのオプションがあります:
1)私たちはインデックスと分割を収集し、すべてのバッチのためのtf.gather
を実行しますが。これは、大規模なバッチサイズと太ったツリーで問題が発生し、係数が重複してOOMエラーにつながります。
2)#1と同様に、tf.embedding_lookup
を使用するとOOMエラーの助けになりますが、すべてがCPU上に保持され、かなり遅くなります。
3)tf.map_fn
とparallel_iterations=1
を使用して、それぞれのサンプルを別々に処理し、ギャザーを使用します。これははるかにスケーラブルですが、実際にはシリアライゼーションのために25倍のスピードアップに近づくことはありません。
HSを実装する方法はありますか?深くて狭いものと狭いものと広いものと広いものとの異なる方法がありますか?
これらはタスクによって異なります。言語モデルのバッチサイズは約400で、隠れサイズは約300です。他のタスクは、imagenet分類のようにバッチサイズが小さく、隠されたサイズが大きくなる場合があります。 VRAMとRAMは問題に比べてかなり大きい(GPU RAMはそうではないが)。 –
TensorflowであなたのHS実装を見てみることはできますか?私は現在それも必要です。 –
少し面倒ですが、ここをクリックしてください:https://github.com/tansey/sdp/blob/87e701c9b0ff3eacab29713cb2c9e7181d5c26aa/tfsdp/models.py#L205 - 私は、pytorchや他の動的グラフフレームワークの使用をお勧めします。 –