停滞そのものの原因がどこにあるか、コードもデータもないので、その停滞が妥当な値なのか、ネットワークに問題があるのかわかりませんが、損失関数が気になります。
損失関数に1-ダイス係数(F値の名称の方が一般的?)を使用するとのことですが、これはつまり、ダイス係数を最大化しようとしているということですよね?
ダイス係数はRecallとPrecisionから求まります。
さらに、Recall,Precisionは、クラス分類の正解数と不正解数から求まります。
ここで、一般にDeeplearningにおける出力値は0~1の範囲(活性化関数によって異なる)で出力され、その値を閾値をもって、正クラスか、負クラスかを分類します。
このとき、損失関数をRecallとPrecisionから求めるダイス係数を使用してしまうと、例えば、出力値の閾値を0.5、正解クラスが正クラス(出力値0.5以上)とした場合、出力値が0で負クラスと分類した場合でも、出力値が0.499でも、損失関数は同じ値(不正解扱い)となります。
なぜなら、損失関数は正解数と不正解数でのみ、求めているからです。
確かに、モデルが正解を出力すればよいので、これで良いように思えますが、出力値0.499の場合と、出力値0の場合とでは、不正解度合いが異なります。
0.499の場合であれば、いわば惜しい状態なので、もう少し
学習すれば正解にたどり着けるわけです。
損失関数をダイス係数にした場合、このもう少し
かどうかというのが、一切分からなくなってしまうわけです。
そこで、損失関数は正解ラベル(0または1)に対する出力値(0~1)の値によるクロスエントロピー誤差や二乗平均誤差を使うのが一般的です。
これらは、正解ラベルに対して、0~1の値をもつ出力値から求まるので、出力値によって損失を変えることができるのです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/11 00:30
2019/10/11 01:37