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つの異なる方法があり、どの場合にどの方法を使用する必要があるのかを誰かに教えてもらえますか?
ターゲット語彙(つまり、予測するクラスの量)が本当に大きい場合、辞書内のすべての単語の確率を計算する必要があるため、通常のソフトマックスを使用することは非常に困難です。 sampled_softmax_loss
を使用すると、ボキャブラリーのサブセット[〜#〜] v [〜#〜]のみを考慮して損失を計算します。
サンプリングされたsoftmaxは、ボキャブラリサイズよりも小さい値をサンプリングした場合にのみ意味があります(=[〜#〜] v [〜#〜])。語彙(ラベルの数)が少ない場合は、sampled_softmax_loss
を使用しても意味がありません。
このペーパーで実装の詳細を確認できます。 http://arxiv.org/pdf/1412.2007v2.pdf
また、それが使用されている例を見ることができます-これでシーケンスからシーケンスへの変換 example
どちらの場合も、サンプリングとは、出力として可能なすべてのことについて計算するのではないことを意味します(たとえば、辞書に含まれる単語が多すぎて、派生ごとにすべてを取得できないため、いくつかのサンプルを取得して学習します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