質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Q&A

解決済

1回答

463閲覧

Keras-rlでDQNを実装したいのですが・・・

Hayato1201

総合スコア220

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

0グッド

1クリップ

投稿2018/03/06 05:45

編集2018/03/06 11:34

https://qiita.com/inoory/items/e63ade6f21766c7c2393

以上のサイトに沿ってDQNを試そうと思って行なっています。
学習の部分はできている様ですが、その描画の部分で、

Testing for 10 episodes ...
Episode 1: reward: 0.972, steps: 17
Episode 2: reward: 0.975, steps: 16
Episode 3: reward: 0.832, steps: 44
Episode 4: reward: 0.973, steps: 17
Episode 5: reward: 0.799, steps: 51
Episode 6: reward: 1.000, steps: 1
Episode 7: reward: 0.704, steps: 56
Episode 8: reward: 0.846, steps: 45
Episode 9: reward: 0.667, steps: 63
Episode 10: reward: 0.944, steps: 29

この様に表示されるはずが途中で止まってしまいます。これは何が原因でしょうか?このサイトに沿って全てコードを書いています。ただ、def _stepはdef stepに、def _resetは、def resetにしないと動かなかったのでそこだけ変更しました。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

git clone https://github.com/matthiasplappert/keras-rl.git pip install ./keras-rl

だとmasterブランチをインストールしてしまうので、git tagで適切なバージョンをチェックアウトしてからインストールするほうが安心です。

途中で止まってしまうというのは、例えばEpisode 6: reward: 1.000, steps: 1で止まってしまうということでしょうか?
また、止まって実行が終了するのでしょうか。
それとも終了せずに止まったままでしょうか。
それにともなって何かのエラーは出力はないでしょうか。


追記

手元で試しましたが、
def _stepはdef stepに、def _resetは、def reset
だけで期待どおりに動きました。

tensorflow==1.6.0
Keras==2.1.4
keras-rl==0.4.0
gym==0.10.3

jupyter notebookを使っていないのなら
%matplotlib inline
をコメントアウトして、
最後の行に、
plt.show()
を追加する必要があります。

投稿2018/03/06 06:13

編集2018/03/06 06:21
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hayato1201

2018/03/06 09:42

回答ありがとうございます! 上記のものは全て同じバージョンです。しかし、Episode 1: reward: 0.891, steps: 37で止まって終了せず止まったままです。何がいけないのでしょうか。。。
mkgrei

2018/03/06 10:27

学習は最後までやっていますか?
mkgrei

2018/03/06 10:43

というのも、この最後の評価のステップ、ちゃんと学習していないと終了条件を満たせず、エピソードが終わりません。 それを回避するには、dqn.testの引数に例えば nb_max_episode_steps=1000 を追加する必要があります。
Hayato1201

2018/03/06 11:29

ありがとうございます!nb_max_episode_steps=1000を追加してできました! しかし、なぜエピソードが終了しなかったのでしょう?位置と速度の絶対値が十分小さくなったらepisodeは終了となっていますよね?テストの際に1000ステップ以上かけても原点に来ないものがありそれの処理がなかなか終わらないからそこで止まってしまっていたという事ですか?
mkgrei

2018/03/06 11:34

おっしゃるとおりです。 done = abs(self._pos) < 0.1 and abs(self._vel) < 0.1 が終了条件なので、例えば、self._pos=1でself._vel=0になってしまって、かつ学習が正しく行われていないと、そこから動くことはなくなり、永遠エピソードが続くことになります。
Hayato1201

2018/03/06 11:36

ちなみに以上に追加したのが表示できた画像ですが、これをみるどれも原点に近づいている様に見えますが、なぜ終了しなかったのでしょか??
mkgrei

2018/03/06 11:52

モデルを保存して再現していますか? そうでないのであれば、学習がうまく行った可能性がありますし、10回しかテストしていないので、引いてきた乱数がよかった可能性があります。 Episode 1: reward: 0.972, steps: 17 この出力の最後にエピソードのステップ数があります。 ステップ数が1000まで行っていると、最後まで終了条件を満たしていないことになります。 9本しか線が書かれておりませんが、どれか2つが重なっているのでしょうか。 終了しなかった場合に、コールバックのon_step_end(self, step, logs)が呼ばれなかった可能性もあります。
Hayato1201

2018/03/06 11:57

Episode 1: reward: 0.957, steps: 25 Episode 2: reward: 1.000, steps: 1 Episode 3: reward: 0.801, steps: 48 Episode 4: reward: 0.830, steps: 42 Episode 5: reward: 0.679, steps: 58 Episode 6: reward: 0.925, steps: 30 Episode 7: reward: 0.981, steps: 14 Episode 8: reward: 0.849, steps: 42 Episode 9: reward: 0.863, steps: 40 Episode 10: reward: 0.928, steps: 31 以上の様になっていました。ステップが1で終わっているものがあるためそれが見えない、という事ですかね?
Hayato1201

