私は、約98%の良好な精度を提供するバイナリ交差エントロピーでシグモイドアクティベーション関数を使用してバイナリ分類器をトレーニングしています。
同じことを、categorical_crossentropyでsoftmaxを使用してトレーニングすると、精度が非常に低くなります(<40%)。
binary_crossentropyのターゲットを0と1のリストとして渡しています。たとえば、 [0,1,1,1,0]。
なぜこれが起こっているのでしょうか?
現在、2番目のモデルは1つのクラス(最後のレイヤーの出力数)からのみ選択できるため、常に「クラス0」と応答します。
2つのクラスがあるため、最も可能性の高いものを選択するには、2つの出力でsoftmax + categorical_crossentropyを計算する必要があります。
したがって、最後のレイヤーは次のようになります。
model.add(Dense(2, activation='softmax')
model.compile(...)
Sigmoid + binary_crossentropyモデルは、単一の出力数だけを分析して「クラス0」がTrueになる確率を計算しますが、これはすでに正しいことです。
[〜#〜] edit [〜#〜]: Sigmoid 関数について簡単に説明します
シグモイドは、実数空間と確率空間の間のマッピングと見なすことができます。
次のことに注意してください。
Sigmoid(-infinity) = 0
Sigmoid(0) = 0.5
Sigmoid(+infinity) = 1
したがって、ネットワークの出力である実数が非常に低い場合、シグモイドは「クラス0」が0に近い確率を決定し、「クラス1」を決定します。
逆に、ネットワークの出力が非常に高い場合、シグモイドは「クラス0」が1に近い確率を決定し、「クラス0」を決定します。
その決定は、出力のサインを見るだけでクラスを決定することに似ています。ただし、これではモデルは学習できません!実際、このバイナリ損失の勾配はどこでもnullであり、適切に定量化されていないため、モデルがエラーから学習することは不可能です。
そのため、シグモイドと「binary_crossentropy」が使用されます。
これらはバイナリ損失の代理であり、ニースの滑らかな特性を持ち、学習を可能にします。
また、 Softmax Function および Cross Entropy に関する詳細情報もご覧ください。