ケラスモデルのMSEを最大化する


11

私は生成的な敵対的なネットワークを持っています。そこでは、弁別器がMSEで最小化され、生成器が最大化されるはずです。どちらも反対の目標を追求する相手だからです。

generator = Sequential()
generator.add(Dense(units=50, activation='sigmoid', input_shape=(15,)))
generator.add(Dense(units=1, activation='sigmoid'))
generator.compile(loss='mse', optimizer='adam')

generator.train_on_batch(x_data, y_data)

高いMSE値から利益を得るジェネレータモデルを取得するには、何を適応させる必要がありますか?


1
どうしてそんなことしたいの?これは不適切な問題です。MSEを最大化するには、予測を基になるデータ型の境界に到達させる必要があります。しかし、本当にそうしたいのであれば、オプティマイザに負の学習率を提供することでおそらくうまくいくはずです。または、MSEの逆関数を損失関数として使用します。
a_guest

1
私は生成的な敵対的なネットワークを持っています。そこでは、弁別器がMSEで最小化され、生成器が最大化されるはずです。どちらも反対の目標を追求する相手だからです。
Emma

質問はかなり誤解を招くものでした。わかりやすく更新してください。
Geeocode

@Geeocode、ありがとうございます。マルコからの負の符号の解は正しいと思いますか?
Emma

私の更新を数分で参照してください
Geeocode

回答:


5

更新:

元の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人のランナーがゴールに到達するまでの時間を最小限に抑えて、このタスクで競争相手であっても目標を達成するのと同じです。

したがって、「反対の目標」は、反対のタスク、つまり損失を最小限に抑えること(つまり、ランナーの例では時間を最小限にすること)を意味するものではありません。

お役に立てば幸いです。


5

その質問は私にはあまり明確ではありません。MSEの基準を使用しながら、最小化ではなく最大化する必要があると思います。

-MSEを計算する独自のカスタム損失関数を実装できます。損失の符号を反転することで、勾配降下方向の反転を実現します。

def negative_mse(y,yhat): 
    return - K.mean(K.sum(K.square(y-yhat)))

model.compile(loss=negative_mse, optimizer='adam')

別のオプションは、単に否定的な学習ステップを提供することです-しかし、Kerasがこれを行うことができるかどうかはわかりません。試すだけの価値があります。


関数のマイナス記号を忘れましたか?
Emma

確かに私は持っています。ちょうど答えを編集しました。
Mano
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.