tf.nn.softmax_cross_entropy_with_logits
との主な違いはtf.losses.log_loss
何ですか? どちらの方法も、分類タスクの交差エントロピー損失を計算するために 1-hot ラベルとロジットを受け入れます。
2 に答える
これらの方法は理論的にはそれほど違いはありませんが、実装には多くの違いがあります。
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
この場合、等しい出力が得られましたが、常にそうであるとは限りません