モデルをトレーニングしているとき、次のセグメントがあります。
s_t_batch, a_batch, y_batch = train_data(minibatch, model2)
# perform gradient step
loss.append(model.train_on_batch([s_t_batch, a_batch], y_batch))
wheres_t, a_
は、現在の状態と、それらの状態で実行されたアクションにそれぞれ対応します。の出力があり、その状態で実行されたアクションの値のみを出力することを除いてmodel2
、 と同じです。model
model2
num_actions
model
私が奇妙だと思うのは(そして実際にこの質問の焦点です)、train_data
私が持っている関数にあります:
y_batch = r_batch + GAMMA * np.max(model.predict(s_t_batch), axis=1)
奇妙な部分は、モデルを使用してモデルを生成し、y_batch
トレーニングしているという事実です。これはある種の自己充足的予言になりませんか?私の理解が正しければ、モデルは予想される最大報酬を予測しようとします。同じモデルを使って試して生成y_batch
するということは、それが真のモデルであることを意味していますね。
問題は、1.同じモデルを使用して y_batch を生成し、それらをトレーニングすることの背後にある直感は何ですか。2. (オプション) 損失値は何かを意味しますか。プロットすると、収束していないように見えますが、報酬の合計は増加しているように見えます (下のリンクのプロットを参照)。
完全なコードはここにあります。これは、CartPole-v0 問題での Deep Q Learning の実装です。
他のフォーラムからのコメント:
- y = r + gamma*np.max(model.predict(s_t_batch), axis=1) は完全に自然であり、y は真のステート アクション値に収束します。そして、経験のリプレイ(またはより優先度の高い経験のリプレイ)のようなものとの連続した更新間の相関関係を打破しないと、モデルは発散します。また、DDQN、Dueling Network などの優れたバリアントもあり、より優れたパフォーマンスを発揮します。
- y_batch には報酬が含まれます。ターゲット ネットワークとオンライン ネットワークはどちらも推定値です。DQN の価値関数は過度に楽観的であるため、これは確かにある程度自己実現的な予言です。そのため、数か月後に Double DQN が追加されました。
- y は収束しますが、必ずしも真の (最適という意味だと思います) ステート アクション値に収束するとは限りません。収束した値が最適値であることは誰も証明していませんが、これは私たちが持っている最良の近似値です。ただし、十分に単純な問題 (例: grid-world) の真の値に収束します。