web-dev-qa-db-ja.com

Softmaxによるバイナリ分類

私は、約98%の良好な精度を提供するバイナリ交差エントロピーでシグモイドアクティベーション関数を使用してバイナリ分類器をトレーニングしています。
同じことを、categorical_crossentropyでsoftmaxを使用してトレーニングすると、精度が非常に低くなります(<40%)。
binary_crossentropyのターゲットを0と1のリストとして渡しています。たとえば、 [0,1,1,1,0]。

なぜこれが起こっているのでしょうか?

これは私が2番目の分類子に使用しているモデルです: enter image description here

現在、2番目のモデルは1つのクラス(最後のレイヤーの出力数)からのみ選択できるため、常に「クラス0」と応答します。

2つのクラスがあるため、最も可能性の高いものを選択するには、2つの出力でsoftmax + categorical_crossentropyを計算する必要があります。

したがって、最後のレイヤーは次のようになります。

model.add(Dense(2, activation='softmax')
model.compile(...)

Sigmoid + binary_crossentropyモデルは、単一の出力数だけを分析して「クラス0」がTrueになる確率を計算しますが、これはすでに正しいことです。

[〜#〜] edit [〜#〜]Sigmoid 関数について簡単に説明します

シグモイドは、実数空間と確率空間の間のマッピングと見なすことができます。

Sigmoid Function

次のことに注意してください。

Sigmoid(-infinity) = 0   
Sigmoid(0) = 0.5   
Sigmoid(+infinity) = 1   

したがって、ネットワークの出力である実数が非常に低い場合、シグモイドは「クラス0」が0に近い確率を決定し、「クラス1」を決定します。
逆に、ネットワークの出力が非常に高い場合、シグモイドは「クラス0」が1に近い確率を決定し、「クラス0」を決定します。

その決定は、出力のサインを見るだけでクラスを決定することに似ています。ただし、これではモデルは学習できません!実際、このバイナリ損失の勾配はどこでもnullであり、適切に定量化されていないため、モデルがエラーから学習することは不可能です。

そのため、シグモイドと「binary_crossentropy」が使用されます。
これらはバイナリ損失の代理であり、ニースの滑らかな特性を持ち、学習を可能にします。

また、 Softmax Function および Cross Entropy に関する詳細情報もご覧ください。

20
Yohan Grember