web-dev-qa-db-ja.com

Keras:binary_crossentropy&categorical_crossentropy confusion

TensorFlowをしばらく使用した後、Kerasのチュートリアルをいくつか読んで、いくつかの例を実装しました。損失関数としてkeras.losses.binary_crossentropyを使用する畳み込みオートエンコーダのチュートリアルをいくつか見つけました。

binary_crossentropynotはマルチクラスの損失関数であり、バイナリラベルを使用する可能性が高いと考えましたが、実際にはKeras(TF Python backend)コールtf.nn.sigmoid_cross_entropy_with_logits、これは実際には、not相互に排他的な複数の独立したクラスを持つ分類タスクを対象としています。

一方、categorical_crossentropyに対する私の期待は、ターゲットクラスhaveが相互に依存するマルチクラス分類を対象とするものでしたが、必ずしもワンホットエンコードではありません。

ただし、Kerasのドキュメントには次のように記載されています。

(...)categorical_crossentropy損失を使用する場合、ターゲットはカテゴリ形式である必要があります(たとえば、クラスが10個ある場合、各サンプルのターゲットは、allである10次元ベクトルである必要があります-zerosは、サンプルのクラスに対応するインデックスで1を期待します)。

私が間違っていない場合、これはワンホットエンコードされた分類タスクの特別なケースですが、基になるクロスエントロピー損失は確率分布(「マルチクラス」、依存ラベル)でも機能しますか?

さらに、Kerasは実装にtf.nn.softmax_cross_entropy_with_logits(TF pythonバックエンド)を使用しますが、それ自体 states

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

私が間違っている場合は修正してください。しかし、Kerasのドキュメントは、少なくとも「詳細」ではないようです。

では、ケラスの損失関数の命名の背後にある考え方は何ですか?ドキュメントは正しいですか?バイナリクロスエントロピーが本当にバイナリラベルに依存している場合、オートエンコーダではnotが機能するはずです。同様に、カテゴリカルクロスエントロピー:ドキュメントが正しい場合、ワンホットエンコードされたラベルに対してのみ機能する必要がありますか?

9
daniel451

あなたはこれらの損失のそれぞれが適用される領域を定義することによって正しいです:

  • binary_crossentropy (およびtf.nn.sigmoid_cross_entropy_with_logitsの内部)はbinary multi-label分類(ラベル独立しています)。
  • categorical_crossentropy (およびtf.nn.softmax_cross_entropy_with_logitsの内部)はmulti-class分類用です(クラスは排他的)。

この質問 の詳細な分析も参照してください。

どういうチュートリアルなのかわからないので、binary_crossentropyがオートエンコーダの良い選択か悪い選択かについてコメントすることはできません。

ネーミングに関しては、それは絶対に正しく合理的です。または、sigmoidsoftmaxの名前の方がいい音だと思いますか?

したがって、あなたの質問に残っている唯一の混乱は、categorical_crossentropyのドキュメントです。述べられているすべてが正しいことに注意してください:損失はワンホット表現をサポートします。この関数indeedは、テンソルフローバックエンドとそのドキュメントに含めることができますが、これは私にとって重要ではありません。さらに、他のバックエンド、theanoとCNTKでソフトクラスがサポートされているかどうかを確認する必要があります。 kerasは最小限に抑え、ほとんどの一般的なユースケースを対象としていることを忘れないでください。ここでロジックを理解できます。

4
Maxim

これがあなたの質問に答えるかどうかはわかりませんが、softmax損失の場合、出力層は確率分布(つまり、合計が1)である必要がありますが、バイナリクロスエントロピー損失の場合はそうではありません。そのような単純な。 (バイナリとは、出力クラスが2つしかないことを意味するのではなく、各出力がバイナリであることを意味します。)

1
maxymoo