web-dev-qa-db-ja.com

Tensorflowでは、sampled_softmax_lossとsoftmax_cross_entropy_with_logitsの違いは何ですか

Tensorflowには、 _softmax_cross_entropy_with_logits_ および _sampled_softmax_loss_ というメソッドがあります。

私はテンソルフロードキュメントを読んで詳細をgoogleで検索しましたが、違いを見つけることができませんでした。私はどちらもsoftmax関数を使用して損失を計算しているように見えます。

_sampled_softmax_loss_を使用して損失を計算する

_loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(...))
_

_softmax_cross_entropy_with_logits_を使用して損失を計算する

_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(P, Q))
_

私にとって、ソフトマックス損失の計算は、ソフトマックスクロスエントロピーの計算と同じです(例:cross_entropy(softmax(train_x))

なぜ2つの異なる方法があり、どの場合にどの方法を使用する必要があるのか​​を誰かに教えてもらえますか?

15
HongKun Yoo

ターゲット語彙(つまり、予測するクラスの量)が本当に大きい場合、辞書内のすべての単語の確率を計算する必要があるため、通常のソフトマックスを使用することは非常に困難です。 sampled_softmax_lossを使用すると、ボキャブラリーのサブセット[〜#〜] v [〜#〜]のみを考慮して損失を計算します。

サンプリングされたsoftmaxは、ボキャブラリサイズよりも小さい値をサンプリングした場合にのみ意味があります(=[〜#〜] v [〜#〜])。語彙(ラベルの数)が少ない場合は、sampled_softmax_lossを使用しても意味がありません。

このペーパーで実装の詳細を確認できます。 http://arxiv.org/pdf/1412.2007v2.pdf

また、それが使用されている例を見ることができます-これでシーケンスからシーケンスへの変換 example

18
Farseer

サンプリング:

どちらの場合も、サンプリングとは、出力として可能なすべてのことについて計算するのではないことを意味します(たとえば、辞書に含まれる単語が多すぎて、派生ごとにすべてを取得できないため、いくつかのサンプルを取得して学習しますNLPの問題については)。

softmax_cross_entropy_with_logits

これは相互エントロピーであり、ロジットを入力として受け取り、損失として使用できるものを生成します。

sampled_softmax_loss

これはサンプルのsoftmax_cross_entropy_with_logitsであるため、完全なクロスエンスロピーを使用するのではなく、クロスエンスロピーを使用する前に数サンプルを取得します。 https://github.com/tensorflow/tensorflow/blob/r1.2/tensorflow/ python/ops/nn_impl.py#L1269

2