TensorFlowでクロスエントロピー損失を選択する方法は?


83

ロジスティック回帰や多項ロジスティック回帰などの分類問題は、クロスエントロピー損失を最適化します。通常、クロスエントロピー層はソフトマックス層の後に続き、確率分布を生成します。

テンソルフローには、少なくとも1ダースの異なるクロスエントロピー損失関数があります

  • tf.losses.softmax_cross_entropy
  • tf.losses.sparse_softmax_cross_entropy
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy
  • tf.nn.softmax_cross_entropy_with_logits
  • tf.nn.sigmoid_cross_entropy_with_logits
  • ..。

どちらが二項分類にのみ機能し、どれがマルチクラス問題に適していますか?sigmoid代わりにsoftmaxいつ使用する必要がありますか?sparse機能は他の機能とどのように異なり、なぜそれだけなのsoftmaxですか?

関連する(より数学指向の)議論:KerasとTensorFlowのこれらすべてのクロスエントロピー損失の違いは何ですか?


1
またtf.losses.log_loss、実際にはバイナリクロスエントロピー専用です。また、github.com
tensorflow

回答:


138

予備的事実

  • 機能的な意味では、クラスの数が2に等しい場合シグモイドはsoftmax関数の部分的なケースです。どちらも同じ操作を実行します。ロジット(以下を参照)を確率に変換します。

    単純な二項分類では、2つの間に大きな違いはありませんが、多項分類の場合、sigmoidは非排他的ラベル(別名multi-labels)を処理でき、softmaxは排他的クラスを処理します(以下を参照)。

  • ロジット(スコアも呼ばれる)は、クラスに関連付けられた生のスケールなしの値の確率を計算する前に、。ニューラルネットワークアーキテクチャの観点から、これはロジットが密な(完全に接続された)層の出力であることを意味します。

    Tensorflowの命名は少し奇妙です。以下のすべての関数は、確率はなくロジットを受け入れ、変換自体を適用します(これは単により効率的です)。

シグモイド関数ファミリー

前に述べたように、sigmoid損失関数は二項分類用です。ただし、テンソルフロー関数はより一般的であり、クラスが独立している場合はマルチラベル分類を実行できます。言い換えれば、 二項分類を一度にtf.nn.sigmoid_cross_entropy_with_logits解決しNます。

ラベルはワンホットエンコードであるか、ソフトクラスの確率を含めることができます。

tf.losses.sigmoid_cross_entropyさらに、バッチ内の重みを設定できます。つまり、いくつかの例を他の例よりも重要にすることができます。 クラスの重みtf.nn.weighted_cross_entropy_with_logitsを設定できます (分類はバイナリであることを忘れないでください)。つまり、正のエラーを負のエラーよりも大きくします。これは、トレーニングデータのバランスが取れていない場合に役立ちます。

Softmax関数ファミリー

これらの損失関数は、多項相互に排他的な分類、つまりNクラスから1つを選択するために使用する必要があります。の場合にも適用されN = 2ます。

ラベルはワンホットエンコードであるか、ソフトクラスの確率を含めることができます。特定の例は、50%の確率でクラスAに属し、50%の確率でクラスBに属することができます。厳密に言えば、それが両方のクラスに属することを意味するわけではありませんが、この方法で確率を解釈できることに注意してください。

sigmoid家族の場合と同じように、バッチ内の重みtf.losses.softmax_cross_entropyを設定できます。つまり、いくつかの例を他の例よりも重要にすることができます。私の知る限り、tensorflow 1.3の時点では、クラスの重みを設定する組み込みの方法はありません。

[UPD] tensorflow 1.5では、v2バージョンが導入され、元のsoftmax_cross_entropy_with_logits損失は​​非推奨になりました。それらの唯一の違いは、新しいバージョンでは、バックプロパゲーションがロジットとラベルの両方で発生することです(これが役立つ理由について説明します)。

スパース関数ファミリー

softmax上記の通常のように、これらの損失関数は、多項相互に排他的な分類、つまりNクラスから1つを選択するために使用する必要があります。違いはラベルのエンコードにあります。クラスはワンホットベクトルではなく整数(クラスインデックス)として指定されます。明らかに、これではソフトクラスは許可されませんが、クラスが数千または数百万ある場合はメモリを節約できます。ただし、logits引数にはクラスごとにロジットが含まれている必要があるため、少なくとも[batch_size, classes]メモリを消費することに注意してください。

上記のように、tf.lossesversionには、weightsバッチ内の重みを設定できる引数があります。

サンプリングされたソフトマックス関数ファミリー

これらの関数は、膨大な数のクラスを処理するための別の代替手段を提供します。正確な確率分布を計算して比較する代わりに、ランダムサンプルから損失推定値を計算します。

引数weightsbiasesは、選択したサンプルのロジットを計算するために使用される、完全に接続された個別のレイヤーを指定します。

上記のように、labelsワンホットエンコードされていませんが、形状があり[batch_size, num_true]ます。

サンプリングされた関数は、トレーニングにのみ適しています。テスト時softmaxには、実際の分布を取得するために、標準の損失(スパースまたはワンホット)を使用することをお勧めします。

もう1つの代替損失はtf.nn.nce_lossノイズ対比推定を実行するです(興味がある場合は、この非常に詳細な説明を参照してください)。NCEは制限内でソフトマックスへの近似を保証するため、この関数をソフトマックスファミリーに含めました。


シグモイドクロスエントロピー(sigCE)に関する説明をお願いできますか?N二項分類タスクを一度に解決する場合N = prod(output.shape)、たとえばshape = [batch, examples, channels]; N = (batch * examples * channels)tf.losses「ロジット」(ネットワークの出力)を期待する場合、使いやすさのために確率も返す必要がありますか?あなたは多分stackoverflow.com/questions/53612973/を
SumNeuron 2018

5

ただし、バージョン1.5の場合softmax_cross_entropy_with_logits_v2は、代わりに引数を使用する必要があります。argument key=...たとえば、

softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,
                                    logits=my_prediction, dim=-1, name=None)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.