2018/03/06 12:02

Episode 1: reward: 0.862, steps: 43 Episode 2: reward: 1.000, steps: 1 Episode 3: reward: 0.880, steps: 39 Episode 4: reward: 0.886, steps: 36 Episode 5: reward: 0.993, steps: 7 Episode 6: reward: 0.754, steps: 55 Episode 7: reward: 1.000, steps: 1 Episode 8: reward: 1.000, steps: 1 Episode 9: reward: 0.767, steps: 55 Episode 10: reward: 0.688, steps: 58 さらに以上の様になったときは三本線が表示されていませんでした。
mkgrei

2018/03/06 12:10

>ステップが1で終わっているものがあるためそれが見えない のようです。 上記のログを見る限り、どのエピソードも100ステップ以内で終わっていますね。
Hayato1201

2018/03/06 12:26

何度も申し訳ありません、、、ではどうしてnb_max_episode_steps=1000無しだと止まってしまっていたのでしょうか?またkeras-rlについてまだあまり詳しく無いもので、申し訳有りませんがDQNAgentの引数であるnb_steps_warmup=100やtarget_model_update=1e-2がどういったものであるかという事もついでに教えて頂くことは可能でしょうか??
Hayato1201

2018/03/06 12:28

またSequentialMemoryもexperience replay用のmemoryとの事ですがよく分かりません。。。検索した所、どういったものか解説しているところも見当たりませんでした。何度もすみませんが、こちらもご存知でしょうか?
mkgrei

2018/03/06 14:20

うまく学習できなかったりすると止まってしまうといいますか、無限ループに陥っている状態になります。 初期値を可動領域の端にピンポイントに選んでいることが考えられます。 また、意図的に学習不十分なケースを誘発するために、学習回数を落とすことが考えられます。 例えば、 history = dqn.fit(env, nb_steps=10000, visualize=False, verbose=2, nb_max_episode_steps=300) 50000ステップではなく、10000ステップで打ち切ると、うまく学習ができず、無限回ステップを刻んでも終了条件を満たせないことがあります。 nb_steps_warmupは始めの100ステップは場所を少しだけ移動し、速度をランダムに発生するためだけに使い、強化学習の学習には使わないことを意味します。 これは_reset()において、速度も乱数で生成していることに相当します。(今はゼロ初期化固定。) 速度の分布が少しだけリアルになります。 https://github.com/matthiasplappert/keras-rl/blob/master/rl/agents/dqn.py#L253 target_model_updateはちょっと複雑です。 https://github.com/matthiasplappert/keras-rl/blob/master/rl/agents/dqn.py#L28 まず0以上である必要があります。 また1より小さい場合、(1 - target_model_update) * old + target_model_update * newで更新します。 https://github.com/matthiasplappert/keras-rl/blob/master/rl/agents/dqn.py#L176 また1以上である場合、モデルをまるごと置き換えます。 https://github.com/matthiasplappert/keras-rl/blob/master/rl/agents/dqn.py#L222 もしかしたらTDとTD(lambda)と関連があるかもしれませんが、ニューラルネットワークが途中に挟まっているので、ぱっと読んですぐにはわかりませんでした。DQNの論文を直接読む必要がありそうです。 http://www.jnns.org/previous/niss/2000/text/koike2.pdf SequentialMemoryは学習途中各ステップのactions、rewards、terminals、observationsを記録します。 https://github.com/matthiasplappert/keras-rl/blob/master/rl/memory.py#L115 記録にはdequeではなく独自のRingBufferというものを使っています。 https://github.com/matthiasplappert/keras-rl/blob/master/rl/memory.py#L35 limitを超えるステップを刻むと自動的に初めの方に戻って上書きしていきます。 例えば、 memory.actions.data で中身にアクセスできます。 どこにも解説サイトがありませんので、ソースコードを直接読んだほうがはやくてわかりやすいです。 解説サイトが陳腐化することを考えると、やはり読んだほうがはやいです。 有名な話かもしれませんがScikit-learnのカーネルリッジ回帰のあるパラメータの説明が間違っています。 信じてしまいますと、論文の結果を再現できなくて困ります。 ありがたいことにpythonはほとんどの場合ソースコードが読めます。 ソースコード通りに実行するので偽りはありません。
mkgrei

2018/03/06 14:21

すごく長くなってしまって申し訳ないですが、該当するソースコードへのリンクが間に挟まっています。
Hayato1201

2018/03/06 23:25

こんなにたくさん回答していただき大変助かります!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問