更新:
元のMSE実装は次のようになります。
def mean_squared_error(y_true, y_pred):
if not K.is_tensor(y_pred):
y_pred = K.constant(y_pred)
y_true = K.cast(y_true, y_pred.dtype)
return K.mean(K.square(y_pred - y_true), axis=-1)
私は正しいマキシマイザー損失関数だと思います:
def mean_squared_error_max(y_true, y_pred):
if not K.is_tensor(y_pred):
y_pred = K.constant(y_pred)
y_true = K.cast(y_true, y_pred.dtype)
return K.mean(K.square(1 / (y_pred - y_true)), axis=-1)
このようにして、MSE関数の場合と同様に、常に正の損失値を取得しますが、逆の効果があります。
更新2:
最初に書いた、最適化手法の基本概念のため、損失を単に否定するという直感的な最初の考えでは期待した結果が得られない(ここで興味深い議論を読むことができます)。特定の学習タスクで結果を直接確認するために両方の方法を二重にチェックした後(注:私は全数テストをしませんでした)、-loss
アプローチは少し速く収束しましたが、両方の方法が損失の最大化を与えたということでした。ここで説明する問題の可能性があるため、常に最適な解決策が得られるかどうかはわかりません。他の経験があれば教えてください。
だから誰か-loss
も試してみたい場合:
def mean_squared_error(y_true, y_pred):
if not K.is_tensor(y_pred):
y_pred = K.constant(y_pred)
y_true = K.cast(y_true, y_pred.dtype)
return - K.mean(K.square(y_pred - y_true), axis=-1)
追加の詳細:
OPは書いた:
私は生成的な敵対的なネットワークを持っています。そこでは、弁別器がMSEで最小化され、生成器が最大化されるはずです。どちらも反対の目標を追求する相手だからです。
イブラジルが提供するリンクから:
その間、ジェネレーターは新しい合成画像を作成し、それをディスクリミネーターに渡します。彼らは偽物であるとしても、彼らも本物とみなされることを期待してそうします。ジェネレータの目的は、通過可能な手書きの数字を生成することです。つまり、捕まることなく嘘をつくことです。弁別器の目的は、ジェネレータからの画像を偽物として識別することです。
したがって、これは不適切な問題です。
でGAN私たちの最終目標は、我々の2つのカウンターパーティ訓練する弁別し、発電機をお互いに対して可能な限り良いとして実行します。つまり、2つの基本学習アルゴリズムには異なるタスクがありますが、最適解を達成できる損失関数は同じです。つまりbinary_crossentropy
、モデルのタスクはこの損失を最小化することです。
弁別モデルのコンパイル方法:
self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)
発電機のモデルのコンパイル方法:
self.generator.compile(loss='binary_crossentropy', optimizer=optimizer)
これは、2人のランナーがゴールに到達するまでの時間を最小限に抑えて、このタスクで競争相手であっても目標を達成するのと同じです。
したがって、「反対の目標」は、反対のタスク、つまり損失を最小限に抑えること(つまり、ランナーの例では時間を最小限にすること)を意味するものではありません。
お役に立てば幸いです。