予備的事実
機能的な意味では、クラスの数が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.losses
versionには、weights
バッチ内の重みを設定できる引数があります。
サンプリングされたソフトマックス関数ファミリー
これらの関数は、膨大な数のクラスを処理するための別の代替手段を提供します。正確な確率分布を計算して比較する代わりに、ランダムサンプルから損失推定値を計算します。
引数weights
とbiases
は、選択したサンプルのロジットを計算するために使用される、完全に接続された個別のレイヤーを指定します。
上記のように、labels
ワンホットエンコードされていませんが、形状があり[batch_size, num_true]
ます。
サンプリングされた関数は、トレーニングにのみ適しています。テスト時softmax
には、実際の分布を取得するために、標準の損失(スパースまたはワンホット)を使用することをお勧めします。
もう1つの代替損失はtf.nn.nce_loss
、ノイズ対比推定を実行するです(興味がある場合は、この非常に詳細な説明を参照してください)。NCEは制限内でソフトマックスへの近似を保証するため、この関数をソフトマックスファミリーに含めました。
tf.losses.log_loss
、実際にはバイナリクロスエントロピー専用です。また、github.com