ソースコードは借りたものですが、Experience Replay用のBufferが十分に埋まるまでEpsilon値を削らないようにアレンジしましたら元のコードより20エピソード早く終了できました。
ソースはこちらです:https://github.com/nyck33/reinforcement-learning/blob/master/2-cartpole/1-dqn/cartpole_dqn.py
学習率をグラフにしたらこんな感じでした。
DQNはOff-Policyですが、上記ソースコードにてModelとTarget_Modelがありますが、Target_Modelはエピソードが終了した時点で更新することによって目標がエピソード中に固定されているのでModelの更新がより確実的・効率的に実施されます。
Off-policyですとEpsilon-greedyにてActionを選択しますが、目標の更新はGreedy Policyを活用します。
次はVPG(Vanilla Policy Gradient及びREINFORCE)ですが、こちらは800エピソード以上かかりました。
VPGはエピソードが終了するまでパラメータを更新できませんので、ここがネックだと思います。借りたソースコードではRewardをMeanとStdにてNormalizeしてます:
#discount the rewards array and reversed
discounted_rewards = self.discount_rewards(self.rewards)
#minus mean so here disc_rewards is somewhat = advantage
#print("\nnp.mean(discounted_rewards)\n{}\n".format(np.mean(discounted_rewards)))
discounted_rewards -= np.mean(discounted_rewards) #minus the mean
#print("\nminus mean disc rewards \n {} \n".format(discounted_rewards))
#std = sqrt(mean(abs(x - x.mean())**2)). rewards are multiple of std. dev.
discounted_rewards /= np.std(discounted_rewards)
しかし、TD ErrorがAdvantageをEstimateするのに十分らしいのでDQNのソースコードからTD errorの計算する部分を借りてVPGにコピペしてみます。多分ここがネックっぽいです。
後、Cartpoleの場合、[良いエピソード」、[悪いエピソード」の判定をどうすれば分かりません。Previous 10のTotal RewardのMeanより高ければ現エピソードは「良い」として+1AdvantageをLabelとして学習させることも考えましたが、両方トライしてみます。
0 件のコメント:
コメントを投稿