2019年1月12日土曜日

深層強化学習(Deep RL)のDQNとVPGをOpenaiのCartpole-V1にて比較

Deep Q Networkを改善してCartpole-V1を140エピソードで攻略しました(最寄りのスコア10個の平均値が500を達成した時点で終了)。

ソースコードは借りたものですが、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 件のコメント:

コメントを投稿

My Github repo

In case anyone is interested:   https://github.com/nyck33