3

tf.nn.softmax_cross_entropy_with_logitsとの主な違いはtf.losses.log_loss何ですか? どちらの方法も、分類タスクの交差エントロピー損失を計算するために 1-hot ラベルとロジットを受け入れます。

4

2 に答える 2

3

これらの方法は理論的にはそれほど違いはありませんが、実装には多くの違いがあります。

1)tf.nn.softmax_cross_entropy_with_logitsは単一クラスのラベル用に設計されていtf.losses.log_lossますが、マルチクラスの分類に使用できます。tf.nn.softmax_cross_entropy_with_logitsマルチクラス ラベルをフィードしてもエラーは発生しませんが、勾配が正しく計算されず、トレーニングが失敗する可能性が高くなります。

公式ドキュメントから:

注: クラスは相互に排他的ですが、確率はそうである必要はありません。必要なのは、ラベルの各行が有効な確率分布であることだけです。そうでない場合、勾配の計算は正しくありません。

2) tf.nn.softmax_cross_entropy_with_logits(名前からわかるように) 最初に予測に基づいてソフトマックス関数を計算しますが、log_loss はこれを行いません。

3)損失関数の各要素に重みを付けたり、log(0) 値を回避するために計算で使用される をtf.losses.log_loss指定したりできるという意味で、少し広い機能を備えています。epsilon

4) 最後にtf.nn.softmax_cross_entropy_with_logits、バッチ内のすべてのエントリの損失をtf.losses.log_loss返しますが、オプティマイザで直接使用できる削減された (デフォルトではすべてのサンプルの合計) 値を返します。

UPD:もう 1 つの違いは、損失の計算方法です。対数損失では、負のクラス (ベクトルに 0 があるもの) が考慮されます。まもなく、交差エントロピー損失により、ネットワークは正しいクラスの最大入力を生成するようになり、負のクラスは気にしなくなります。対数損失は両方を同時に行い、正しいクラスの値を大きくし、負の値を小さくします。数式では、次のようになります。

交差エントロピー損失:

ここに画像の説明を入力

対数損失:

ここに画像の説明を入力

ここで、i は対応するクラスです。

たとえば、labels=[1,0] と predicts_with_softmax = [0.7,0.3] の場合:

1) クロスエントロピー損失: -(1 * log(0.7) + 0 * log(0.3)) = 0.3567

2) 対数損失: - (1*log(0.7) + (1-1) * log(1 - 0.7) +0*log(0.3) + (1-0) log (1- 0.3)) = - (log (0.7) + ログ (0.7)) = 0.7133

そして、デフォルト値を使用する場合は、出力をゼロ以外の要素の数 (ここでは 2) でtf.losses.log_loss割る必要があります。log_loss最後に: tf.nn.log_loss = 0.7133 / 2 = 0.3566

この場合、等しい出力が得られましたが、常にそうであるとは限りません

于 2017-11-12T06:46:47.893 に答える